1 /*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "SkRect.h"
18
join(int32_t left,int32_t top,int32_t right,int32_t bottom)19 void SkIRect::join(int32_t left, int32_t top, int32_t right, int32_t bottom) {
20 // do nothing if the params are empty
21 if (left >= right || top >= bottom) {
22 return;
23 }
24
25 // if we are empty, just assign
26 if (fLeft >= fRight || fTop >= fBottom) {
27 this->set(left, top, right, bottom);
28 } else {
29 if (left < fLeft) fLeft = left;
30 if (top < fTop) fTop = top;
31 if (right > fRight) fRight = right;
32 if (bottom > fBottom) fBottom = bottom;
33 }
34 }
35
sort()36 void SkIRect::sort() {
37 if (fLeft > fRight) {
38 SkTSwap<int32_t>(fLeft, fRight);
39 }
40 if (fTop > fBottom) {
41 SkTSwap<int32_t>(fTop, fBottom);
42 }
43 }
44
45 /////////////////////////////////////////////////////////////////////////////
46
hasValidCoordinates() const47 bool SkRect::hasValidCoordinates() const {
48 return SkScalarIsFinite(fLeft) &&
49 SkScalarIsFinite(fTop) &&
50 SkScalarIsFinite(fRight) &&
51 SkScalarIsFinite(fBottom);
52 }
53
sort()54 void SkRect::sort() {
55 if (fLeft > fRight) {
56 SkTSwap<SkScalar>(fLeft, fRight);
57 }
58 if (fTop > fBottom) {
59 SkTSwap<SkScalar>(fTop, fBottom);
60 }
61 }
62
toQuad(SkPoint quad[4]) const63 void SkRect::toQuad(SkPoint quad[4]) const {
64 SkASSERT(quad);
65
66 quad[0].set(fLeft, fTop);
67 quad[1].set(fRight, fTop);
68 quad[2].set(fRight, fBottom);
69 quad[3].set(fLeft, fBottom);
70 }
71
set(const SkPoint pts[],int count)72 void SkRect::set(const SkPoint pts[], int count) {
73 SkASSERT((pts && count > 0) || count == 0);
74
75 if (count <= 0) {
76 sk_bzero(this, sizeof(SkRect));
77 } else {
78 #ifdef SK_SCALAR_SLOW_COMPARES
79 int32_t l, t, r, b;
80
81 l = r = SkScalarAs2sCompliment(pts[0].fX);
82 t = b = SkScalarAs2sCompliment(pts[0].fY);
83
84 for (int i = 1; i < count; i++) {
85 int32_t x = SkScalarAs2sCompliment(pts[i].fX);
86 int32_t y = SkScalarAs2sCompliment(pts[i].fY);
87
88 if (x < l) l = x; else if (x > r) r = x;
89 if (y < t) t = y; else if (y > b) b = y;
90 }
91 this->set(Sk2sComplimentAsScalar(l),
92 Sk2sComplimentAsScalar(t),
93 Sk2sComplimentAsScalar(r),
94 Sk2sComplimentAsScalar(b));
95 #else
96 SkScalar l, t, r, b;
97
98 l = r = pts[0].fX;
99 t = b = pts[0].fY;
100
101 for (int i = 1; i < count; i++) {
102 SkScalar x = pts[i].fX;
103 SkScalar y = pts[i].fY;
104
105 if (x < l) l = x; else if (x > r) r = x;
106 if (y < t) t = y; else if (y > b) b = y;
107 }
108 this->set(l, t, r, b);
109 #endif
110 }
111 }
112
intersect(SkScalar left,SkScalar top,SkScalar right,SkScalar bottom)113 bool SkRect::intersect(SkScalar left, SkScalar top, SkScalar right,
114 SkScalar bottom) {
115 if (left < right && top < bottom && !this->isEmpty() && // check for empties
116 fLeft < right && left < fRight && fTop < bottom && top < fBottom)
117 {
118 if (fLeft < left) fLeft = left;
119 if (fTop < top) fTop = top;
120 if (fRight > right) fRight = right;
121 if (fBottom > bottom) fBottom = bottom;
122 return true;
123 }
124 return false;
125 }
126
intersect(const SkRect & r)127 bool SkRect::intersect(const SkRect& r) {
128 SkASSERT(&r);
129 return this->intersect(r.fLeft, r.fTop, r.fRight, r.fBottom);
130 }
131
join(SkScalar left,SkScalar top,SkScalar right,SkScalar bottom)132 void SkRect::join(SkScalar left, SkScalar top, SkScalar right,
133 SkScalar bottom) {
134 // do nothing if the params are empty
135 if (left >= right || top >= bottom) {
136 return;
137 }
138
139 // if we are empty, just assign
140 if (fLeft >= fRight || fTop >= fBottom) {
141 this->set(left, top, right, bottom);
142 } else {
143 if (left < fLeft) fLeft = left;
144 if (top < fTop) fTop = top;
145 if (right > fRight) fRight = right;
146 if (bottom > fBottom) fBottom = bottom;
147 }
148 }
149
150