14e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com/*
24e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com * Copyright 2012 Google Inc.
34e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com *
44e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com * Use of this source code is governed by a BSD-style license that can be
54e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com * found in the LICENSE file.
64e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com */
74e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
84e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com#include "gm.h"
9707bd60203ba6d89aaa3061efdba09cefd5b5575bsalomon@google.com#if SK_SUPPORT_GPU
10fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org#include "GrTest.h"
11707bd60203ba6d89aaa3061efdba09cefd5b5575bsalomon@google.com#include "effects/GrRRectEffect.h"
12707bd60203ba6d89aaa3061efdba09cefd5b5575bsalomon@google.com#endif
13fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org#include "SkDevice.h"
144e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com#include "SkRRect.h"
154e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
164e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.comnamespace skiagm {
174e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
184e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com///////////////////////////////////////////////////////////////////////////////
194e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
204e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.comclass RRectGM : public GM {
214e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.compublic:
22fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org    enum Type {
23fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        kBW_Draw_Type,
24fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        kAA_Draw_Type,
25fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        kBW_Clip_Type,
26fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        kAA_Clip_Type,
27fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        kEffect_Type,
28fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org    };
29fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org    RRectGM(Type type) : fType(type) {
304e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        this->setBGColor(0xFFDDDDDD);
314e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        this->setUpRRects();
324e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    }
334e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
344e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.comprotected:
35fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org    SkString onShortName() SK_OVERRIDE {
364e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        SkString name("rrect");
37fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        switch (fType) {
38fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org            case kBW_Draw_Type:
39fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                name.append("_draw_bw");
40fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                break;
41fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org            case kAA_Draw_Type:
42fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                name.append("_draw_aa");
43fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                break;
44fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org            case kBW_Clip_Type:
45fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                name.append("_clip_bw");
46fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                break;
47fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org            case kAA_Clip_Type:
48fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                name.append("_clip_aa");
49fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                break;
50fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org            case kEffect_Type:
51fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                name.append("_effect");
52fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                break;
534e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        }
544e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        return name;
554e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    }
564e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
57f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(kImageWidth, kImageHeight); }
584e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
59fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
60fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        if (kEffect_Type == fType) {
61a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org            return kGPUOnly_Flag | kSkipTiled_Flag;
62fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        } else {
63a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org            return kSkipTiled_Flag;
64fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        }
65fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org    }
664e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
67fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
68707bd60203ba6d89aaa3061efdba09cefd5b5575bsalomon@google.com#if SK_SUPPORT_GPU
699c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com        GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget();
709c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com        GrContext* context = rt ? rt->getContext() : NULL;
71fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        if (kEffect_Type == fType && NULL == context) {
72fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org            return;
73fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        }
74707bd60203ba6d89aaa3061efdba09cefd5b5575bsalomon@google.com#endif
754e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
76fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        SkPaint paint;
77fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        if (kAA_Draw_Type == fType) {
78fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org            paint.setAntiAlias(true);
79fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        }
80f1f66c0c8623805fdb88f09c0d87cbdd1745e12bskia.committer@gmail.com
81bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org        static const SkRect kMaxTileBound = SkRect::MakeWH(SkIntToScalar(kTileX),
82bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                                                           SkIntToScalar(kTileY));
83bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org#ifdef SK_DEBUG
84bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org        static const SkRect kMaxImageBound = SkRect::MakeWH(SkIntToScalar(kImageWidth),
85bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                                                            SkIntToScalar(kImageHeight));
86bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org#endif
874e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
88b0ba39d1ca80e95f749f06214d144b39d1b921bdbsalomon@google.com#if SK_SUPPORT_GPU
89b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        int lastEdgeType = (kEffect_Type == fType) ? kLast_GrProcessorEdgeType: 0;
90b0ba39d1ca80e95f749f06214d144b39d1b921bdbsalomon@google.com#else
91b0ba39d1ca80e95f749f06214d144b39d1b921bdbsalomon@google.com        int lastEdgeType = 0;
92b0ba39d1ca80e95f749f06214d144b39d1b921bdbsalomon@google.com#endif
93bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org
94bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org        int y = 1;
95b0ba39d1ca80e95f749f06214d144b39d1b921bdbsalomon@google.com        for (int et = 0; et <= lastEdgeType; ++et) {
96bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org            int x = 1;
97bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org            for (int curRRect = 0; curRRect < kNumRRects; ++curRRect) {
98bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                bool drew = true;
99bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org#ifdef SK_DEBUG
100bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                SkASSERT(kMaxTileBound.contains(fRRects[curRRect].getBounds()));
101bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                SkRect imageSpaceBounds = fRRects[curRRect].getBounds();
102bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                imageSpaceBounds.offset(SkIntToScalar(x), SkIntToScalar(y));
103bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                SkASSERT(kMaxImageBound.contains(imageSpaceBounds));
104bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org#endif
1054e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com                canvas->save();
1064e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com                    canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
107fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                    if (kEffect_Type == fType) {
108707bd60203ba6d89aaa3061efdba09cefd5b5575bsalomon@google.com#if SK_SUPPORT_GPU
109fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                        GrTestTarget tt;
110fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                        context->getTestTarget(&tt);
111fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                        if (NULL == tt.target()) {
112fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                            SkDEBUGFAIL("Couldn't get Gr test target.");
113fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                            return;
114fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                        }
115fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                        GrDrawState* drawState = tt.target()->drawState();
116f1f66c0c8623805fdb88f09c0d87cbdd1745e12bskia.committer@gmail.com
117bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                        SkRRect rrect = fRRects[curRRect];
118fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                        rrect.offset(SkIntToScalar(x), SkIntToScalar(y));
119b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                        GrPrimitiveEdgeType edgeType = (GrPrimitiveEdgeType) et;
120b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                        SkAutoTUnref<GrFragmentProcessor> fp(GrRRectEffect::Create(edgeType,
121b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                                                                   rrect));
122b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                        if (fp) {
123b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                            drawState->addCoverageProcessor(fp);
124fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                            drawState->setIdentityViewMatrix();
125fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                            drawState->setRenderTarget(rt);
126fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                            drawState->setColor(0xff000000);
127fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org
128fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                            SkRect bounds = rrect.getBounds();
129fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                            bounds.outset(2.f, 2.f);
130f1f66c0c8623805fdb88f09c0d87cbdd1745e12bskia.committer@gmail.com
131fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                            tt.target()->drawSimpleRect(bounds);
132bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                        } else {
133bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                            drew = false;
134fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                        }
135707bd60203ba6d89aaa3061efdba09cefd5b5575bsalomon@google.com#endif
136fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                    } else if (kBW_Clip_Type == fType || kAA_Clip_Type == fType) {
137fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                        bool aaClip = (kAA_Clip_Type == fType);
138bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                        canvas->clipRRect(fRRects[curRRect], SkRegion::kReplace_Op, aaClip);
1394e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com                        canvas->drawRect(kMaxTileBound, paint);
1404e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com                    } else {
141bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                        canvas->drawRRect(fRRects[curRRect], paint);
1424e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com                    }
1434e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com                canvas->restore();
144bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                if (drew) {
145bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                    x = x + kTileX;
146bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                    if (x > kImageWidth) {
147bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                        x = 1;
148bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                        y += kTileY;
149bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                    }
150bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                }
151bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org            }
152bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org            if (x != 1) {
153bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                y += kTileY;
1544e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com            }
1554e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        }
1564e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    }
1574e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
1584e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    void setUpRRects() {
1597a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com        // each RRect must fit in a 0x0 -> (kTileX-2)x(kTileY-2) block. These will be tiled across
1604e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        // the screen in kTileX x kTileY tiles. The extra empty pixels on each side are for AA.
1614e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
1624e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        // simple cases
1634e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        fRRects[0].setRect(SkRect::MakeWH(kTileX-2, kTileY-2));
1644e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        fRRects[1].setOval(SkRect::MakeWH(kTileX-2, kTileY-2));
1654e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        fRRects[2].setRectXY(SkRect::MakeWH(kTileX-2, kTileY-2), 10, 10);
166c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org        fRRects[3].setRectXY(SkRect::MakeWH(kTileX-2, kTileY-2), 10, 5);
167c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org        // small circular corners are an interesting test case for gpu clipping
168c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org        fRRects[4].setRectXY(SkRect::MakeWH(kTileX-2, kTileY-2), 1, 1);
169c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org        fRRects[5].setRectXY(SkRect::MakeWH(kTileX-2, kTileY-2), 0.5f, 0.5f);
170c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org        fRRects[6].setRectXY(SkRect::MakeWH(kTileX-2, kTileY-2), 0.2f, 0.2f);
1714e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
1724e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        // The first complex case needs special handling since it is a square
1734e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        fRRects[kNumSimpleCases].setRectRadii(SkRect::MakeWH(kTileY-2, kTileY-2), gRadii[0]);
174f6100c8b1aba89027cf74da8a324a744fd1d53famike@reedtribe.org        for (size_t i = 1; i < SK_ARRAY_COUNT(gRadii); ++i) {
1754e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com            fRRects[kNumSimpleCases+i].setRectRadii(SkRect::MakeWH(kTileX-2, kTileY-2), gRadii[i]);
1764e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        }
1774e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    }
1784e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
1794e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.comprivate:
180fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org    Type fType;
181f1f66c0c8623805fdb88f09c0d87cbdd1745e12bskia.committer@gmail.com
1824e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    static const int kImageWidth = 640;
1834e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    static const int kImageHeight = 480;
1844e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
1854e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    static const int kTileX = 80;
1864e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    static const int kTileY = 40;
1874e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
188c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    static const int kNumSimpleCases = 7;
18904eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org    static const int kNumComplexCases = 35;
1905683d42d3aa9c0b2a680a1c4766205a06565f196robertphillips@google.com    static const SkVector gRadii[kNumComplexCases][4];
1914e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
1924e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    static const int kNumRRects = kNumSimpleCases + kNumComplexCases;
1934e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    SkRRect fRRects[kNumRRects];
1944e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
1954e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    typedef GM INHERITED;
1964e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com};
1974e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
1984e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com// Radii for the various test cases. Order is UL, UR, LR, LL
1994e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.comconst SkVector RRectGM::gRadii[kNumComplexCases][4] = {
2004e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    // a circle
2014e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { kTileY, kTileY }, { kTileY, kTileY }, { kTileY, kTileY }, { kTileY, kTileY } },
2024e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
2034e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    // odd ball cases
2044e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 8, 8 }, { 32, 32 }, { 8, 8 }, { 32, 32 } },
2054e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 16, 8 }, { 8, 16 }, { 16, 8 }, { 8, 16 } },
2064e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 16, 16 }, { 8, 8 }, { 32, 32 } },
2074e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
2084e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    // UL
2094e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 30, 30 }, { 0, 0 }, { 0, 0 }, { 0, 0 } },
2104e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 30, 15 }, { 0, 0 }, { 0, 0 }, { 0, 0 } },
2114e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 15, 30 }, { 0, 0 }, { 0, 0 }, { 0, 0 } },
2124e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
2134e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    // UR
2144e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 30, 30 }, { 0, 0 }, { 0, 0 } },
2154e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 30, 15 }, { 0, 0 }, { 0, 0 } },
2164e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 15, 30 }, { 0, 0 }, { 0, 0 } },
2174e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
2184e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    // LR
2194e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 0, 0 }, { 30, 30 }, { 0, 0 } },
2204e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 0, 0 }, { 30, 15 }, { 0, 0 } },
2214e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 0, 0 }, { 15, 30 }, { 0, 0 } },
2224e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
2234e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    // LL
2244e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 30, 30 } },
2254e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 30, 15 } },
2264e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 15, 30 } },
2274e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
2284e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    // over-sized radii
2294e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 100, 400 }, { 0, 0 }, { 0, 0 } },
2304e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 400, 400 }, { 0, 0 }, { 0, 0 } },
2314e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 400, 400 }, { 400, 400 }, { 400, 400 }, { 400, 400 } },
232cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org
233cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org    // circular corner tabs
234cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org    { { 0, 0 }, { 20, 20 }, { 20, 20 }, { 0, 0 } },
235cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org    { { 20, 20 }, { 20, 20 }, { 0, 0 }, { 0, 0 } },
236cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org    { { 0, 0 }, { 0, 0 }, { 20, 20 }, { 20, 20 } },
237cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org    { { 20, 20 }, { 0, 0 }, { 0, 0 }, { 20, 20 } },
238c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org
23904eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org    // small radius circular corner tabs
24004eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org    { { 0, 0 }, { 0.2f, 0.2f }, { 0.2f, 0.2f }, { 0, 0 } },
24104eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org    { { 0.3f, 0.3f }, { 0.3f, .3f }, { 0, 0 }, { 0, 0 } },
24204eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org
243c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org    // single circular corner cases
244c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org    { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 15, 15 } },
245c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org    { { 0, 0 }, { 0, 0 }, { 15, 15 }, { 0, 0 } },
246c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org    { { 0, 0 }, { 15, 15 }, { 0, 0 }, { 0, 0 } },
247c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org    { { 15, 15 }, { 0, 0 }, { 0, 0 }, { 0, 0 } },
248fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org
249fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org    // nine patch elliptical
250fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org    { { 5, 7 }, { 8, 7 }, { 8, 12 }, { 5, 12 } },
251fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org    { { 0, 7 }, { 8, 7 }, { 8, 12 }, { 0, 12 } },
25204eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org
25304eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org    // nine patch elliptical, small radii
25404eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org    { { 0.4f, 7 }, { 8, 7 }, { 8, 12 }, { 0.4f, 12 } },
25504eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org    { { 0.4f, 0.4f }, { 8, 0.4f }, { 8, 12 }, { 0.4f, 12 } },
25604eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org    { { 20, 0.4f }, { 18, 0.4f }, { 18, 0.4f }, { 20, 0.4f } },
25704eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org    { { 0.3f, 0.4f }, { 0.3f, 0.4f }, { 0.3f, 0.4f }, { 0.3f, 0.4f } },
25804eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org
2594e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com};
2604e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
2614e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com///////////////////////////////////////////////////////////////////////////////
2624e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
263fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.orgDEF_GM( return new RRectGM(RRectGM::kAA_Draw_Type); )
264fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.orgDEF_GM( return new RRectGM(RRectGM::kBW_Draw_Type); )
265fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.orgDEF_GM( return new RRectGM(RRectGM::kAA_Clip_Type); )
266fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.orgDEF_GM( return new RRectGM(RRectGM::kBW_Clip_Type); )
267707bd60203ba6d89aaa3061efdba09cefd5b5575bsalomon@google.com#if SK_SUPPORT_GPU
268fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.orgDEF_GM( return new RRectGM(RRectGM::kEffect_Type); )
269707bd60203ba6d89aaa3061efdba09cefd5b5575bsalomon@google.com#endif
2704e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
2714e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com}
272