1a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org/*
2a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org * Copyright 2014 Google Inc.
3a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org *
4a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
5a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org * found in the LICENSE file.
6a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org */
7a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
8a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org#include "gm.h"
933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h"
10a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
11a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org#include "SkBitmap.h"
12a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org#include "SkGradientShader.h"
13d3ebb48320cf1b7e969974673e4bd7743816985ebungeman#include "SkPath.h"
14a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org#include "SkTLList.h"
15a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
16a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgstatic SkBitmap make_bmp(int w, int h) {
17a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkBitmap bmp;
18a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    bmp.allocN32Pixels(w, h, true);
19a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
20a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkCanvas canvas(bmp);
21a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkScalar wScalar = SkIntToScalar(w);
22a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkScalar hScalar = SkIntToScalar(h);
23a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
24a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkPoint     pt = { wScalar / 2, hScalar / 2 };
25a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
26a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkScalar    radius = 3 * SkMaxScalar(wScalar, hScalar);
27a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
282e096609b2f09512234ce69dcc0c30f8ab2d1b8fcaryclark    SkColor     colors[] = { sk_tool_utils::color_to_565(SK_ColorDKGRAY),
292e096609b2f09512234ce69dcc0c30f8ab2d1b8fcaryclark                             sk_tool_utils::color_to_565(0xFF222255),
302e096609b2f09512234ce69dcc0c30f8ab2d1b8fcaryclark                             sk_tool_utils::color_to_565(0xFF331133),
312e096609b2f09512234ce69dcc0c30f8ab2d1b8fcaryclark                             sk_tool_utils::color_to_565(0xFF884422),
322e096609b2f09512234ce69dcc0c30f8ab2d1b8fcaryclark                             sk_tool_utils::color_to_565(0xFF000022), SK_ColorWHITE,
332e096609b2f09512234ce69dcc0c30f8ab2d1b8fcaryclark                             sk_tool_utils::color_to_565(0xFFAABBCC) };
34a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
35a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkScalar    pos[] = {0,
36a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                         SK_Scalar1 / 6,
37a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                         2 * SK_Scalar1 / 6,
38a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                         3 * SK_Scalar1 / 6,
39a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                         4 * SK_Scalar1 / 6,
40a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                         5 * SK_Scalar1 / 6,
41a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                         SK_Scalar1};
42a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
43a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkPaint paint;
44a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkRect rect = SkRect::MakeWH(wScalar, hScalar);
45a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkMatrix mat = SkMatrix::I();
46a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    for (int i = 0; i < 4; ++i) {
472ad1aa67c6894696cdd65ec56057f81031d1c24areed        paint.setShader(SkGradientShader::MakeRadial(
489c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                        pt, radius,
499c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                        colors, pos,
509c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                        SK_ARRAY_COUNT(colors),
519c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                        SkShader::kRepeat_TileMode,
522ad1aa67c6894696cdd65ec56057f81031d1c24areed                        0, &mat));
53a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        canvas.drawRect(rect, paint);
54a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        rect.inset(wScalar / 8, hScalar / 8);
55a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        mat.preTranslate(6 * wScalar, 6 * hScalar);
56a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        mat.postScale(SK_Scalar1 / 3, SK_Scalar1 / 3);
57a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    }
58a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
59a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    paint.setAntiAlias(true);
601818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark    sk_tool_utils::set_portable_typeface(&paint);
61a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    paint.setTextSize(wScalar / 2.2f);
62a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    paint.setShader(0);
632e096609b2f09512234ce69dcc0c30f8ab2d1b8fcaryclark    paint.setColor(sk_tool_utils::color_to_565(SK_ColorLTGRAY));
64dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    constexpr char kTxt[] = "Skia";
65a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkPoint texPos = { wScalar / 17, hScalar / 2 + paint.getTextSize() / 2.5f };
66a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    canvas.drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1, texPos.fX, texPos.fY, paint);
67a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    paint.setColor(SK_ColorBLACK);
68a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    paint.setStyle(SkPaint::kStroke_Style);
69a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    paint.setStrokeWidth(SK_Scalar1);
70a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    canvas.drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1, texPos.fX, texPos.fY, paint);
71a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    return bmp;
72a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org}
73a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
74a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgnamespace skiagm {
75a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org/**
76a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org * This GM tests convex polygon clips.
77a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org */
78a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgclass ConvexPolyClip : public GM {
79a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgpublic:
80a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    ConvexPolyClip() {
81a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        this->setBGColor(0xFFFFFFFF);
82a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    }
83a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
84a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgprotected:
8536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
86a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        return SkString("convex_poly_clip");
87a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    }
88a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
8936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override {
90b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        // When benchmarking the saveLayer set of draws is skipped.
91b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        int w = 435;
92b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        if (kBench_Mode != this->getMode()) {
93b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org            w *= 2;
94b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        }
95f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(w, 540);
96a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    }
97a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
9836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onOnceBeforeDraw() override {
99a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        SkPath tri;
100a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        tri.moveTo(5.f, 5.f);
101a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        tri.lineTo(100.f, 20.f);
102a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        tri.lineTo(15.f, 100.f);
103a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
104b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        fClips.addToTail()->setPath(tri);
105a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
106a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        SkPath hexagon;
107dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein        constexpr SkScalar kRadius = 45.f;
108a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        const SkPoint center = { kRadius, kRadius };
109a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        for (int i = 0; i < 6; ++i) {
110a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org            SkScalar angle = 2 * SK_ScalarPI * i / 6;
111a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org            SkPoint point;
112a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org            point.fY = SkScalarSinCos(angle, &point.fX);
113a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org            point.scale(kRadius);
114a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org            point = center + point;
115a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org            if (0 == i) {
116a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                hexagon.moveTo(point);
117a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org            } else {
118a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                hexagon.lineTo(point);
119a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org            }
120a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        }
121b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        fClips.addToTail()->setPath(hexagon);
122a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
123a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        SkMatrix scaleM;
124a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        scaleM.setScale(1.1f, 0.4f, kRadius, kRadius);
125a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        hexagon.transform(scaleM);
126b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        fClips.addToTail()->setPath(hexagon);
127b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org
128b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        fClips.addToTail()->setRect(SkRect::MakeXYWH(8.3f, 11.6f, 78.2f, 72.6f));
129a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
130a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        SkPath rotRect;
131a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        SkRect rect = SkRect::MakeLTRB(10.f, 12.f, 80.f, 86.f);
132a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        rotRect.addRect(rect);
133a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        SkMatrix rotM;
134a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        rotM.setRotate(23.f, rect.centerX(), rect.centerY());
135a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        rotRect.transform(rotM);
136b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        fClips.addToTail()->setPath(rotRect);
1371dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com
138a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        fBmp = make_bmp(100, 100);
139a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    }
140a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
14136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
142a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        SkScalar y = 0;
143dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein        constexpr SkScalar kMargin = 10.f;
144a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
145a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        SkPaint bgPaint;
146a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        bgPaint.setAlpha(0x15);
1473661bc997620899695041010a750d11dbe8a972dMike Reed        SkISize size = canvas->getBaseLayerSize();
148a5517e2b190a8083b38964972b031c13e99f1012reed        canvas->drawBitmapRect(fBmp, SkRect::MakeIWH(size.fWidth, size.fHeight), &bgPaint);
149a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
150dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein        constexpr char kTxt[] = "Clip Me!";
151b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        SkPaint txtPaint;
152b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        txtPaint.setTextSize(23.f);
153b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        txtPaint.setAntiAlias(true);
1541818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark        sk_tool_utils::set_portable_typeface(&txtPaint);
1552e096609b2f09512234ce69dcc0c30f8ab2d1b8fcaryclark        txtPaint.setColor(sk_tool_utils::color_to_565(SK_ColorDKGRAY));
156b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        SkScalar textW = txtPaint.measureText(kTxt, SK_ARRAY_COUNT(kTxt)-1);
157b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org
158b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        SkScalar startX = 0;
159b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        int testLayers = kBench_Mode != this->getMode();
160b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        for (int doLayer = 0; doLayer <= testLayers; ++doLayer) {
161f045d600fc5c17f8a3537401baf45043e7617368bsalomon            for (ClipList::Iter iter(fClips, ClipList::Iter::kHead_IterStart);
16249f085dddff10473b6ebf832a974288300224e60bsalomon                 iter.get();
163b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                 iter.next()) {
164b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                const Clip* clip = iter.get();
165b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                SkScalar x = startX;
166b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                for (int aa = 0; aa < 2; ++aa) {
167b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    if (doLayer) {
168b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        SkRect bounds;
169b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        clip->getBounds(&bounds);
170b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        bounds.outset(2, 2);
171b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        bounds.offset(x, y);
17296fcdcc219d2a0d3579719b84b28bede76efba64halcanary                        canvas->saveLayer(&bounds, nullptr);
173b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    } else {
174b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        canvas->save();
175b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    }
176b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    canvas->translate(x, y);
177c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed                    clip->setOnCanvas(canvas, kIntersect_SkClipOp, SkToBool(aa));
178b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    canvas->drawBitmap(fBmp, 0, 0);
179b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    canvas->restore();
180b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    x += fBmp.width() + kMargin;
181b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                }
182b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                for (int aa = 0; aa < 2; ++aa) {
183b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org
184b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    SkPaint clipOutlinePaint;
185b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    clipOutlinePaint.setAntiAlias(true);
186b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    clipOutlinePaint.setColor(0x50505050);
187b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    clipOutlinePaint.setStyle(SkPaint::kStroke_Style);
188b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    clipOutlinePaint.setStrokeWidth(0);
189b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org
190b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    if (doLayer) {
191b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        SkRect bounds;
192b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        clip->getBounds(&bounds);
193b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        bounds.outset(2, 2);
194b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        bounds.offset(x, y);
19596fcdcc219d2a0d3579719b84b28bede76efba64halcanary                        canvas->saveLayer(&bounds, nullptr);
196b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    } else {
197b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        canvas->save();
198b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    }
199b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    canvas->translate(x, y);
200b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    SkPath closedClipPath;
201b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    clip->asClosedPath(&closedClipPath);
202b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    canvas->drawPath(closedClipPath, clipOutlinePaint);
203c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed                    clip->setOnCanvas(canvas, kIntersect_SkClipOp, SkToBool(aa));
204b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    canvas->scale(1.f, 1.8f);
205b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    canvas->drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1,
206b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                                     0, 1.5f * txtPaint.getTextSize(),
207b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                                     txtPaint);
208b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    canvas->restore();
209b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    x += textW + 2 * kMargin;
210b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                }
211b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                y += fBmp.height() + kMargin;
212a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org            }
213b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org            y = 0;
214b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org            startX += 2 * fBmp.width() + SkScalarCeilToInt(2 * textW) + 6 * kMargin;
215a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        }
216a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    }
217a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
21836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool runAsBench() const override { return true; }
219cf5d9c993dcbd75d4cefe2d1de25c2b9645f6957mtklein
220a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgprivate:
221b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org    class Clip {
222b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org    public:
223b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        enum ClipType {
224b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            kNone_ClipType,
225b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            kPath_ClipType,
226b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            kRect_ClipType
227b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        };
228b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org
229b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        Clip () : fClipType(kNone_ClipType) {}
2301dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com
231c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed        void setOnCanvas(SkCanvas* canvas, SkClipOp op, bool aa) const {
232b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            switch (fClipType) {
233b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                case kPath_ClipType:
234b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    canvas->clipPath(fPath, op, aa);
235b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    break;
236b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                case kRect_ClipType:
237b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    canvas->clipRect(fRect, op, aa);
238b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    break;
239b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                case kNone_ClipType:
240b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    SkDEBUGFAIL("Uninitialized Clip.");
241b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    break;
242b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            }
243b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        }
2441dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com
245b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        void asClosedPath(SkPath* path) const {
246b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            switch (fClipType) {
247b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                case kPath_ClipType:
248b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    *path = fPath;
249b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    path->close();
250b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    break;
251b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                case kRect_ClipType:
252b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    path->reset();
253b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    path->addRect(fRect);
254b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    break;
255b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                case kNone_ClipType:
256b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    SkDEBUGFAIL("Uninitialized Clip.");
257b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    break;
258b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            }
259b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        }
2601dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com
261b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        void setPath(const SkPath& path) {
262b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            fClipType = kPath_ClipType;
263b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            fPath = path;
264b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        }
2651dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com
266b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        void setRect(const SkRect& rect) {
267b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            fClipType = kRect_ClipType;
268b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            fRect = rect;
269b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            fPath.reset();
270b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        }
2711dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com
272b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        ClipType getType() const { return fClipType; }
2731dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com
274b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        void getBounds(SkRect* bounds) const {
275b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org            switch (fClipType) {
276b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                case kPath_ClipType:
277b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    *bounds = fPath.getBounds();
278b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    break;
279b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                case kRect_ClipType:
280b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    *bounds = fRect;
281b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    break;
282b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                case kNone_ClipType:
283b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    SkDEBUGFAIL("Uninitialized Clip.");
284b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    break;
285b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org            }
286b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        }
287b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org
288b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org    private:
289b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        ClipType fClipType;
290b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        SkPath fPath;
291b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        SkRect fRect;
292b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org    };
2931dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com
294f045d600fc5c17f8a3537401baf45043e7617368bsalomon    typedef SkTLList<Clip, 1> ClipList;
295f045d600fc5c17f8a3537401baf45043e7617368bsalomon    ClipList         fClips;
296a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkBitmap         fBmp;
297a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
298a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    typedef GM INHERITED;
299a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org};
300a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
301385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new ConvexPolyClip;)
302a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org}
303