From 5f8de423f190bbb79a62f804151bc24824fa32d8 Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Fri, 2 Feb 2018 04:16:08 -0500 Subject: Add m-esr52 at 52.6.0 --- layout/base/Units.h | 654 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 654 insertions(+) create mode 100644 layout/base/Units.h (limited to 'layout/base/Units.h') diff --git a/layout/base/Units.h b/layout/base/Units.h new file mode 100644 index 000000000..199a91902 --- /dev/null +++ b/layout/base/Units.h @@ -0,0 +1,654 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef MOZ_UNITS_H_ +#define MOZ_UNITS_H_ + +#include "mozilla/gfx/Coord.h" +#include "mozilla/gfx/Matrix.h" +#include "mozilla/gfx/Point.h" +#include "mozilla/gfx/Rect.h" +#include "mozilla/gfx/ScaleFactor.h" +#include "mozilla/gfx/ScaleFactors2D.h" +#include "nsMargin.h" +#include "nsRect.h" +#include "nsRegion.h" +#include "mozilla/AppUnits.h" +#include "mozilla/TypeTraits.h" + +namespace mozilla { + +template +struct IsPixel : FalseType {}; + +// See struct declaration for a description of each unit type. +struct CSSPixel; +struct LayoutDevicePixel; +struct LayerPixel; +struct CSSTransformedLayerPixel; +struct RenderTargetPixel; +struct ScreenPixel; +struct ParentLayerPixel; +struct DesktopPixel; + +template<> struct IsPixel : TrueType {}; +template<> struct IsPixel : TrueType {}; +template<> struct IsPixel : TrueType {}; +template<> struct IsPixel : TrueType {}; +template<> struct IsPixel : TrueType {}; +template<> struct IsPixel : TrueType {}; +template<> struct IsPixel : TrueType {}; +template<> struct IsPixel : TrueType {}; + +typedef gfx::CoordTyped CSSCoord; +typedef gfx::IntCoordTyped CSSIntCoord; +typedef gfx::PointTyped CSSPoint; +typedef gfx::IntPointTyped CSSIntPoint; +typedef gfx::SizeTyped CSSSize; +typedef gfx::IntSizeTyped CSSIntSize; +typedef gfx::RectTyped CSSRect; +typedef gfx::IntRectTyped CSSIntRect; +typedef gfx::MarginTyped CSSMargin; +typedef gfx::IntMarginTyped CSSIntMargin; +typedef gfx::IntRegionTyped CSSIntRegion; + +typedef gfx::CoordTyped LayoutDeviceCoord; +typedef gfx::IntCoordTyped LayoutDeviceIntCoord; +typedef gfx::PointTyped LayoutDevicePoint; +typedef gfx::IntPointTyped LayoutDeviceIntPoint; +typedef gfx::SizeTyped LayoutDeviceSize; +typedef gfx::IntSizeTyped LayoutDeviceIntSize; +typedef gfx::RectTyped LayoutDeviceRect; +typedef gfx::IntRectTyped LayoutDeviceIntRect; +typedef gfx::MarginTyped LayoutDeviceMargin; +typedef gfx::IntMarginTyped LayoutDeviceIntMargin; +typedef gfx::IntRegionTyped LayoutDeviceIntRegion; + +typedef gfx::CoordTyped LayerCoord; +typedef gfx::IntCoordTyped LayerIntCoord; +typedef gfx::PointTyped LayerPoint; +typedef gfx::IntPointTyped LayerIntPoint; +typedef gfx::SizeTyped LayerSize; +typedef gfx::IntSizeTyped LayerIntSize; +typedef gfx::RectTyped LayerRect; +typedef gfx::IntRectTyped LayerIntRect; +typedef gfx::MarginTyped LayerMargin; +typedef gfx::IntMarginTyped LayerIntMargin; +typedef gfx::IntRegionTyped LayerIntRegion; + +typedef gfx::CoordTyped CSSTransformedLayerCoord; +typedef gfx::IntCoordTyped CSSTransformedLayerIntCoord; +typedef gfx::PointTyped CSSTransformedLayerPoint; +typedef gfx::IntPointTyped CSSTransformedLayerIntPoint; +typedef gfx::SizeTyped CSSTransformedLayerSize; +typedef gfx::IntSizeTyped CSSTransformedLayerIntSize; +typedef gfx::RectTyped CSSTransformedLayerRect; +typedef gfx::IntRectTyped CSSTransformedLayerIntRect; +typedef gfx::MarginTyped CSSTransformedLayerMargin; +typedef gfx::IntMarginTyped CSSTransformedLayerIntMargin; +typedef gfx::IntRegionTyped CSSTransformedLayerIntRegion; + +typedef gfx::PointTyped RenderTargetPoint; +typedef gfx::IntPointTyped RenderTargetIntPoint; +typedef gfx::SizeTyped RenderTargetSize; +typedef gfx::IntSizeTyped RenderTargetIntSize; +typedef gfx::RectTyped RenderTargetRect; +typedef gfx::IntRectTyped RenderTargetIntRect; +typedef gfx::MarginTyped RenderTargetMargin; +typedef gfx::IntMarginTyped RenderTargetIntMargin; +typedef gfx::IntRegionTyped RenderTargetIntRegion; + +typedef gfx::CoordTyped ScreenCoord; +typedef gfx::IntCoordTyped ScreenIntCoord; +typedef gfx::PointTyped ScreenPoint; +typedef gfx::IntPointTyped ScreenIntPoint; +typedef gfx::SizeTyped ScreenSize; +typedef gfx::IntSizeTyped ScreenIntSize; +typedef gfx::RectTyped ScreenRect; +typedef gfx::IntRectTyped ScreenIntRect; +typedef gfx::MarginTyped ScreenMargin; +typedef gfx::IntMarginTyped ScreenIntMargin; +typedef gfx::IntRegionTyped ScreenIntRegion; + +typedef gfx::CoordTyped ParentLayerCoord; +typedef gfx::IntCoordTyped ParentLayerIntCoord; +typedef gfx::PointTyped ParentLayerPoint; +typedef gfx::IntPointTyped ParentLayerIntPoint; +typedef gfx::SizeTyped ParentLayerSize; +typedef gfx::IntSizeTyped ParentLayerIntSize; +typedef gfx::RectTyped ParentLayerRect; +typedef gfx::IntRectTyped ParentLayerIntRect; +typedef gfx::MarginTyped ParentLayerMargin; +typedef gfx::IntMarginTyped ParentLayerIntMargin; +typedef gfx::IntRegionTyped ParentLayerIntRegion; + +typedef gfx::CoordTyped DesktopCoord; +typedef gfx::IntCoordTyped DesktopIntCoord; +typedef gfx::PointTyped DesktopPoint; +typedef gfx::IntPointTyped DesktopIntPoint; +typedef gfx::SizeTyped DesktopSize; +typedef gfx::IntSizeTyped DesktopIntSize; +typedef gfx::RectTyped DesktopRect; +typedef gfx::IntRectTyped DesktopIntRect; + +typedef gfx::ScaleFactor CSSToLayoutDeviceScale; +typedef gfx::ScaleFactor CSSToLayerScale; +typedef gfx::ScaleFactor CSSToScreenScale; +typedef gfx::ScaleFactor CSSToParentLayerScale; +typedef gfx::ScaleFactor LayoutDeviceToCSSScale; +typedef gfx::ScaleFactor LayoutDeviceToLayerScale; +typedef gfx::ScaleFactor LayoutDeviceToScreenScale; +typedef gfx::ScaleFactor LayoutDeviceToParentLayerScale; +typedef gfx::ScaleFactor LayerToCSSScale; +typedef gfx::ScaleFactor LayerToLayoutDeviceScale; +typedef gfx::ScaleFactor LayerToRenderTargetScale; +typedef gfx::ScaleFactor LayerToScreenScale; +typedef gfx::ScaleFactor LayerToParentLayerScale; +typedef gfx::ScaleFactor RenderTargetToScreenScale; +typedef gfx::ScaleFactor ScreenToCSSScale; +typedef gfx::ScaleFactor ScreenToLayoutDeviceScale; +typedef gfx::ScaleFactor ScreenToLayerScale; +typedef gfx::ScaleFactor ScreenToParentLayerScale; +typedef gfx::ScaleFactor ParentLayerToLayerScale; +typedef gfx::ScaleFactor ParentLayerToScreenScale; +typedef gfx::ScaleFactor ParentLayerToParentLayerScale; +typedef gfx::ScaleFactor DesktopToLayoutDeviceScale; + +typedef gfx::ScaleFactors2D CSSToLayoutDeviceScale2D; +typedef gfx::ScaleFactors2D CSSToLayerScale2D; +typedef gfx::ScaleFactors2D CSSToScreenScale2D; +typedef gfx::ScaleFactors2D CSSToParentLayerScale2D; +typedef gfx::ScaleFactors2D LayoutDeviceToCSSScale2D; +typedef gfx::ScaleFactors2D LayoutDeviceToLayerScale2D; +typedef gfx::ScaleFactors2D LayoutDeviceToScreenScale2D; +typedef gfx::ScaleFactors2D LayoutDeviceToParentLayerScale2D; +typedef gfx::ScaleFactors2D LayerToCSSScale2D; +typedef gfx::ScaleFactors2D LayerToLayoutDeviceScale2D; +typedef gfx::ScaleFactors2D LayerToRenderTargetScale2D; +typedef gfx::ScaleFactors2D LayerToScreenScale2D; +typedef gfx::ScaleFactors2D LayerToParentLayerScale2D; +typedef gfx::ScaleFactors2D RenderTargetToScreenScale2D; +typedef gfx::ScaleFactors2D ScreenToCSSScale2D; +typedef gfx::ScaleFactors2D ScreenToLayoutDeviceScale2D; +typedef gfx::ScaleFactors2D ScreenToLayerScale2D; +typedef gfx::ScaleFactors2D ScreenToParentLayerScale2D; +typedef gfx::ScaleFactors2D ParentLayerToLayerScale2D; +typedef gfx::ScaleFactors2D ParentLayerToScreenScale2D; +typedef gfx::ScaleFactors2D ParentLayerToParentLayerScale2D; + +typedef gfx::Matrix4x4Typed LayoutDeviceToLayoutDeviceMatrix4x4; +typedef gfx::Matrix4x4Typed LayerToParentLayerMatrix4x4; +typedef gfx::Matrix4x4Typed ScreenToScreenMatrix4x4; +typedef gfx::Matrix4x4Typed ScreenToParentLayerMatrix4x4; +typedef gfx::Matrix4x4Typed ParentLayerToLayerMatrix4x4; +typedef gfx::Matrix4x4Typed ParentLayerToScreenMatrix4x4; +typedef gfx::Matrix4x4Typed ParentLayerToParentLayerMatrix4x4; + +/* + * The pixels that content authors use to specify sizes in. + */ +struct CSSPixel { + + // Conversions from app units + + static CSSPoint FromAppUnits(const nsPoint& aPoint) { + return CSSPoint(NSAppUnitsToFloatPixels(aPoint.x, float(AppUnitsPerCSSPixel())), + NSAppUnitsToFloatPixels(aPoint.y, float(AppUnitsPerCSSPixel()))); + } + + static CSSSize FromAppUnits(const nsSize& aSize) { + return CSSSize(NSAppUnitsToFloatPixels(aSize.width, float(AppUnitsPerCSSPixel())), + NSAppUnitsToFloatPixels(aSize.height, float(AppUnitsPerCSSPixel()))); + } + + static CSSRect FromAppUnits(const nsRect& aRect) { + return CSSRect(NSAppUnitsToFloatPixels(aRect.x, float(AppUnitsPerCSSPixel())), + NSAppUnitsToFloatPixels(aRect.y, float(AppUnitsPerCSSPixel())), + NSAppUnitsToFloatPixels(aRect.width, float(AppUnitsPerCSSPixel())), + NSAppUnitsToFloatPixels(aRect.height, float(AppUnitsPerCSSPixel()))); + } + + static CSSMargin FromAppUnits(const nsMargin& aMargin) { + return CSSMargin(NSAppUnitsToFloatPixels(aMargin.top, float(AppUnitsPerCSSPixel())), + NSAppUnitsToFloatPixels(aMargin.right, float(AppUnitsPerCSSPixel())), + NSAppUnitsToFloatPixels(aMargin.bottom, float(AppUnitsPerCSSPixel())), + NSAppUnitsToFloatPixels(aMargin.left, float(AppUnitsPerCSSPixel()))); + } + + static CSSIntPoint FromAppUnitsRounded(const nsPoint& aPoint) { + return CSSIntPoint(NSAppUnitsToIntPixels(aPoint.x, float(AppUnitsPerCSSPixel())), + NSAppUnitsToIntPixels(aPoint.y, float(AppUnitsPerCSSPixel()))); + } + + static CSSIntSize FromAppUnitsRounded(const nsSize& aSize) + { + return CSSIntSize(NSAppUnitsToIntPixels(aSize.width, float(AppUnitsPerCSSPixel())), + NSAppUnitsToIntPixels(aSize.height, float(AppUnitsPerCSSPixel()))); + } + + static CSSIntRect FromAppUnitsRounded(const nsRect& aRect) { + return CSSIntRect(NSAppUnitsToIntPixels(aRect.x, float(AppUnitsPerCSSPixel())), + NSAppUnitsToIntPixels(aRect.y, float(AppUnitsPerCSSPixel())), + NSAppUnitsToIntPixels(aRect.width, float(AppUnitsPerCSSPixel())), + NSAppUnitsToIntPixels(aRect.height, float(AppUnitsPerCSSPixel()))); + } + + // Conversions to app units + + static nsPoint ToAppUnits(const CSSPoint& aPoint) { + return nsPoint(NSToCoordRoundWithClamp(aPoint.x * float(AppUnitsPerCSSPixel())), + NSToCoordRoundWithClamp(aPoint.y * float(AppUnitsPerCSSPixel()))); + } + + static nsPoint ToAppUnits(const CSSIntPoint& aPoint) { + return nsPoint(NSToCoordRoundWithClamp(float(aPoint.x) * float(AppUnitsPerCSSPixel())), + NSToCoordRoundWithClamp(float(aPoint.y) * float(AppUnitsPerCSSPixel()))); + } + + static nsSize ToAppUnits(const CSSSize& aSize) { + return nsSize(NSToCoordRoundWithClamp(aSize.width * float(AppUnitsPerCSSPixel())), + NSToCoordRoundWithClamp(aSize.height * float(AppUnitsPerCSSPixel()))); + } + + static nsSize ToAppUnits(const CSSIntSize& aSize) { + return nsSize(NSToCoordRoundWithClamp(float(aSize.width) * float(AppUnitsPerCSSPixel())), + NSToCoordRoundWithClamp(float(aSize.height) * float(AppUnitsPerCSSPixel()))); + } + + static nsRect ToAppUnits(const CSSRect& aRect) { + return nsRect(NSToCoordRoundWithClamp(aRect.x * float(AppUnitsPerCSSPixel())), + NSToCoordRoundWithClamp(aRect.y * float(AppUnitsPerCSSPixel())), + NSToCoordRoundWithClamp(aRect.width * float(AppUnitsPerCSSPixel())), + NSToCoordRoundWithClamp(aRect.height * float(AppUnitsPerCSSPixel()))); + } + + static nsRect ToAppUnits(const CSSIntRect& aRect) { + return nsRect(NSToCoordRoundWithClamp(float(aRect.x) * float(AppUnitsPerCSSPixel())), + NSToCoordRoundWithClamp(float(aRect.y) * float(AppUnitsPerCSSPixel())), + NSToCoordRoundWithClamp(float(aRect.width) * float(AppUnitsPerCSSPixel())), + NSToCoordRoundWithClamp(float(aRect.height) * float(AppUnitsPerCSSPixel()))); + } +}; + +/* + * The pixels that are referred to as "device pixels" in layout code. In + * general values measured in LayoutDevicePixels are obtained by dividing a + * value in app units by AppUnitsPerDevPixel(). Conversion between CSS pixels + * and LayoutDevicePixels is affected by: + * 1) the "full zoom" (see nsPresContext::SetFullZoom) + * 2) the "widget scale" (see nsIWidget::GetDefaultScale) + */ +struct LayoutDevicePixel { + static LayoutDeviceRect FromAppUnits(const nsRect& aRect, nscoord aAppUnitsPerDevPixel) { + return LayoutDeviceRect(NSAppUnitsToFloatPixels(aRect.x, float(aAppUnitsPerDevPixel)), + NSAppUnitsToFloatPixels(aRect.y, float(aAppUnitsPerDevPixel)), + NSAppUnitsToFloatPixels(aRect.width, float(aAppUnitsPerDevPixel)), + NSAppUnitsToFloatPixels(aRect.height, float(aAppUnitsPerDevPixel))); + } + + static LayoutDevicePoint FromAppUnits(const nsPoint& aPoint, nscoord aAppUnitsPerDevPixel) { + return LayoutDevicePoint(NSAppUnitsToFloatPixels(aPoint.x, aAppUnitsPerDevPixel), + NSAppUnitsToFloatPixels(aPoint.y, aAppUnitsPerDevPixel)); + } + + static LayoutDeviceMargin FromAppUnits(const nsMargin& aMargin, nscoord aAppUnitsPerDevPixel) { + return LayoutDeviceMargin(NSAppUnitsToFloatPixels(aMargin.top, aAppUnitsPerDevPixel), + NSAppUnitsToFloatPixels(aMargin.right, aAppUnitsPerDevPixel), + NSAppUnitsToFloatPixels(aMargin.bottom, aAppUnitsPerDevPixel), + NSAppUnitsToFloatPixels(aMargin.left, aAppUnitsPerDevPixel)); + } + + static LayoutDeviceIntPoint FromAppUnitsRounded(const nsPoint& aPoint, nscoord aAppUnitsPerDevPixel) { + return LayoutDeviceIntPoint(NSAppUnitsToIntPixels(aPoint.x, aAppUnitsPerDevPixel), + NSAppUnitsToIntPixels(aPoint.y, aAppUnitsPerDevPixel)); + } + + static LayoutDeviceIntPoint FromAppUnitsToNearest(const nsPoint& aPoint, nscoord aAppUnitsPerDevPixel) { + return LayoutDeviceIntPoint::FromUnknownPoint(aPoint.ToNearestPixels(aAppUnitsPerDevPixel)); + } + + static LayoutDeviceIntRect FromAppUnitsToNearest(const nsRect& aRect, nscoord aAppUnitsPerDevPixel) { + return LayoutDeviceIntRect::FromUnknownRect(aRect.ToNearestPixels(aAppUnitsPerDevPixel)); + } + + static LayoutDeviceIntRect FromAppUnitsToInside(const nsRect& aRect, nscoord aAppUnitsPerDevPixel) { + return LayoutDeviceIntRect::FromUnknownRect(aRect.ToInsidePixels(aAppUnitsPerDevPixel)); + } + + static LayoutDeviceIntSize FromAppUnitsRounded(const nsSize& aSize, nscoord aAppUnitsPerDevPixel) { + return LayoutDeviceIntSize( + NSAppUnitsToIntPixels(aSize.width, aAppUnitsPerDevPixel), + NSAppUnitsToIntPixels(aSize.height, aAppUnitsPerDevPixel)); + } + + static nsPoint ToAppUnits(const LayoutDeviceIntPoint& aPoint, nscoord aAppUnitsPerDevPixel) { + return nsPoint(aPoint.x * aAppUnitsPerDevPixel, + aPoint.y * aAppUnitsPerDevPixel); + } + + static nsSize ToAppUnits(const LayoutDeviceIntSize& aSize, nscoord aAppUnitsPerDevPixel) { + return nsSize(aSize.width * aAppUnitsPerDevPixel, + aSize.height * aAppUnitsPerDevPixel); + } + + static nsSize ToAppUnits(const LayoutDeviceSize& aSize, nscoord aAppUnitsPerDevPixel) { + return nsSize(NSFloatPixelsToAppUnits(aSize.width, aAppUnitsPerDevPixel), + NSFloatPixelsToAppUnits(aSize.height, aAppUnitsPerDevPixel)); + } + + static nsRect ToAppUnits(const LayoutDeviceIntRect& aRect, nscoord aAppUnitsPerDevPixel) { + return nsRect(aRect.x * aAppUnitsPerDevPixel, + aRect.y * aAppUnitsPerDevPixel, + aRect.width * aAppUnitsPerDevPixel, + aRect.height * aAppUnitsPerDevPixel); + } + + static nsRect ToAppUnits(const LayoutDeviceRect& aRect, nscoord aAppUnitsPerDevPixel) { + return nsRect(NSFloatPixelsToAppUnits(aRect.x, aAppUnitsPerDevPixel), + NSFloatPixelsToAppUnits(aRect.y, aAppUnitsPerDevPixel), + NSFloatPixelsToAppUnits(aRect.width, aAppUnitsPerDevPixel), + NSFloatPixelsToAppUnits(aRect.height, aAppUnitsPerDevPixel)); + } +}; + +/* + * The pixels that layout rasterizes and delivers to the graphics code. + * These also are generally referred to as "device pixels" in layout code. + * Conversion between CSS pixels and LayerPixels is affected by: + * 1) the "display resolution" (see nsIPresShell::SetResolution) + * 2) the "full zoom" (see nsPresContext::SetFullZoom) + * 3) the "widget scale" (see nsIWidget::GetDefaultScale) + * 4) rasterizing at a different scale in the presence of some CSS transforms + */ +struct LayerPixel { +}; + +/* + * This is Layer coordinates with the Layer's CSS transform applied. + * It can be thought of as intermediate between LayerPixel and + * ParentLayerPixel, as further applying async transforms to this + * yields ParentLayerPixels. + */ +struct CSSTransformedLayerPixel { + +}; + +/* + * Layers are always composited to a render target. This unit + * represents one pixel in the render target. Note that for the + * root render target RenderTargetPixel == ScreenPixel. Also + * any ContainerLayer providing an intermediate surface will + * have RenderTargetPixel == LayerPixel. + */ +struct RenderTargetPixel { +}; + +/* + * The pixels that are displayed on the screen. + * On non-OMTC platforms this should be equivalent to LayerPixel units. + * On OMTC platforms these may diverge from LayerPixel units temporarily, + * while an asynchronous zoom is happening, but should eventually converge + * back to LayerPixel units. Some variables (such as those representing + * chrome UI element sizes) that are not subject to content zoom should + * generally be represented in ScreenPixel units. + */ +struct ScreenPixel { +}; + +/* The layer coordinates of the parent frame. + * This can be arrived at in three ways: + * - Start with the CSS coordinates of the parent frame, multiply by the + * device scale and the cumulative resolution of the parent frame. + * - Start with the CSS coordinates of current frame, multiply by the device + * scale, the cumulative resolution of the current frame, and the scales + * from the CSS and async transforms of the current frame. + * - Start with global screen coordinates and unapply all CSS and async + * transforms from the root down to and including the parent. + * It's helpful to look at https://wiki.mozilla.org/Platform/GFX/APZ#Coordinate_systems + * to get a picture of how the various coordinate systems relate to each other. + */ +struct ParentLayerPixel { +}; + +/* + * Pixels in the coordinate space used by the host OS to manage windows on the + * desktop. What these mean varies between OSs: + * - by default (unless implemented differently in platform-specific widget + * code) they are the same as LayoutDevicePixels + * - on Mac OS X, they're "cocoa points", which correspond to device pixels + * on a non-Retina display, and to 2x device pixels on Retina + * - on Windows *without* per-monitor DPI support, they are Windows "logical + * pixels", i.e. device pixels scaled according to the Windows display DPI + * scaling factor (typically one of 1.25, 1.5, 1.75, 2.0...) + * - on Windows *with* per-monitor DPI support, they are physical device pixels + * on each screen; note that this means the scaling between CSS pixels and + * desktop pixels may vary across multiple displays. + */ +struct DesktopPixel { +}; + +// Operators to apply ScaleFactors directly to Coords, Points, Rects, Sizes and Margins + +template +gfx::CoordTyped operator*(const gfx::CoordTyped& aCoord, const gfx::ScaleFactor& aScale) { + return gfx::CoordTyped(aCoord.value * aScale.scale); +} + +template +gfx::CoordTyped operator/(const gfx::CoordTyped& aCoord, const gfx::ScaleFactor& aScale) { + return gfx::CoordTyped(aCoord.value / aScale.scale); +} + +template +gfx::PointTyped operator*(const gfx::PointTyped& aPoint, const gfx::ScaleFactor& aScale) { + return gfx::PointTyped(aPoint.x * aScale.scale, + aPoint.y * aScale.scale); +} + +template +gfx::PointTyped operator/(const gfx::PointTyped& aPoint, const gfx::ScaleFactor& aScale) { + return gfx::PointTyped(aPoint.x / aScale.scale, + aPoint.y / aScale.scale); +} + +template +gfx::PointTyped operator*(const gfx::PointTyped& aPoint, const gfx::ScaleFactors2D& aScale) { + return gfx::PointTyped(aPoint.x * aScale.xScale, + aPoint.y * aScale.yScale); +} + +template +gfx::PointTyped operator/(const gfx::PointTyped& aPoint, const gfx::ScaleFactors2D& aScale) { + return gfx::PointTyped(aPoint.x / aScale.xScale, + aPoint.y / aScale.yScale); +} + +template +gfx::PointTyped operator*(const gfx::IntPointTyped& aPoint, const gfx::ScaleFactor& aScale) { + return gfx::PointTyped(float(aPoint.x) * aScale.scale, + float(aPoint.y) * aScale.scale); +} + +template +gfx::PointTyped operator/(const gfx::IntPointTyped& aPoint, const gfx::ScaleFactor& aScale) { + return gfx::PointTyped(float(aPoint.x) / aScale.scale, + float(aPoint.y) / aScale.scale); +} + +template +gfx::PointTyped operator*(const gfx::IntPointTyped& aPoint, const gfx::ScaleFactors2D& aScale) { + return gfx::PointTyped(float(aPoint.x) * aScale.xScale, + float(aPoint.y) * aScale.yScale); +} + +template +gfx::PointTyped operator/(const gfx::IntPointTyped& aPoint, const gfx::ScaleFactors2D& aScale) { + return gfx::PointTyped(float(aPoint.x) / aScale.xScale, + float(aPoint.y) / aScale.yScale); +} + +template +gfx::RectTyped operator*(const gfx::RectTyped& aRect, const gfx::ScaleFactor& aScale) { + return gfx::RectTyped(aRect.x * aScale.scale, + aRect.y * aScale.scale, + aRect.width * aScale.scale, + aRect.height * aScale.scale); +} + +template +gfx::RectTyped operator/(const gfx::RectTyped& aRect, const gfx::ScaleFactor& aScale) { + return gfx::RectTyped(aRect.x / aScale.scale, + aRect.y / aScale.scale, + aRect.width / aScale.scale, + aRect.height / aScale.scale); +} + +template +gfx::RectTyped operator*(const gfx::RectTyped& aRect, const gfx::ScaleFactors2D& aScale) { + return gfx::RectTyped(aRect.x * aScale.xScale, + aRect.y * aScale.yScale, + aRect.width * aScale.xScale, + aRect.height * aScale.yScale); +} + +template +gfx::RectTyped operator/(const gfx::RectTyped& aRect, const gfx::ScaleFactors2D& aScale) { + return gfx::RectTyped(aRect.x / aScale.xScale, + aRect.y / aScale.yScale, + aRect.width / aScale.xScale, + aRect.height / aScale.yScale); +} + +template +gfx::RectTyped operator*(const gfx::IntRectTyped& aRect, const gfx::ScaleFactor& aScale) { + return gfx::RectTyped(float(aRect.x) * aScale.scale, + float(aRect.y) * aScale.scale, + float(aRect.width) * aScale.scale, + float(aRect.height) * aScale.scale); +} + +template +gfx::RectTyped operator/(const gfx::IntRectTyped& aRect, const gfx::ScaleFactor& aScale) { + return gfx::RectTyped(float(aRect.x) / aScale.scale, + float(aRect.y) / aScale.scale, + float(aRect.width) / aScale.scale, + float(aRect.height) / aScale.scale); +} + +template +gfx::RectTyped operator*(const gfx::IntRectTyped& aRect, const gfx::ScaleFactors2D& aScale) { + return gfx::RectTyped(float(aRect.x) * aScale.xScale, + float(aRect.y) * aScale.yScale, + float(aRect.width) * aScale.xScale, + float(aRect.height) * aScale.yScale); +} + +template +gfx::RectTyped operator/(const gfx::IntRectTyped& aRect, const gfx::ScaleFactors2D& aScale) { + return gfx::RectTyped(float(aRect.x) / aScale.xScale, + float(aRect.y) / aScale.yScale, + float(aRect.width) / aScale.xScale, + float(aRect.height) / aScale.yScale); +} + +template +gfx::SizeTyped operator*(const gfx::SizeTyped& aSize, const gfx::ScaleFactor& aScale) { + return gfx::SizeTyped(aSize.width * aScale.scale, + aSize.height * aScale.scale); +} + +template +gfx::SizeTyped operator/(const gfx::SizeTyped& aSize, const gfx::ScaleFactor& aScale) { + return gfx::SizeTyped(aSize.width / aScale.scale, + aSize.height / aScale.scale); +} + +template +gfx::SizeTyped operator*(const gfx::SizeTyped& aSize, const gfx::ScaleFactors2D& aScale) { + return gfx::SizeTyped(aSize.width * aScale.xScale, + aSize.height * aScale.yScale); +} + +template +gfx::SizeTyped operator/(const gfx::SizeTyped& aSize, const gfx::ScaleFactors2D& aScale) { + return gfx::SizeTyped(aSize.width / aScale.xScale, + aSize.height / aScale.yScale); +} + +template +gfx::SizeTyped operator*(const gfx::IntSizeTyped& aSize, const gfx::ScaleFactor& aScale) { + return gfx::SizeTyped(float(aSize.width) * aScale.scale, + float(aSize.height) * aScale.scale); +} + +template +gfx::SizeTyped operator/(const gfx::IntSizeTyped& aSize, const gfx::ScaleFactor& aScale) { + return gfx::SizeTyped(float(aSize.width) / aScale.scale, + float(aSize.height) / aScale.scale); +} + +template +gfx::SizeTyped operator*(const gfx::IntSizeTyped& aSize, const gfx::ScaleFactors2D& aScale) { + return gfx::SizeTyped(float(aSize.width) * aScale.xScale, + float(aSize.height) * aScale.yScale); +} + +template +gfx::SizeTyped operator/(const gfx::IntSizeTyped& aSize, const gfx::ScaleFactors2D& aScale) { + return gfx::SizeTyped(float(aSize.width) / aScale.xScale, + float(aSize.height) / aScale.yScale); +} + +template +gfx::MarginTyped operator*(const gfx::MarginTyped& aMargin, const gfx::ScaleFactor& aScale) { + return gfx::MarginTyped(aMargin.top * aScale.scale, + aMargin.right * aScale.scale, + aMargin.bottom * aScale.scale, + aMargin.left * aScale.scale); +} + +template +gfx::MarginTyped operator/(const gfx::MarginTyped& aMargin, const gfx::ScaleFactor& aScale) { + return gfx::MarginTyped(aMargin.top / aScale.scale, + aMargin.right / aScale.scale, + aMargin.bottom / aScale.scale, + aMargin.left / aScale.scale); +} + +template +gfx::MarginTyped operator*(const gfx::MarginTyped& aMargin, const gfx::ScaleFactors2D& aScale) { + return gfx::MarginTyped(aMargin.top * aScale.yScale, + aMargin.right * aScale.xScale, + aMargin.bottom * aScale.yScale, + aMargin.left * aScale.xScale); +} + +template +gfx::MarginTyped operator/(const gfx::MarginTyped& aMargin, const gfx::ScaleFactors2D& aScale) { + return gfx::MarginTyped(aMargin.top / aScale.yScale, + aMargin.right / aScale.xScale, + aMargin.bottom / aScale.yScale, + aMargin.left / aScale.xScale); +} + +// Calculate the max or min or the ratios of the widths and heights of two +// sizes, returning a scale factor in the correct units. + +template +gfx::ScaleFactor MaxScaleRatio(const gfx::SizeTyped& aDestSize, const gfx::SizeTyped& aSrcSize) { + return gfx::ScaleFactor(std::max(aDestSize.width / aSrcSize.width, + aDestSize.height / aSrcSize.height)); +} + +template +gfx::ScaleFactor MinScaleRatio(const gfx::SizeTyped& aDestSize, const gfx::SizeTyped& aSrcSize) { + return gfx::ScaleFactor(std::min(aDestSize.width / aSrcSize.width, + aDestSize.height / aSrcSize.height)); +} + +} // namespace mozilla + +#endif -- cgit v1.2.3