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 19void 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 37void 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 47void SkRect::sort() 48{ 49 if (fLeft > fRight) 50 SkTSwap<SkScalar>(fLeft, fRight); 51 if (fTop > fBottom) 52 SkTSwap<SkScalar>(fTop, fBottom); 53} 54 55void 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 65void 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 107bool 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 121bool SkRect::intersect(const SkRect& r) 122{ 123 SkASSERT(&r); 124 return this->intersect(r.fLeft, r.fTop, r.fRight, r.fBottom); 125} 126 127void 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