• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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