// 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/gfx/geometry/dip_util.h"

#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/point_conversions.h"
#include "ui/gfx/geometry/point_f.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/rect_conversions.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/geometry/size_conversions.h"

namespace gfx {

Insets ConvertInsetsToDIP(float scale_factor,
                          const gfx::Insets& insets_in_pixel) {
  if (scale_factor == 1.f)
    return insets_in_pixel;
  return insets_in_pixel.Scale(1.f / scale_factor);
}

Point ConvertPointToDIP(float scale_factor, const Point& point_in_pixel) {
  if (scale_factor == 1.f)
    return point_in_pixel;
  return ScaleToFlooredPoint(point_in_pixel, 1.f / scale_factor);
}

PointF ConvertPointToDIP(float scale_factor, const PointF& point_in_pixel) {
  if (scale_factor == 1.f)
    return point_in_pixel;
  return ScalePoint(point_in_pixel, 1.f / scale_factor);
}

Size ConvertSizeToDIP(float scale_factor, const Size& size_in_pixel) {
  if (scale_factor == 1.f)
    return size_in_pixel;
  return ScaleToFlooredSize(size_in_pixel, 1.f / scale_factor);
}

Rect ConvertRectToDIP(float scale_factor, const Rect& rect_in_pixel) {
  if (scale_factor == 1.f)
    return rect_in_pixel;
  return ToFlooredRectDeprecated(
      ScaleRect(RectF(rect_in_pixel), 1.f / scale_factor));
}

Insets ConvertInsetsToPixel(float scale_factor,
                            const gfx::Insets& insets_in_dip) {
  if (scale_factor == 1.f)
    return insets_in_dip;
  return insets_in_dip.Scale(scale_factor);
}

Point ConvertPointToPixel(float scale_factor, const Point& point_in_dip) {
  if (scale_factor == 1.f)
    return point_in_dip;
  return ScaleToFlooredPoint(point_in_dip, scale_factor);
}

PointF ConvertPointToPixel(float scale_factor, const PointF& point_in_dip) {
  if (scale_factor == 1.f)
    return point_in_dip;
  return ScalePoint(point_in_dip, scale_factor);
}

Size ConvertSizeToPixel(float scale_factor, const Size& size_in_dip) {
  if (scale_factor == 1.f)
    return size_in_dip;
  return ScaleToFlooredSize(size_in_dip, scale_factor);
}

Rect ConvertRectToPixel(float scale_factor, const Rect& rect_in_dip) {
  // Use ToEnclosingRect() to ensure we paint all the possible pixels
  // touched. ToEnclosingRect() floors the origin, and ceils the max
  // coordinate. To do otherwise (such as flooring the size) potentially
  // results in rounding down and not drawing all the pixels that are
  // touched.
  if (scale_factor == 1.f)
    return rect_in_dip;
  return ToEnclosingRect(
      RectF(ScalePoint(gfx::PointF(rect_in_dip.origin()), scale_factor),
            ScaleSize(gfx::SizeF(rect_in_dip.size()), scale_factor)));
}

}  // namespace gfx
