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