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"
933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h"
10707bd60203ba6d89aaa3061efdba09cefd5b5575bsalomon@google.com#if SK_SUPPORT_GPU
1104194f32f4f5ec9029357a18c0f1f9dc3404fc0cjoshualitt#include "GrContext.h"
121105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman#include "GrRenderTargetContextPriv.h"
13707bd60203ba6d89aaa3061efdba09cefd5b5575bsalomon@google.com#include "effects/GrRRectEffect.h"
14895274391db8df7357334aec260edca2e1735626Brian Salomon#include "ops/GrDrawOp.h"
15895274391db8df7357334aec260edca2e1735626Brian Salomon#include "ops/GrRectOpFactory.h"
16707bd60203ba6d89aaa3061efdba09cefd5b5575bsalomon@google.com#endif
174e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com#include "SkRRect.h"
184e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
194e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.comnamespace skiagm {
204e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
214e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com///////////////////////////////////////////////////////////////////////////////
224e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
234e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.comclass RRectGM : public GM {
244e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.compublic:
25fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org    enum Type {
26fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        kBW_Draw_Type,
27fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        kAA_Draw_Type,
28fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        kBW_Clip_Type,
29fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        kAA_Clip_Type,
30fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        kEffect_Type,
31fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org    };
32b10fe4941b08172378d3d1928959122f106ced37herb    RRectGM(Type type) : fType(type) { }
33b10fe4941b08172378d3d1928959122f106ced37herb
34b10fe4941b08172378d3d1928959122f106ced37herbprotected:
35b10fe4941b08172378d3d1928959122f106ced37herb
36b10fe4941b08172378d3d1928959122f106ced37herb    void onOnceBeforeDraw() override {
3765cdba6ba78aaec0c0a4596bb5941020c789482bcaryclark        this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
384e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        this->setUpRRects();
394e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    }
404e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
4136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
424e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        SkString name("rrect");
43fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        switch (fType) {
44fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org            case kBW_Draw_Type:
45fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                name.append("_draw_bw");
46fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                break;
47fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org            case kAA_Draw_Type:
48fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                name.append("_draw_aa");
49fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                break;
50fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org            case kBW_Clip_Type:
51fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                name.append("_clip_bw");
52fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                break;
53fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org            case kAA_Clip_Type:
54fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                name.append("_clip_aa");
55fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                break;
56fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org            case kEffect_Type:
57fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                name.append("_effect");
58fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                break;
594e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        }
604e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        return name;
614e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    }
624e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
6336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override { return SkISize::Make(kImageWidth, kImageHeight); }
644e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
6536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
661105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman        GrRenderTargetContext* renderTargetContext =
671105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman            canvas->internal_private_accessTopLayerRenderTargetContext();
681105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman        if (kEffect_Type == fType && !renderTargetContext) {
692a24338c777462e04a2b26295f9c034155ee8f3ehalcanary            skiagm::GM::DrawGpuOnlyMessage(canvas);
70fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org            return;
71fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        }
724e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
73fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        SkPaint paint;
74fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        if (kAA_Draw_Type == fType) {
75fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org            paint.setAntiAlias(true);
76fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org        }
77f1f66c0c8623805fdb88f09c0d87cbdd1745e12bskia.committer@gmail.com
78dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein        const SkRect kMaxTileBound = SkRect::MakeWH(SkIntToScalar(kTileX),
79dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein                                                     SkIntToScalar(kTileY));
80bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org#ifdef SK_DEBUG
81dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein        const SkRect kMaxImageBound = SkRect::MakeWH(SkIntToScalar(kImageWidth),
82dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein                                                     SkIntToScalar(kImageHeight));
83bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org#endif
844e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
85b0ba39d1ca80e95f749f06214d144b39d1b921bdbsalomon@google.com#if SK_SUPPORT_GPU
86b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        int lastEdgeType = (kEffect_Type == fType) ? kLast_GrProcessorEdgeType: 0;
87b0ba39d1ca80e95f749f06214d144b39d1b921bdbsalomon@google.com#else
88b0ba39d1ca80e95f749f06214d144b39d1b921bdbsalomon@google.com        int lastEdgeType = 0;
89b0ba39d1ca80e95f749f06214d144b39d1b921bdbsalomon@google.com#endif
90bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org
91bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org        int y = 1;
92b0ba39d1ca80e95f749f06214d144b39d1b921bdbsalomon@google.com        for (int et = 0; et <= lastEdgeType; ++et) {
93bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org            int x = 1;
94bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org            for (int curRRect = 0; curRRect < kNumRRects; ++curRRect) {
95bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                bool drew = true;
96bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org#ifdef SK_DEBUG
97bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                SkASSERT(kMaxTileBound.contains(fRRects[curRRect].getBounds()));
98bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                SkRect imageSpaceBounds = fRRects[curRRect].getBounds();
99bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                imageSpaceBounds.offset(SkIntToScalar(x), SkIntToScalar(y));
100bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                SkASSERT(kMaxImageBound.contains(imageSpaceBounds));
101bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org#endif
1024e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com                canvas->save();
1034e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com                    canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
104fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                    if (kEffect_Type == fType) {
105707bd60203ba6d89aaa3061efdba09cefd5b5575bsalomon@google.com#if SK_SUPPORT_GPU
106bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                        SkRRect rrect = fRRects[curRRect];
107fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                        rrect.offset(SkIntToScalar(x), SkIntToScalar(y));
108b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                        GrPrimitiveEdgeType edgeType = (GrPrimitiveEdgeType) et;
10906ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman                        sk_sp<GrFragmentProcessor> fp(GrRRectEffect::Make(edgeType, rrect));
110b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                        if (fp) {
11182f44319159bb98dcacdbbec7ea643dde5ed024bBrian Salomon                            GrPaint grPaint;
11282f44319159bb98dcacdbbec7ea643dde5ed024bBrian Salomon                            grPaint.setXPFactory(GrPorterDuffXPFactory::Get(SkBlendMode::kSrc));
11328a838e532250fcca9673aca6c4616193a5a139drobertphillips                            grPaint.addCoverageFragmentProcessor(std::move(fp));
114fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org
115fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                            SkRect bounds = rrect.getBounds();
116fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                            bounds.outset(2.f, 2.f);
117f1f66c0c8623805fdb88f09c0d87cbdd1745e12bskia.committer@gmail.com
118649a3411f99a8aea3c46e4ef1f495f61b9801164Brian Salomon                            std::unique_ptr<GrMeshDrawOp> op(GrRectOpFactory::MakeNonAAFill(
1196a639040bc3ee5369d86c9cb5b9047208beb5206Brian Salomon                                    0xff000000, SkMatrix::I(), bounds, nullptr, nullptr));
120649a3411f99a8aea3c46e4ef1f495f61b9801164Brian Salomon                            renderTargetContext->priv().testingOnly_addMeshDrawOp(
12182f44319159bb98dcacdbbec7ea643dde5ed024bBrian Salomon                                    std::move(grPaint), GrAAType::kNone, std::move(op));
122bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                        } else {
123bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                            drew = false;
124fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                        }
125707bd60203ba6d89aaa3061efdba09cefd5b5575bsalomon@google.com#endif
126fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                    } else if (kBW_Clip_Type == fType || kAA_Clip_Type == fType) {
127fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org                        bool aaClip = (kAA_Clip_Type == fType);
128669983856d99b9312be3166b7dd1f8483a90c315reed                        canvas->clipRRect(fRRects[curRRect], aaClip);
1294e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com                        canvas->drawRect(kMaxTileBound, paint);
1304e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com                    } else {
131bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                        canvas->drawRRect(fRRects[curRRect], paint);
1324e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com                    }
1334e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com                canvas->restore();
134bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                if (drew) {
135bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                    x = x + kTileX;
136bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                    if (x > kImageWidth) {
137bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                        x = 1;
138bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                        y += kTileY;
139bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                    }
140bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                }
141bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org            }
142bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org            if (x != 1) {
143bfce48e0bca2c92eca55f31511a3d6def1b5309fcommit-bot@chromium.org                y += kTileY;
1444e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com            }
1454e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        }
1464e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    }
1474e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
1484e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    void setUpRRects() {
1497a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com        // each RRect must fit in a 0x0 -> (kTileX-2)x(kTileY-2) block. These will be tiled across
1504e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        // the screen in kTileX x kTileY tiles. The extra empty pixels on each side are for AA.
1514e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
1524e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        // simple cases
1534e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        fRRects[0].setRect(SkRect::MakeWH(kTileX-2, kTileY-2));
1544e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        fRRects[1].setOval(SkRect::MakeWH(kTileX-2, kTileY-2));
1554e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        fRRects[2].setRectXY(SkRect::MakeWH(kTileX-2, kTileY-2), 10, 10);
156c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org        fRRects[3].setRectXY(SkRect::MakeWH(kTileX-2, kTileY-2), 10, 5);
157c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org        // small circular corners are an interesting test case for gpu clipping
158c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org        fRRects[4].setRectXY(SkRect::MakeWH(kTileX-2, kTileY-2), 1, 1);
159c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org        fRRects[5].setRectXY(SkRect::MakeWH(kTileX-2, kTileY-2), 0.5f, 0.5f);
160c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org        fRRects[6].setRectXY(SkRect::MakeWH(kTileX-2, kTileY-2), 0.2f, 0.2f);
1614e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
1624e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        // The first complex case needs special handling since it is a square
1634e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        fRRects[kNumSimpleCases].setRectRadii(SkRect::MakeWH(kTileY-2, kTileY-2), gRadii[0]);
164f6100c8b1aba89027cf74da8a324a744fd1d53famike@reedtribe.org        for (size_t i = 1; i < SK_ARRAY_COUNT(gRadii); ++i) {
1654e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com            fRRects[kNumSimpleCases+i].setRectRadii(SkRect::MakeWH(kTileX-2, kTileY-2), gRadii[i]);
1664e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com        }
1674e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    }
1684e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
1694e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.comprivate:
170fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org    Type fType;
171f1f66c0c8623805fdb88f09c0d87cbdd1745e12bskia.committer@gmail.com
172dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    static constexpr int kImageWidth = 640;
173dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    static constexpr int kImageHeight = 480;
1744e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
175dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    static constexpr int kTileX = 80;
176dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    static constexpr int kTileY = 40;
1774e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
178dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    static constexpr int kNumSimpleCases = 7;
179dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    static constexpr int kNumComplexCases = 35;
1805683d42d3aa9c0b2a680a1c4766205a06565f196robertphillips@google.com    static const SkVector gRadii[kNumComplexCases][4];
1814e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
182dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    static constexpr int kNumRRects = kNumSimpleCases + kNumComplexCases;
1834e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    SkRRect fRRects[kNumRRects];
1844e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
1854e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    typedef GM INHERITED;
1864e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com};
1874e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
1884e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com// Radii for the various test cases. Order is UL, UR, LR, LL
1894e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.comconst SkVector RRectGM::gRadii[kNumComplexCases][4] = {
1904e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    // a circle
1914e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { kTileY, kTileY }, { kTileY, kTileY }, { kTileY, kTileY }, { kTileY, kTileY } },
1924e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
1934e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    // odd ball cases
1944e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 8, 8 }, { 32, 32 }, { 8, 8 }, { 32, 32 } },
1954e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 16, 8 }, { 8, 16 }, { 16, 8 }, { 8, 16 } },
1964e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 16, 16 }, { 8, 8 }, { 32, 32 } },
1974e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
1984e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    // UL
1994e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 30, 30 }, { 0, 0 }, { 0, 0 }, { 0, 0 } },
2004e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 30, 15 }, { 0, 0 }, { 0, 0 }, { 0, 0 } },
2014e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 15, 30 }, { 0, 0 }, { 0, 0 }, { 0, 0 } },
2024e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
2034e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    // UR
2044e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 30, 30 }, { 0, 0 }, { 0, 0 } },
2054e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 30, 15 }, { 0, 0 }, { 0, 0 } },
2064e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 15, 30 }, { 0, 0 }, { 0, 0 } },
2074e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
2084e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    // LR
2094e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 0, 0 }, { 30, 30 }, { 0, 0 } },
2104e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 0, 0 }, { 30, 15 }, { 0, 0 } },
2114e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 0, 0 }, { 15, 30 }, { 0, 0 } },
2124e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
2134e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    // LL
2144e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 30, 30 } },
2154e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 30, 15 } },
2164e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 15, 30 } },
2174e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
2184e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    // over-sized radii
2194e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 100, 400 }, { 0, 0 }, { 0, 0 } },
2204e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 0, 0 }, { 400, 400 }, { 0, 0 }, { 0, 0 } },
2214e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com    { { 400, 400 }, { 400, 400 }, { 400, 400 }, { 400, 400 } },
222cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org
223cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org    // circular corner tabs
224cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org    { { 0, 0 }, { 20, 20 }, { 20, 20 }, { 0, 0 } },
225cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org    { { 20, 20 }, { 20, 20 }, { 0, 0 }, { 0, 0 } },
226cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org    { { 0, 0 }, { 0, 0 }, { 20, 20 }, { 20, 20 } },
227cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org    { { 20, 20 }, { 0, 0 }, { 0, 0 }, { 20, 20 } },
228c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org
22904eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org    // small radius circular corner tabs
23004eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org    { { 0, 0 }, { 0.2f, 0.2f }, { 0.2f, 0.2f }, { 0, 0 } },
23104eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org    { { 0.3f, 0.3f }, { 0.3f, .3f }, { 0, 0 }, { 0, 0 } },
23204eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org
233c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org    // single circular corner cases
234c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org    { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 15, 15 } },
235c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org    { { 0, 0 }, { 0, 0 }, { 15, 15 }, { 0, 0 } },
236c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org    { { 0, 0 }, { 15, 15 }, { 0, 0 }, { 0, 0 } },
237c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org    { { 15, 15 }, { 0, 0 }, { 0, 0 }, { 0, 0 } },
238fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org
239fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org    // nine patch elliptical
240fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org    { { 5, 7 }, { 8, 7 }, { 8, 12 }, { 5, 12 } },
241fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org    { { 0, 7 }, { 8, 7 }, { 8, 12 }, { 0, 12 } },
24204eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org
24304eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org    // nine patch elliptical, small radii
24404eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org    { { 0.4f, 7 }, { 8, 7 }, { 8, 12 }, { 0.4f, 12 } },
24504eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org    { { 0.4f, 0.4f }, { 8, 0.4f }, { 8, 12 }, { 0.4f, 12 } },
24604eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org    { { 20, 0.4f }, { 18, 0.4f }, { 18, 0.4f }, { 20, 0.4f } },
24704eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org    { { 0.3f, 0.4f }, { 0.3f, 0.4f }, { 0.3f, 0.4f }, { 0.3f, 0.4f } },
24804eff72bf0d80392148ce7bb4967a9647ed5475ccommit-bot@chromium.org
2494e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com};
2504e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
2514e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com///////////////////////////////////////////////////////////////////////////////
2524e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
253fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.orgDEF_GM( return new RRectGM(RRectGM::kAA_Draw_Type); )
254fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.orgDEF_GM( return new RRectGM(RRectGM::kBW_Draw_Type); )
255fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.orgDEF_GM( return new RRectGM(RRectGM::kAA_Clip_Type); )
256fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.orgDEF_GM( return new RRectGM(RRectGM::kBW_Clip_Type); )
257707bd60203ba6d89aaa3061efdba09cefd5b5575bsalomon@google.com#if SK_SUPPORT_GPU
258fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.orgDEF_GM( return new RRectGM(RRectGM::kEffect_Type); )
259707bd60203ba6d89aaa3061efdba09cefd5b5575bsalomon@google.com#endif
2604e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com
2614e18c7a9bbef6ac949d535aa61dfe1462ebb4452robertphillips@google.com}
262