// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/ozone/common/display_snapshot_proxy.h"

#include "ui/ozone/common/display_mode_proxy.h"
#include "ui/ozone/common/gpu/ozone_gpu_message_params.h"

namespace ui {

namespace {

bool SameModes(const DisplayMode_Params& lhs, const DisplayMode_Params& rhs) {
  return lhs.size == rhs.size && lhs.is_interlaced == rhs.is_interlaced &&
         lhs.refresh_rate == rhs.refresh_rate;
}

}  // namespace

DisplaySnapshotProxy::DisplaySnapshotProxy(const DisplaySnapshot_Params& params)
    : DisplaySnapshot(params.display_id,
                      params.has_proper_display_id,
                      params.origin,
                      params.physical_size,
                      params.type,
                      params.is_aspect_preserving_scaling,
                      params.has_overscan,
                      params.display_name,
                      std::vector<const DisplayMode*>(),
                      NULL,
                      NULL),
      string_representation_(params.string_representation) {
  for (size_t i = 0; i < params.modes.size(); ++i) {
    modes_.push_back(new DisplayModeProxy(params.modes[i]));

    if (params.has_current_mode &&
        SameModes(params.modes[i], params.current_mode))
      current_mode_ = modes_.back();

    if (params.has_native_mode &&
        SameModes(params.modes[i], params.native_mode))
      native_mode_ = modes_.back();
  }
}

DisplaySnapshotProxy::~DisplaySnapshotProxy() {
}

std::string DisplaySnapshotProxy::ToString() const {
  return string_representation_;
}

}  // namespace ui
