Chromium Code Reviews| Index: ui/gfx/win/rect_util.h |
| diff --git a/ui/gfx/win/rect_util.h b/ui/gfx/win/rect_util.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..60c109d335bfc89b8352f65ac69fa2008baadae4 |
| --- /dev/null |
| +++ b/ui/gfx/win/rect_util.h |
| @@ -0,0 +1,130 @@ |
| +// 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_GFX_WIN_RECT_UTIL_H_ |
| +#define UI_GFX_WIN_RECT_UTIL_H_ |
| + |
| +#include <stdint.h> |
| + |
| +#include "ui/gfx/gfx_export.h" |
| + |
| +namespace gfx { |
| + |
| +class Rect; |
| + |
| +namespace win { |
| + |
| +enum class RectEdge { |
| + BOTTOM = 0, |
| + LEFT = 1, |
| + TOP = 2, |
| + RIGHT = 3, |
| + NONE = 4, |
| +}; |
| + |
| +// Returns |ref|'s RectEdge touching |test|. |
| +// Returns RectEdge::NONE if |ref| and |test| do not touch. |
| +// At corners, the bottom corners are clamped to BOTTOM, the upper left corner |
| +// is clamped to LEFT and the upper right corner is clamped to TOP. |
| +GFX_EXPORT RectEdge FindTouchingRectEdge(const gfx::Rect& ref, |
| + const gfx::Rect& test); |
| + |
| +// Returns a scaled and position rect from |unscaled_rect|, positioned against |
| +// |ref_scaled_rect| based off of the original edge positioning on |
| +// |ref_unscaled_rect|, and downscaled by |unscaled_rect_scale_factor|. |
| +// As such, |unscaled_rect| and |ref_unscaled_rect| must be touching rectangles. |
| +// |
| +// Examples: |
| +// Scaled and Unscaled Coordinates |
| +// +--------------+ Since both rectangles are of the same scale |
| +// | | factor, relative positions remain the same. |
| +// | | |
| +// | REF 1x +----------+ |
| +// | | | |
| +// +--------------+ 1x | |
| +// | | |
| +// +----------+ |
| +// |
| +// Unscaled Coordinates |
| +// +--------------+ The 2x rectangle is scaled down while |
| +// | | maintaining a similar neighboring relationship |
| +// | | with the REF 1x rectangle. |
| +// | REF 1x +----------+ |
| +// | | | |
| +// +--------------+ 2x | |
| +// | | |
| +// +----------+ |
| +// Scaled Coordinates |
| +// +--------------+ |
| +// | | |
| +// | | |
| +// | REF 1x | |
| +// | +-----+ |
| +// +--------------+ 2x | |
| +// +-----+ |
| +// |
| +// Unscaled Coordinates |
| +// +--------------+ The reference rectangle has been scaled by 2x |
| +// | | from |ref_unscaled_rect| to |ref_scaled_rect|. |
| +// | | ScaleAndPositionRect maintains the same |
| +// | REF 2x +----------+ relative positioning of the unscaled rect in |
| +// | | | the scaled coordinate space. |
| +// | | | |
| +// | | 1x | |
| +// +--------------+ | |
| +// | | |
| +// +----------+ |
| +// Scaled Coordinates |
| +// +-------+ |
| +// | | |
| +// | REF 2x+----------+ |
| +// | | | |
| +// +-------+ | |
| +// | 1x | |
| +// | | |
| +// | | |
| +// +----------+ |
| +GFX_EXPORT gfx::Rect ScaleAndPositionRect(const gfx::Rect& ref_scaled_rect, |
|
sky
2016/02/18 17:02:58
Thanks for the comments. I think I understand what
robliao
2016/02/19 00:26:29
The sizing is straightforward. The positioning is
|
| + const gfx::Rect& ref_unscaled_rect, |
| + const gfx::Rect& unscaled_rect, |
| + float unscaled_rect_scale_factor); |
| + |
| +// 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. |
| +GFX_EXPORT int64_t SquaredDistanceBetweenRects(const gfx::Rect& ref, |
| + const gfx::Rect& rect); |
| + |
| +} // namespace win |
| +} // namespace gfx |
| + |
| +#endif // UI_GFX_WIN_RECT_UTIL_H_ |