// Copyright (c) 2012 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 "ppapi/cpp/view.h"

#include "ppapi/c/ppb_view.h"
#include "ppapi/cpp/module_impl.h"

namespace pp {

namespace {

template <> const char* interface_name<PPB_View_1_0>() {
  return PPB_VIEW_INTERFACE_1_0;
}

template <> const char* interface_name<PPB_View_1_1>() {
  return PPB_VIEW_INTERFACE_1_1;
}

}  // namespace

View::View() : Resource() {
}

View::View(PP_Resource view_resource) : Resource(view_resource) {
}

Rect View::GetRect() const {
  PP_Rect out;
  if (has_interface<PPB_View_1_1>()) {
    if (PP_ToBool(get_interface<PPB_View_1_1>()->GetRect(pp_resource(), &out)))
      return Rect(out);
  } else if (has_interface<PPB_View_1_0>()) {
    if (PP_ToBool(get_interface<PPB_View_1_0>()->GetRect(pp_resource(), &out)))
      return Rect(out);
  }
  return Rect();
}

bool View::IsFullscreen() const {
  if (has_interface<PPB_View_1_1>()) {
    return PP_ToBool(get_interface<PPB_View_1_1>()->IsFullscreen(
        pp_resource()));
  } else if (has_interface<PPB_View_1_0>()) {
    return PP_ToBool(get_interface<PPB_View_1_0>()->IsFullscreen(
        pp_resource()));
  }
  return false;
}

bool View::IsVisible() const {
  if (has_interface<PPB_View_1_1>())
    return PP_ToBool(get_interface<PPB_View_1_1>()->IsVisible(pp_resource()));
  else if (has_interface<PPB_View_1_0>())
    return PP_ToBool(get_interface<PPB_View_1_0>()->IsVisible(pp_resource()));
  return false;
}

bool View::IsPageVisible() const {
  if (has_interface<PPB_View_1_1>()) {
    return PP_ToBool(get_interface<PPB_View_1_1>()->IsPageVisible(
        pp_resource()));
  } else if (has_interface<PPB_View_1_0>()) {
    return PP_ToBool(get_interface<PPB_View_1_0>()->IsPageVisible(
        pp_resource()));
  }
  return true;
}

Rect View::GetClipRect() const {
  PP_Rect out;
  if (has_interface<PPB_View_1_1>()) {
    if (PP_ToBool(get_interface<PPB_View_1_1>()->GetClipRect(pp_resource(),
                                                             &out)))
      return Rect(out);
  } else if (has_interface<PPB_View_1_0>()) {
    if (PP_ToBool(get_interface<PPB_View_1_0>()->GetClipRect(pp_resource(),
                                                             &out)))
      return Rect(out);
  }
  return Rect();
}

float View::GetDeviceScale() const {
  if (has_interface<PPB_View_1_1>())
    return get_interface<PPB_View_1_1>()->GetDeviceScale(pp_resource());
  return 1.0f;
}

float View::GetCSSScale() const {
  if (has_interface<PPB_View_1_1>())
    return get_interface<PPB_View_1_1>()->GetCSSScale(pp_resource());
  return 1.0f;
}

}  // namespace pp
