Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(185)

Side by Side Diff: tools/dom/src/Rectangle.dart

Issue 25808002: Move Rectangle and Point into dart:math. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 part of html;
6
7 /**
8 * A base class for representing two-dimensional rectangles. This will hopefully
9 * be moved merged with the dart:math Rect.
10 */
11 // TODO(efortuna): Merge with Math rect after finalizing with Florian.
12 abstract class RectBase {
13 // Not used, but keeps the VM from complaining about Rect having a const
14 // constructor and this one not.
15 const RectBase();
16
17 num get left;
18 num get top;
19 num get width;
20 num get height;
21
22 num get right => left + width;
23 num get bottom => top + height;
24
25 // NOTE! All code below should be common with Rect.
26
27 String toString() {
28 return '($left, $top, $width, $height)';
29 }
30
31 bool operator ==(other) {
32 if (other is !Rect) return false;
33 return left == other.left && top == other.top && width == other.width &&
34 height == other.height;
35 }
36
37 int get hashCode => JenkinsSmiHash.hash4(left.hashCode, top.hashCode,
38 width.hashCode, height.hashCode);
39
40 /**
41 * Computes the intersection of this rectangle and the rectangle parameter.
42 * Returns null if there is no intersection.
43 */
44 Rect intersection(Rect rect) {
45 var x0 = max(left, rect.left);
46 var x1 = min(left + width, rect.left + rect.width);
47
48 if (x0 <= x1) {
49 var y0 = max(top, rect.top);
50 var y1 = min(top + height, rect.top + rect.height);
51
52 if (y0 <= y1) {
53 return new Rect(x0, y0, x1 - x0, y1 - y0);
54 }
55 }
56 return null;
57 }
58
59
60 /**
61 * Returns whether a rectangle intersects this rectangle.
62 */
63 bool intersects(Rect other) {
64 return (left <= other.left + other.width && other.left <= left + width &&
65 top <= other.top + other.height && other.top <= top + height);
66 }
67
68 /**
69 * Returns a new rectangle which completely contains this rectangle and the
70 * input rectangle.
71 */
72 Rect union(Rect rect) {
73 var right = max(this.left + this.width, rect.left + rect.width);
74 var bottom = max(this.top + this.height, rect.top + rect.height);
75
76 var left = min(this.left, rect.left);
77 var top = min(this.top, rect.top);
78
79 return new Rect(left, top, right - left, bottom - top);
80 }
81
82 /**
83 * Tests whether this rectangle entirely contains another rectangle.
84 */
85 bool containsRect(Rect another) {
86 return left <= another.left &&
87 left + width >= another.left + another.width &&
88 top <= another.top &&
89 top + height >= another.top + another.height;
90 }
91
92 /**
93 * Tests whether this rectangle entirely contains a point.
94 */
95 bool containsPoint(Point another) {
96 return another.x >= left &&
97 another.x <= left + width &&
98 another.y >= top &&
99 another.y <= top + height;
100 }
101
102 Rect ceil() => new Rect(left.ceil(), top.ceil(), width.ceil(), height.ceil());
103 Rect floor() => new Rect(left.floor(), top.floor(), width.floor(),
104 height.floor());
105 Rect round() => new Rect(left.round(), top.round(), width.round(),
106 height.round());
107
108 /**
109 * Truncates coordinates to integers and returns the result as a new
110 * rectangle.
111 */
112 Rect toInt() => new Rect(left.toInt(), top.toInt(), width.toInt(),
113 height.toInt());
114
115 Point get topLeft => new Point(this.left, this.top);
116 Point get bottomRight => new Point(this.left + this.width,
117 this.top + this.height);
118 }
119
120
121
122 /**
123 * A class for representing two-dimensional rectangles.
124 *
125 * This class is distinctive from RectBase in that it enforces that its
126 * properties are immutable.
127 */
128 class Rect extends RectBase {
129 final num left;
130 final num top;
131 final num width;
132 final num height;
133
134 const Rect(this.left, this.top, this.width, this.height): super();
135
136 factory Rect.fromPoints(Point a, Point b) {
137 var left;
138 var width;
139 if (a.x < b.x) {
140 left = a.x;
141 width = b.x - left;
142 } else {
143 left = b.x;
144 width = a.x - left;
145 }
146 var top;
147 var height;
148 if (a.y < b.y) {
149 top = a.y;
150 height = b.y - top;
151 } else {
152 top = b.y;
153 height = a.y - top;
154 }
155
156 return new Rect(left, top, width, height);
157 }
158 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698