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 19 void SkIRect::join(int32_t left, int32_t top, int32_t right, int32_t bottom) 20 { 21 // do nothing if the params are empty 22 if (left >= right || top >= bottom) 23 return; 24 25 // if we are empty, just assign 26 if (fLeft >= fRight || fTop >= fBottom) 27 this->set(left, top, right, bottom); 28 else 29 { 30 if (left < fLeft) fLeft = left; 31 if (top < fTop) fTop = top; 32 if (right > fRight) fRight = right; 33 if (bottom > fBottom) fBottom = bottom; 34 } 35 } 36 37 void SkIRect::sort() 38 { 39 if (fLeft > fRight) 40 SkTSwap<int32_t>(fLeft, fRight); 41 if (fTop > fBottom) 42 SkTSwap<int32_t>(fTop, fBottom); 43 } 44 45 ///////////////////////////////////////////////////////////////////////////// 46 47 void SkRect::sort() 48 { 49 if (fLeft > fRight) 50 SkTSwap<SkScalar>(fLeft, fRight); 51 if (fTop > fBottom) 52 SkTSwap<SkScalar>(fTop, fBottom); 53 } 54 55 void SkRect::toQuad(SkPoint quad[4]) const 56 { 57 SkASSERT(quad); 58 59 quad[0].set(fLeft, fTop); 60 quad[1].set(fRight, fTop); 61 quad[2].set(fRight, fBottom); 62 quad[3].set(fLeft, fBottom); 63 } 64 65 void SkRect::set(const SkPoint pts[], int count) 66 { 67 SkASSERT((pts && count > 0) || count == 0); 68 69 if (count <= 0) { 70 sk_bzero(this, sizeof(SkRect)); 71 } else { 72 #ifdef SK_SCALAR_SLOW_COMPARES 73 int32_t l, t, r, b; 74 75 l = r = SkScalarAs2sCompliment(pts[0].fX); 76 t = b = SkScalarAs2sCompliment(pts[0].fY); 77 78 for (int i = 1; i < count; i++) { 79 int32_t x = SkScalarAs2sCompliment(pts[i].fX); 80 int32_t y = SkScalarAs2sCompliment(pts[i].fY); 81 82 if (x < l) l = x; else if (x > r) r = x; 83 if (y < t) t = y; else if (y > b) b = y; 84 } 85 this->set(Sk2sComplimentAsScalar(l), 86 Sk2sComplimentAsScalar(t), 87 Sk2sComplimentAsScalar(r), 88 Sk2sComplimentAsScalar(b)); 89 #else 90 SkScalar l, t, r, b; 91 92 l = r = pts[0].fX; 93 t = b = pts[0].fY; 94 95 for (int i = 1; i < count; i++) { 96 SkScalar x = pts[i].fX; 97 SkScalar y = pts[i].fY; 98 99 if (x < l) l = x; else if (x > r) r = x; 100 if (y < t) t = y; else if (y > b) b = y; 101 } 102 this->set(l, t, r, b); 103 #endif 104 } 105 } 106 107 bool SkRect::intersect(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom) 108 { 109 if (left < right && top < bottom && !this->isEmpty() && // check for empties 110 fLeft < right && left < fRight && fTop < bottom && top < fBottom) 111 { 112 if (fLeft < left) fLeft = left; 113 if (fTop < top) fTop = top; 114 if (fRight > right) fRight = right; 115 if (fBottom > bottom) fBottom = bottom; 116 return true; 117 } 118 return false; 119 } 120 121 bool SkRect::intersect(const SkRect& r) 122 { 123 SkASSERT(&r); 124 return this->intersect(r.fLeft, r.fTop, r.fRight, r.fBottom); 125 } 126 127 void SkRect::join(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom) 128 { 129 // do nothing if the params are empty 130 if (left >= right || top >= bottom) 131 return; 132 133 // if we are empty, just assign 134 if (fLeft >= fRight || fTop >= fBottom) 135 this->set(left, top, right, bottom); 136 else 137 { 138 if (left < fLeft) fLeft = left; 139 if (top < fTop) fTop = top; 140 if (right > fRight) fRight = right; 141 if (bottom > fBottom) fBottom = bottom; 142 } 143 } 144 145 146