// Copyright 2016 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. #ifndef UI_DISPLAY_WIN_SCALING_UTIL_H_ #define UI_DISPLAY_WIN_SCALING_UTIL_H_ #include #include "ui/display/display_export.h" #include "ui/display/display_layout.h" #include "ui/display/win/display_info.h" namespace gfx { class Rect; } namespace display { namespace win { // Whether or not |a| shares an edge with |b|. DISPLAY_EXPORT bool DisplayInfosTouch(const DisplayInfo& a, const DisplayInfo& b); // Returns a DisplayPlacement for |current| relative to |parent|. // Note that DisplayPlacement's are always in DIPs, so this also performs the // required scaling. // // Examples (The offset is indicated by the arrow.): // Scaled and Unscaled Coordinates // +--------------+ + Since both DisplayInfos are of the same scale // | | | factor, relative positions remain the same. // | Parent | V // | 1x +----------+ // | | | // +--------------+ Current | // | 1x | // +----------+ // // Unscaled Coordinates // +--------------+ The 2x DisplayInfo is offset to maintain a // | | similar neighboring relationship with the 1x // | Parent | parent. Current's position is based off of the // | 1x +----------+ percentage position along its parent. This // | | | percentage position is preserved in the scaled // +--------------+ Current | coordinates. // | 2x | // +----------+ // Scaled Coordinates // +--------------+ + // | | | // | Parent | V // | 1x +-----+ // | + C 2x| // +--------------+-----+ // // // Unscaled Coordinates // +--------------+ The parent DisplayInfo has a 2x scale factor. // | | The offset is adjusted to maintain the // | | relative positioning of the 1x DisplayInfo in // | Parent +----------+ the scaled coordinate space. Current's // | 2x | | position is based off of the percentage // | | Current | position along its parent. This percentage // | | 1x | position is preserved in the scaled // +--------------+ | coordinates. // | | // +----------+ // Scaled Coordinates // +-------+ + // | | V // | Parent+----------+ // | 2x | | // +-------+ Current | // | 1x | // | | // | | // +----------+ // // Unscaled Coordinates // +----------+ In this case, parent lies between the top and // | | bottom of parent. The roles are reversed when // +-------+ | this occurs, and current is placed to maintain // | | Current | parent's relative position along current. // | Parent| 1x | // | 2x | | // +-------+ | // +----------+ // Scaled Coordinates // ^ +----------+ // | | | // + +----+ | // |Prnt| Current | // | 2x | 1x | // +----+ | // | | // +----------+ // // Scaled and Unscaled Coordinates // +--------+ If the two DisplayInfos are bottom aligned or // | | right aligned, the DisplayPlacement will // | +--------+ have an offset of 0 relative to the // | | | bottom-right of the DisplayInfo. // | | | // +--------+--------+ DISPLAY_EXPORT DisplayPlacement CalculateDisplayPlacement( const DisplayInfo& parent, const DisplayInfo& current); // Returns the squared distance between two rects. // The distance between two rects is the length of the shortest segment that can // be drawn between two rectangles. This segment generally connects two opposing // corners between rectangles like this... // // +----------+ // | | // +----------+ // \ <--- Shortest Segment // \ // +---+ // | | // | | // +---+ // // For rectangles that share coordinates within the same axis, that generally // means the segment is parallel to the axis and perpendicular to the edges. // // One of many shortest segments // +----------+ / \ +--------+ // | | | \ | | // | | V +---+ \ +--------+ // | |-----| | \-->| // +----------+ | | +----+ // | | | | // +---+ +----+ // // For rectangles that intersect each other, the distance is 0. // // The squared distance is used to avoid taking the square root as the common // usage is to compare distances greater than 1 unit. DISPLAY_EXPORT int64_t SquaredDistanceBetweenRects(const gfx::Rect& ref, const gfx::Rect& rect); } // namespace win } // namespace display #endif // UI_DISPLAY_WIN_SCALING_UTIL_H_