1c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org
2c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org/*
3c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org * Copyright 2014 Google Inc.
4c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org *
5c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
6c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org * found in the LICENSE file.
7c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org */
8c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org
9c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org// This test only works with the GPU backend.
10c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org
11c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org#include "gm.h"
12c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org
13c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org#if SK_SUPPORT_GPU
14c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org
15c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org#include "GrContext.h"
16c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org#include "GrPathUtils.h"
17c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org#include "GrTest.h"
18c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org#include "SkColorPriv.h"
19c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org#include "SkDevice.h"
20c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org#include "SkGeometry.h"
21c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org#include "SkTLList.h"
22c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org
23c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org#include "effects/GrConvexPolyEffect.h"
24c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org
25c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.orgnamespace {
26c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.orgextern const GrVertexAttrib kAttribs[] = {
27c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org    {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding},
28c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org};
29c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org}
30c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org
31c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.orgnamespace skiagm {
32c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org/**
33c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org * This GM directly exercises a GrEffect that draws convex polygons.
34c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org */
35c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.orgclass ConvexPolyEffect : public GM {
36c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.orgpublic:
37c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org    ConvexPolyEffect() {
38c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        this->setBGColor(0xFFFFFFFF);
39c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org    }
40c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org
41c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.orgprotected:
42c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org    virtual SkString onShortName() SK_OVERRIDE {
43c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        return SkString("convex_poly_effect");
44c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org    }
45c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org
46c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org    virtual SkISize onISize() SK_OVERRIDE {
47f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(720, 800);
48c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org    }
49c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org
50c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
51c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        // This is a GPU-specific GM.
52c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        return kGPUOnly_Flag;
53c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org    }
544c18e9fbb685cccf23342757e786027a032197daskia.committer@gmail.com
55c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org    virtual void onOnceBeforeDraw() SK_OVERRIDE {
56c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        SkPath tri;
57c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        tri.moveTo(5.f, 5.f);
58c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        tri.lineTo(100.f, 20.f);
59c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        tri.lineTo(15.f, 100.f);
604c18e9fbb685cccf23342757e786027a032197daskia.committer@gmail.com
61c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        fPaths.addToTail(tri);
62c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        fPaths.addToTail(SkPath())->reverseAddPath(tri);
634c18e9fbb685cccf23342757e786027a032197daskia.committer@gmail.com
64c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        tri.close();
65c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        fPaths.addToTail(tri);
664c18e9fbb685cccf23342757e786027a032197daskia.committer@gmail.com
67c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        SkPath ngon;
68c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        static const SkScalar kRadius = 50.f;
69c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        const SkPoint center = { kRadius, kRadius };
70c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        for (int i = 0; i < GrConvexPolyEffect::kMaxEdges; ++i) {
71c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            SkScalar angle = 2 * SK_ScalarPI * i / GrConvexPolyEffect::kMaxEdges;
72c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            SkPoint point;
73c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            point.fY = SkScalarSinCos(angle, &point.fX);
74c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            point.scale(kRadius);
75c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            point = center + point;
76c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            if (0 == i) {
77c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                ngon.moveTo(point);
78c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            } else {
79c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                ngon.lineTo(point);
80c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            }
81c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        }
824c18e9fbb685cccf23342757e786027a032197daskia.committer@gmail.com
83c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        fPaths.addToTail(ngon);
84c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        SkMatrix scaleM;
85c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        scaleM.setScale(1.1f, 0.4f);
86c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        ngon.transform(scaleM);
87c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        fPaths.addToTail(ngon);
88f0b0cda76fce5756aa12df4b807349e6dd85fd20skia.committer@gmail.com
89f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org        // integer edges
90f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org        fRects.addToTail(SkRect::MakeLTRB(5.f, 1.f, 30.f, 25.f));
91f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org        // half-integer edges
92f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org        fRects.addToTail(SkRect::MakeLTRB(5.5f, 0.5f, 29.5f, 24.5f));
93f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org        // vertically/horizontally thin rects that cover pixel centers
94f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org        fRects.addToTail(SkRect::MakeLTRB(5.25f, 0.5f, 5.75f, 24.5f));
95f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org        fRects.addToTail(SkRect::MakeLTRB(5.5f,  0.5f, 29.5f, 0.75f));
96f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org        // vertically/horizontally thin rects that don't cover pixel centers
97f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org        fRects.addToTail(SkRect::MakeLTRB(5.55f, 0.5f, 5.75f, 24.5f));
98f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org        fRects.addToTail(SkRect::MakeLTRB(5.5f, .05f, 29.5f, .25f));
99f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org        // small in x and y
100f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org        fRects.addToTail(SkRect::MakeLTRB(5.05f, .55f, 5.45f, .85f));
101f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org        // inverted in x and y
102f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org        fRects.addToTail(SkRect::MakeLTRB(100.f, 50.5f, 5.f, 0.5f));
103c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org    }
104c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org
105c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
1069c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com        GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget();
107c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        if (NULL == rt) {
108c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            return;
109c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        }
110c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        GrContext* context = rt->getContext();
111c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        if (NULL == context) {
112c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            return;
113c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        }
114c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org
115c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        SkScalar y = 0;
116c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        for (SkTLList<SkPath>::Iter iter(fPaths, SkTLList<SkPath>::Iter::kHead_IterStart);
117f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org             NULL != iter.get();
118c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org             iter.next()) {
119f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org            const SkPath* path = iter.get();
120c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            SkScalar x = 0;
121c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org
122cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org            for (int et = 0; et < kGrEffectEdgeTypeCnt; ++et) {
123c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                GrTestTarget tt;
124c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                context->getTestTarget(&tt);
125c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                if (NULL == tt.target()) {
126c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                    SkDEBUGFAIL("Couldn't get Gr test target.");
127c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                    return;
128c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                }
129c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                GrDrawState* drawState = tt.target()->drawState();
130c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                drawState->setVertexAttribs<kAttribs>(SK_ARRAY_COUNT(kAttribs));
1314c18e9fbb685cccf23342757e786027a032197daskia.committer@gmail.com
132c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                SkMatrix m;
133c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                SkPath p;
134c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                m.setTranslate(x, y);
135c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                path->transform(m, &p);
1364c18e9fbb685cccf23342757e786027a032197daskia.committer@gmail.com
137cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                GrEffectEdgeType edgeType = (GrEffectEdgeType) et;
138c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                SkAutoTUnref<GrEffectRef> effect(GrConvexPolyEffect::Create(edgeType, p));
139c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                if (!effect) {
140cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                    continue;
141c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                }
142c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                drawState->addCoverageEffect(effect, 1);
143c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                drawState->setIdentityViewMatrix();
144c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                drawState->setRenderTarget(rt);
145c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                drawState->setColor(0xff000000);
1464c18e9fbb685cccf23342757e786027a032197daskia.committer@gmail.com
147c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                SkPoint verts[4];
148c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                SkRect bounds = p.getBounds();
149c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                // Make sure any artifacts around the exterior of path are visible by using overly
150c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                // conservative bounding geometry.
151c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                bounds.outset(5.f, 5.f);
152c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                bounds.toQuad(verts);
153c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org
154c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                tt.target()->setVertexSourceToArray(verts, 4);
155c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                tt.target()->setIndexSourceToBuffer(context->getQuadIndexBuffer());
156c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org                tt.target()->drawIndexed(kTriangleFan_GrPrimitiveType, 0, 0, 4, 6);
1574c18e9fbb685cccf23342757e786027a032197daskia.committer@gmail.com
158f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org                x += SkScalarCeilToScalar(path->getBounds().width() + 10.f);
159c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            }
1604c18e9fbb685cccf23342757e786027a032197daskia.committer@gmail.com
161c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            // Draw AA and non AA paths using normal API for reference.
162c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            canvas->save();
163c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            canvas->translate(x, y);
164c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            SkPaint paint;
165c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            canvas->drawPath(*path, paint);
166c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            canvas->translate(path->getBounds().width() + 10.f, 0);
167c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            paint.setAntiAlias(true);
168c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            canvas->drawPath(*path, paint);
169c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org            canvas->restore();
1704c18e9fbb685cccf23342757e786027a032197daskia.committer@gmail.com
171f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org            y += SkScalarCeilToScalar(path->getBounds().height() + 20.f);
172f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org        }
173f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org
174f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org        for (SkTLList<SkRect>::Iter iter(fRects, SkTLList<SkRect>::Iter::kHead_IterStart);
175f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org             NULL != iter.get();
176f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org             iter.next()) {
177f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org
178f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org            SkScalar x = 0;
179f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org
180cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org            for (int et = 0; et < kGrEffectEdgeTypeCnt; ++et) {
181d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                GrTestTarget tt;
182d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                context->getTestTarget(&tt);
183d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                if (NULL == tt.target()) {
184d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                    SkDEBUGFAIL("Couldn't get Gr test target.");
185d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                    return;
186d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                }
187d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                SkRect rect = *iter.get();
188d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                rect.offset(x, y);
189cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                GrEffectEdgeType edgeType = (GrEffectEdgeType) et;
190d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                SkAutoTUnref<GrEffectRef> effect(GrConvexPolyEffect::Create(edgeType, rect));
191d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                if (!effect) {
192cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                    continue;
193d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                }
194f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org
195d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                GrDrawState* drawState = tt.target()->drawState();
196d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                drawState->setVertexAttribs<kAttribs>(SK_ARRAY_COUNT(kAttribs));
197d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                drawState->addCoverageEffect(effect, 1);
198d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                drawState->setIdentityViewMatrix();
199d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                drawState->setRenderTarget(rt);
200d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                drawState->setColor(0xff000000);
201f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org
202d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                SkPoint verts[4];
203d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                SkRect bounds = rect;
204d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                bounds.outset(5.f, 5.f);
205d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                bounds.toQuad(verts);
206f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org
207d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                tt.target()->setVertexSourceToArray(verts, 4);
208d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                tt.target()->setIndexSourceToBuffer(context->getQuadIndexBuffer());
209d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                tt.target()->drawIndexed(kTriangleFan_GrPrimitiveType, 0, 0, 4, 6);
210f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org
211d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org                x += SkScalarCeilToScalar(rect.width() + 10.f);
212d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org            }
213f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org
214d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org            // Draw rect without and with AA using normal API for reference
215f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org            canvas->save();
216f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org            canvas->translate(x, y);
217f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org            SkPaint paint;
218d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org            canvas->drawRect(*iter.get(), paint);
219d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org            x += SkScalarCeilToScalar(iter.get()->width() + 10.f);
220f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org            paint.setAntiAlias(true);
221f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org            canvas->drawRect(*iter.get(), paint);
222f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org            canvas->restore();
223f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org
224d85f32ca40475fb246dd8ca93abaf1c3db0389e1commit-bot@chromium.org            y += SkScalarCeilToScalar(iter.get()->height() + 20.f);
225c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org        }
226c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org    }
227c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org
228c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.orgprivate:
229c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org    SkTLList<SkPath> fPaths;
230f0539800165314f8bebd8a5ab765ec35012f1b03commit-bot@chromium.org    SkTLList<SkRect> fRects;
231f0b0cda76fce5756aa12df4b807349e6dd85fd20skia.committer@gmail.com
232c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org    typedef GM INHERITED;
233c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org};
234c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org
235c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.orgDEF_GM( return SkNEW(ConvexPolyEffect); )
236c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org}
237c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org
238c3fe54975daf6274103bcfefe5ed2e7af8d0170acommit-bot@chromium.org#endif
239