SkRRect.cpp revision 20e3cd2c9fbc049eae8bcedc591c2cc8d4bed656
15985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com/* 25985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com * Copyright 2012 Google Inc. 35985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com * 45985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com * Use of this source code is governed by a BSD-style license that can be 55985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com * found in the LICENSE file. 65985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com */ 75985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 85985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com#include "SkRRect.h" 920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com#include "SkMatrix.h" 105985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 115985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com/////////////////////////////////////////////////////////////////////////////// 125985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 135985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.comvoid SkRRect::setRectXY(const SkRect& rect, SkScalar xRad, SkScalar yRad) { 145985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (rect.isEmpty()) { 155985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com this->setEmpty(); 165985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com return; 175985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 185985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 195985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (xRad <= 0 || yRad <= 0) { 205985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // all corners are square in this case 215985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com this->setRect(rect); 225985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com return; 235985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 245985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 255985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (rect.width() < xRad+xRad || rect.height() < yRad+yRad) { 265985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkScalar scale = SkMinScalar(SkScalarDiv(rect.width(), xRad + xRad), 275985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkScalarDiv(rect.height(), yRad + yRad)); 285985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkASSERT(scale < SK_Scalar1); 295985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com xRad = SkScalarMul(xRad, scale); 305985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com yRad = SkScalarMul(yRad, scale); 315985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 325985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 335985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com fRect = rect; 345985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com for (int i = 0; i < 4; ++i) { 355985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com fRadii[i].set(xRad, yRad); 365985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 375985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com fType = kSimple_Type; 385985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (xRad >= SkScalarHalf(fRect.width()) && yRad >= SkScalarHalf(fRect.height())) { 395985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com fType = kOval_Type; 405b33211c5edafde82af781beaa1dbc295000a62frobertphillips@google.com // TODO: assert that all the x&y radii are already W/2 & H/2 415985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 425985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 435985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkDEBUGCODE(this->validate();) 445985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com} 455985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 465985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.comvoid SkRRect::setRectRadii(const SkRect& rect, const SkVector radii[4]) { 475985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (rect.isEmpty()) { 485985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com this->setEmpty(); 495985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com return; 505985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 515985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 525985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com fRect = rect; 535985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com memcpy(fRadii, radii, sizeof(fRadii)); 545985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 555985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com bool allCornersSquare = true; 565985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 575985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // Clamp negative radii to zero 585985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com for (int i = 0; i < 4; ++i) { 595985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (fRadii[i].fX <= 0 || fRadii[i].fY <= 0) { 605985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // In this case we are being a little fast & loose. Since one of 615985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // the radii is 0 the corner is square. However, the other radii 625985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // could still be non-zero and play in the global scale factor 635985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // computation. 645985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com fRadii[i].fX = 0; 655985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com fRadii[i].fY = 0; 665985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } else { 675985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com allCornersSquare = false; 685985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 695985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 705985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 715985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (allCornersSquare) { 725985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com this->setRect(rect); 735985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com return; 745985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 755985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 765985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // Proportionally scale down all radii to fit. Find the minimum ratio 77c3d7d90973528527131c72549b10c2a21300e0acskia.committer@gmail.com // of a side and the radii on that side (for all four sides) and use 785985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // that to scale down _all_ the radii. This algorithm is from the 795985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // W3 spec (http://www.w3.org/TR/css3-background/) section 5.5 - Overlapping 805985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // Curves: 81c3d7d90973528527131c72549b10c2a21300e0acskia.committer@gmail.com // "Let f = min(Li/Si), where i is one of { top, right, bottom, left }, 825985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // Si is the sum of the two corresponding radii of the corners on side i, 83c3d7d90973528527131c72549b10c2a21300e0acskia.committer@gmail.com // and Ltop = Lbottom = the width of the box, 84c3d7d90973528527131c72549b10c2a21300e0acskia.committer@gmail.com // and Lleft = Lright = the height of the box. 855985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // If f < 1, then all corner radii are reduced by multiplying them by f." 865985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkScalar scale = SK_Scalar1; 875985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 885985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (fRadii[0].fX + fRadii[1].fX > rect.width()) { 895985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com scale = SkMinScalar(scale, 905985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkScalarDiv(rect.width(), fRadii[0].fX + fRadii[1].fX)); 915985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 925985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (fRadii[1].fY + fRadii[2].fY > rect.height()) { 935985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com scale = SkMinScalar(scale, 945985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkScalarDiv(rect.height(), fRadii[1].fY + fRadii[2].fY)); 955985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 965985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (fRadii[2].fX + fRadii[3].fX > rect.width()) { 975985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com scale = SkMinScalar(scale, 985985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkScalarDiv(rect.width(), fRadii[2].fX + fRadii[3].fX)); 995985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 1005985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (fRadii[3].fY + fRadii[0].fY > rect.height()) { 1015985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com scale = SkMinScalar(scale, 1025985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkScalarDiv(rect.height(), fRadii[3].fY + fRadii[0].fY)); 1035985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 1045985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1055985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (scale < SK_Scalar1) { 1065985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com for (int i = 0; i < 4; ++i) { 1075985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com fRadii[i].fX = SkScalarMul(fRadii[i].fX, scale); 1085985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com fRadii[i].fY = SkScalarMul(fRadii[i].fY, scale); 1095985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 1105985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 1115985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1125985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // At this point we're either oval, simple, or complex (not empty or rect) 1135985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // but we lazily resolve the type to avoid the work if the information 1145985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // isn't required. 1155985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com fType = (SkRRect::Type) kUnknown_Type; 1165985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1175985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkDEBUGCODE(this->validate();) 1185985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com} 1195985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1202cf444f7040614b43af67e368f3aa636ebeaa45askia.committer@gmail.com// This method determines if a point known to be inside the RRect's bounds is 12132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com// inside all the corners. 12232c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.combool SkRRect::checkCornerContainment(SkScalar x, SkScalar y) const { 1235985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkPoint canonicalPt; // (x,y) translated to one of the quadrants 1245985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com int index; 1255985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1265985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (kOval_Type == this->type()) { 1275985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com canonicalPt.set(x - fRect.centerX(), y - fRect.centerY()); 1285985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com index = kUpperLeft_Corner; // any corner will do in this case 1295985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } else { 130c3d7d90973528527131c72549b10c2a21300e0acskia.committer@gmail.com if (x < fRect.fLeft + fRadii[kUpperLeft_Corner].fX && 1315985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com y < fRect.fTop + fRadii[kUpperLeft_Corner].fY) { 1325985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // UL corner 1335985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com index = kUpperLeft_Corner; 1345985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com canonicalPt.set(x - (fRect.fLeft + fRadii[kUpperLeft_Corner].fX), 1355985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com y - (fRect.fTop + fRadii[kUpperLeft_Corner].fY)); 1365985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkASSERT(canonicalPt.fX < 0 && canonicalPt.fY < 0); 1375985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } else if (x < fRect.fLeft + fRadii[kLowerLeft_Corner].fX && 1385985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com y > fRect.fBottom - fRadii[kLowerLeft_Corner].fY) { 1395985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // LL corner 1405985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com index = kLowerLeft_Corner; 1415985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com canonicalPt.set(x - (fRect.fLeft + fRadii[kLowerLeft_Corner].fX), 1425985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com y - (fRect.fBottom - fRadii[kLowerLeft_Corner].fY)); 1435985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkASSERT(canonicalPt.fX < 0 && canonicalPt.fY > 0); 1445985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } else if (x > fRect.fRight - fRadii[kUpperRight_Corner].fX && 1455985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com y < fRect.fTop + fRadii[kUpperRight_Corner].fY) { 1465985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // UR corner 1475985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com index = kUpperRight_Corner; 1485985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com canonicalPt.set(x - (fRect.fRight - fRadii[kUpperRight_Corner].fX), 1495985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com y - (fRect.fTop + fRadii[kUpperRight_Corner].fY)); 1505985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkASSERT(canonicalPt.fX > 0 && canonicalPt.fY < 0); 1515985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } else if (x > fRect.fRight - fRadii[kLowerRight_Corner].fX && 1525985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com y > fRect.fBottom - fRadii[kLowerRight_Corner].fY) { 1535985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // LR corner 1545985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com index = kLowerRight_Corner; 1555985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com canonicalPt.set(x - (fRect.fRight - fRadii[kLowerRight_Corner].fX), 1565985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com y - (fRect.fBottom - fRadii[kLowerRight_Corner].fY)); 1575985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkASSERT(canonicalPt.fX > 0 && canonicalPt.fY > 0); 1585985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } else { 1595985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // not in any of the corners 1605985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com return true; 1615985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 1625985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 1635985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1645985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // A point is in an ellipse (in standard position) if: 1655985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // x^2 y^2 1665985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // ----- + ----- <= 1 1675985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // a^2 b^2 16832c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // or : 16932c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // b^2*x^2 + a^2*y^2 <= (ab)^2 17032c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com SkScalar dist = SkScalarMul(SkScalarSquare(canonicalPt.fX), SkScalarSquare(fRadii[index].fY)) + 17132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com SkScalarMul(SkScalarSquare(canonicalPt.fY), SkScalarSquare(fRadii[index].fX)); 17232c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com return dist <= SkScalarSquare(SkScalarMul(fRadii[index].fX, fRadii[index].fY)); 17332c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com} 17432c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com 17532c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.combool SkRRect::contains(const SkRect& rect) const { 17632c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com if (!this->getBounds().contains(rect)) { 17732c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // If 'rect' isn't contained by the RR's bounds then the 17832c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // RR definitely doesn't contain it 17932c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com return false; 18032c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com } 18132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com 18232c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com if (this->isRect()) { 18332c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // the prior test was sufficient 18432c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com return true; 18532c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com } 18632c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com 18732c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // At this point we know all four corners of 'rect' are inside the 18832c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // bounds of of this RR. Check to make sure all the corners are inside 18932c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // all the curves 19032c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com return this->checkCornerContainment(rect.fLeft, rect.fTop) && 19132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com this->checkCornerContainment(rect.fRight, rect.fTop) && 19232c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com this->checkCornerContainment(rect.fRight, rect.fBottom) && 19332c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com this->checkCornerContainment(rect.fLeft, rect.fBottom); 1945985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com} 1955985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1965985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com// There is a simplified version of this method in setRectXY 1975985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.comvoid SkRRect::computeType() const { 1985985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkDEBUGCODE(this->validate();) 1995985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2005985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (fRect.isEmpty()) { 2015985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com fType = kEmpty_Type; 2025985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com return; 2035985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 2045985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2055985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com bool allRadiiEqual = true; // are all x radii equal and all y radii? 2065985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com bool allCornersSquare = 0 == fRadii[0].fX || 0 == fRadii[0].fY; 2075985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2085985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com for (int i = 1; i < 4; ++i) { 2095985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (0 != fRadii[i].fX && 0 != fRadii[i].fY) { 2105985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // if either radius is zero the corner is square so both have to 2115985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // be non-zero to have a rounded corner 2125985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com allCornersSquare = false; 2135985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 2145985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (fRadii[i].fX != fRadii[i-1].fX || fRadii[i].fY != fRadii[i-1].fY) { 2155985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com allRadiiEqual = false; 2165985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 2175985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 2185985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2195985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (allCornersSquare) { 2205985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com fType = kRect_Type; 2215985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com return; 2225985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 2235985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2245985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (allRadiiEqual) { 2255985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (fRadii[0].fX >= SkScalarHalf(fRect.width()) && 2265985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com fRadii[0].fY >= SkScalarHalf(fRect.height())) { 2275985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com fType = kOval_Type; 2285985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } else { 2295985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com fType = kSimple_Type; 2305985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 2315985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com return; 2325985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 2335985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2345985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com fType = kComplex_Type; 2355985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com} 2365985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 23720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.comstatic bool matrix_only_scale_and_translate(const SkMatrix& matrix) { 23820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com const SkMatrix::TypeMask m = (SkMatrix::TypeMask) (SkMatrix::kAffine_Mask 23920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com | SkMatrix::kPerspective_Mask); 24020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com return (matrix.getType() & m) == 0; 24120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com} 24220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 24320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.combool SkRRect::transform(const SkMatrix& matrix, SkRRect* dst) const { 24420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com if (NULL == dst) { 24520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com return false; 24620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com } 24720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 24820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Assert that the caller is not trying to do this in place, which 24920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // would violate const-ness. Do not return false though, so that 25020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // if they know what they're doing and want to violate it they can. 25120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkASSERT(dst != this); 25220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 25320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com if (matrix.isIdentity()) { 25420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com *dst = *this; 25520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com return true; 25620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com } 25720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 25820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // If transform supported 90 degree rotations (which it could), we could 25920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // use SkMatrix::rectStaysRect() to check for a valid transformation. 26020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com if (!matrix_only_scale_and_translate(matrix)) { 26120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com return false; 26220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com } 26320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 26420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkRect newRect; 26520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com if (!matrix.mapRect(&newRect, fRect)) { 26620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com return false; 26720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com } 26820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 26920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // At this point, this is guaranteed to succeed, so we can modify dst. 27020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com dst->fRect = newRect; 27120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 27220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Now scale each corner 27320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkScalar xScale = matrix.getScaleX(); 27420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com const bool flipX = xScale < 0; 27520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com if (flipX) { 27620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com xScale = -xScale; 27720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com } 27820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkScalar yScale = matrix.getScaleY(); 27920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com const bool flipY = yScale < 0; 28020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com if (flipY) { 28120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com yScale = -yScale; 28220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com } 28320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 28420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Scale the radii without respecting the flip. 28520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com for (int i = 0; i < 4; ++i) { 28620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com dst->fRadii[i].fX = SkScalarMul(fRadii[i].fX, xScale); 28720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com dst->fRadii[i].fY = SkScalarMul(fRadii[i].fY, yScale); 28820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com } 28920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 29020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Now swap as necessary. 29120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com if (flipX) { 29220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com if (flipY) { 29320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Swap with opposite corners 29420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkTSwap(dst->fRadii[kUpperLeft_Corner], dst->fRadii[kLowerRight_Corner]); 29520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkTSwap(dst->fRadii[kUpperRight_Corner], dst->fRadii[kLowerLeft_Corner]); 29620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com } else { 29720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Only swap in x 29820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkTSwap(dst->fRadii[kUpperRight_Corner], dst->fRadii[kUpperLeft_Corner]); 29920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkTSwap(dst->fRadii[kLowerRight_Corner], dst->fRadii[kLowerLeft_Corner]); 30020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com } 30120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com } else if (flipY) { 30220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Only swap in y 30320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkTSwap(dst->fRadii[kUpperLeft_Corner], dst->fRadii[kLowerLeft_Corner]); 30420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkTSwap(dst->fRadii[kUpperRight_Corner], dst->fRadii[kLowerRight_Corner]); 30520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com } 30620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 30720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Since the only transforms that were allowed are scale and translate, the type 30820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // remains unchanged. 30920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com dst->fType = fType; 31020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 31120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkDEBUGCODE(dst->validate();) 31220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 31320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com return true; 31420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com} 31520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 3164ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com/////////////////////////////////////////////////////////////////////////////// 31737071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org 318bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.orgvoid SkRRect::inset(SkScalar dx, SkScalar dy, SkRRect* dst) const { 31937071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org SkRect r = fRect; 3201a60dab449ee8ab3b4c4330a18fae57b5980363eskia.committer@gmail.com 32137071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org r.inset(dx, dy); 32237071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org if (r.isEmpty()) { 32337071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org dst->setEmpty(); 32437071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org return; 32537071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org } 32637071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org 32737071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org SkVector radii[4]; 328bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org memcpy(radii, fRadii, sizeof(radii)); 32937071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org for (int i = 0; i < 4; ++i) { 330bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org if (radii[i].fX) { 331bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org radii[i].fX -= dx; 332bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org } 333bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org if (radii[i].fY) { 334bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org radii[i].fY -= dy; 335bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org } 33637071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org } 33737071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org dst->setRectRadii(r, radii); 33837071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org} 339bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org 34037071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org/////////////////////////////////////////////////////////////////////////////// 34137071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org 3424faa869cdabbdcf4867118b4a1272296baaeeb52commit-bot@chromium.orgsize_t SkRRect::writeToMemory(void* buffer) const { 3434ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com SkASSERT(kSizeInMemory == sizeof(SkRect) + sizeof(fRadii)); 3444ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 3454ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com memcpy(buffer, &fRect, sizeof(SkRect)); 3464ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com memcpy((char*)buffer + sizeof(SkRect), fRadii, sizeof(fRadii)); 3474ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com return kSizeInMemory; 3484ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 3494ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 3504faa869cdabbdcf4867118b4a1272296baaeeb52commit-bot@chromium.orgsize_t SkRRect::readFromMemory(const void* buffer, size_t length) { 3514faa869cdabbdcf4867118b4a1272296baaeeb52commit-bot@chromium.org if (length < kSizeInMemory) { 3524faa869cdabbdcf4867118b4a1272296baaeeb52commit-bot@chromium.org return 0; 3534faa869cdabbdcf4867118b4a1272296baaeeb52commit-bot@chromium.org } 3544faa869cdabbdcf4867118b4a1272296baaeeb52commit-bot@chromium.org 3554ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com SkScalar storage[12]; 3564ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com SkASSERT(sizeof(storage) == kSizeInMemory); 3574ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 3584ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com // we make a local copy, to ensure alignment before we cast 3594ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com memcpy(storage, buffer, kSizeInMemory); 3604ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 3614ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->setRectRadii(*(const SkRect*)&storage[0], 3624ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com (const SkVector*)&storage[4]); 3634ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com return kSizeInMemory; 3644ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 3654ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 3664ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com/////////////////////////////////////////////////////////////////////////////// 3674ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 3685985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com#ifdef SK_DEBUG 3695985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.comvoid SkRRect::validate() const { 3705985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com bool allRadiiZero = (0 == fRadii[0].fX && 0 == fRadii[0].fY); 3715985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com bool allCornersSquare = (0 == fRadii[0].fX || 0 == fRadii[0].fY); 3725985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com bool allRadiiSame = true; 3735985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 3745985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com for (int i = 1; i < 4; ++i) { 3755985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (0 != fRadii[i].fX || 0 != fRadii[i].fY) { 3765985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com allRadiiZero = false; 3775985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 3785985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 3795985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (fRadii[i].fX != fRadii[i-1].fX || fRadii[i].fY != fRadii[i-1].fY) { 3805985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com allRadiiSame = false; 3815985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 3825985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 3835985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com if (0 != fRadii[i].fX && 0 != fRadii[i].fY) { 3845985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com allCornersSquare = false; 3855985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 3865985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 3875985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 3885985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com switch (fType) { 3895985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com case kEmpty_Type: 3905985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkASSERT(fRect.isEmpty()); 3915985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkASSERT(allRadiiZero && allRadiiSame && allCornersSquare); 3925985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 393c3d7d90973528527131c72549b10c2a21300e0acskia.committer@gmail.com SkASSERT(0 == fRect.fLeft && 0 == fRect.fTop && 3945985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 0 == fRect.fRight && 0 == fRect.fBottom); 3955985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com break; 3965985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com case kRect_Type: 3975985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkASSERT(!fRect.isEmpty()); 3985985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkASSERT(allRadiiZero && allRadiiSame && allCornersSquare); 3995985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com break; 4005985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com case kOval_Type: 4015985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkASSERT(!fRect.isEmpty()); 4025985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkASSERT(!allRadiiZero && allRadiiSame && !allCornersSquare); 4035985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 4045985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com for (int i = 0; i < 4; ++i) { 4055985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkASSERT(SkScalarNearlyEqual(fRadii[i].fX, SkScalarHalf(fRect.width()))); 4065985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkASSERT(SkScalarNearlyEqual(fRadii[i].fY, SkScalarHalf(fRect.height()))); 4075985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 4085985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com break; 4095985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com case kSimple_Type: 4105985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkASSERT(!fRect.isEmpty()); 4115985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkASSERT(!allRadiiZero && allRadiiSame && !allCornersSquare); 4125985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com break; 4135985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com case kComplex_Type: 4145985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkASSERT(!fRect.isEmpty()); 4155985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkASSERT(!allRadiiZero && !allRadiiSame && !allCornersSquare); 4165985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com break; 4175985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com case kUnknown_Type: 4185985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // no limits on this 4195985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com break; 4205985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 4215985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com} 4225985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com#endif // SK_DEBUG 4235985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 4245985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com/////////////////////////////////////////////////////////////////////////////// 425