1a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
2a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org/*
3a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org * Copyright 2014 Google Inc.
4a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org *
5a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
6a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org * found in the LICENSE file.
7a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org */
8a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
9a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org#include "gm.h"
10a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
11a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org#include "SkBitmap.h"
12a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org#include "SkGradientShader.h"
13a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org#include "SkTLList.h"
14a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
15a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgstatic SkBitmap make_bmp(int w, int h) {
16a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkBitmap bmp;
17a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    bmp.allocN32Pixels(w, h, true);
18a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
19a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkCanvas canvas(bmp);
20a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkScalar wScalar = SkIntToScalar(w);
21a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkScalar hScalar = SkIntToScalar(h);
22a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
23a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkPoint     pt = { wScalar / 2, hScalar / 2 };
24a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
25a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkScalar    radius = 3 * SkMaxScalar(wScalar, hScalar);
26a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
27a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkColor     colors[] = { SK_ColorDKGRAY, 0xFF222255,
28a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                             0xFF331133, 0xFF884422,
29a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                             0xFF000022, SK_ColorWHITE,
30a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                             0xFFAABBCC};
31a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
32a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkScalar    pos[] = {0,
33a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                         SK_Scalar1 / 6,
34a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                         2 * SK_Scalar1 / 6,
35a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                         3 * SK_Scalar1 / 6,
36a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                         4 * SK_Scalar1 / 6,
37a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                         5 * SK_Scalar1 / 6,
38a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                         SK_Scalar1};
39a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
40a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkPaint paint;
41a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkRect rect = SkRect::MakeWH(wScalar, hScalar);
42a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkMatrix mat = SkMatrix::I();
43a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    for (int i = 0; i < 4; ++i) {
449c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org        paint.setShader(SkGradientShader::CreateRadial(
459c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                        pt, radius,
469c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                        colors, pos,
479c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                        SK_ARRAY_COUNT(colors),
489c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                        SkShader::kRepeat_TileMode,
4983f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                        0, &mat))->unref();
50a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        canvas.drawRect(rect, paint);
51a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        rect.inset(wScalar / 8, hScalar / 8);
52a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        mat.preTranslate(6 * wScalar, 6 * hScalar);
53a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        mat.postScale(SK_Scalar1 / 3, SK_Scalar1 / 3);
54a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    }
55a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
56a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    paint.setAntiAlias(true);
57a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    paint.setTextSize(wScalar / 2.2f);
58a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    paint.setShader(0);
59a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    paint.setColor(SK_ColorLTGRAY);
60a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    static const char kTxt[] = "Skia";
61a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkPoint texPos = { wScalar / 17, hScalar / 2 + paint.getTextSize() / 2.5f };
62a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    canvas.drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1, texPos.fX, texPos.fY, paint);
63a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    paint.setColor(SK_ColorBLACK);
64a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    paint.setStyle(SkPaint::kStroke_Style);
65a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    paint.setStrokeWidth(SK_Scalar1);
66a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    canvas.drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1, texPos.fX, texPos.fY, paint);
67a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    return bmp;
68a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org}
69a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
70a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgnamespace skiagm {
71a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org/**
72a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org * This GM tests convex polygon clips.
73a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org */
74a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgclass ConvexPolyClip : public GM {
75a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgpublic:
76a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    ConvexPolyClip() {
77a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        this->setBGColor(0xFFFFFFFF);
78a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    }
79a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
80a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgprotected:
81a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    virtual SkString onShortName() SK_OVERRIDE {
82a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        return SkString("convex_poly_clip");
83a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    }
84a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
85a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    virtual SkISize onISize() SK_OVERRIDE {
86b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        // When benchmarking the saveLayer set of draws is skipped.
87b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        int w = 435;
88b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        if (kBench_Mode != this->getMode()) {
89b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org            w *= 2;
90b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        }
91f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(w, 540);
92a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    }
93a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
94a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    virtual void onOnceBeforeDraw() SK_OVERRIDE {
95a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        SkPath tri;
96a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        tri.moveTo(5.f, 5.f);
97a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        tri.lineTo(100.f, 20.f);
98a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        tri.lineTo(15.f, 100.f);
99a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
100b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        fClips.addToTail()->setPath(tri);
101a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
102a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        SkPath hexagon;
103a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        static const SkScalar kRadius = 45.f;
104a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        const SkPoint center = { kRadius, kRadius };
105a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        for (int i = 0; i < 6; ++i) {
106a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org            SkScalar angle = 2 * SK_ScalarPI * i / 6;
107a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org            SkPoint point;
108a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org            point.fY = SkScalarSinCos(angle, &point.fX);
109a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org            point.scale(kRadius);
110a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org            point = center + point;
111a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org            if (0 == i) {
112a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                hexagon.moveTo(point);
113a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org            } else {
114a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                hexagon.lineTo(point);
115a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org            }
116a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        }
117b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        fClips.addToTail()->setPath(hexagon);
118a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
119a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        SkMatrix scaleM;
120a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        scaleM.setScale(1.1f, 0.4f, kRadius, kRadius);
121a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        hexagon.transform(scaleM);
122b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        fClips.addToTail()->setPath(hexagon);
123b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org
124b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        fClips.addToTail()->setRect(SkRect::MakeXYWH(8.3f, 11.6f, 78.2f, 72.6f));
125a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
126a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        SkPath rotRect;
127a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        SkRect rect = SkRect::MakeLTRB(10.f, 12.f, 80.f, 86.f);
128a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        rotRect.addRect(rect);
129a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        SkMatrix rotM;
130a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        rotM.setRotate(23.f, rect.centerX(), rect.centerY());
131a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        rotRect.transform(rotM);
132b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        fClips.addToTail()->setPath(rotRect);
1331dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com
134a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        fBmp = make_bmp(100, 100);
135a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    }
136a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
137a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
138a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        SkScalar y = 0;
139a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        static const SkScalar kMargin = 10.f;
140a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
141a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        SkPaint bgPaint;
142a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        bgPaint.setAlpha(0x15);
143a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        SkISize size = canvas->getDeviceSize();
144a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        SkRect dstRect = SkRect::MakeWH(SkIntToScalar(size.fWidth),
145a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org                                        SkIntToScalar(size.fHeight));
146a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        canvas->drawBitmapRectToRect(fBmp, NULL, dstRect, &bgPaint);
147a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
148b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        static const char kTxt[] = "Clip Me!";
149b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        SkPaint txtPaint;
150b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        txtPaint.setTextSize(23.f);
151b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        txtPaint.setAntiAlias(true);
152b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        txtPaint.setColor(SK_ColorDKGRAY);
153b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        SkScalar textW = txtPaint.measureText(kTxt, SK_ARRAY_COUNT(kTxt)-1);
154b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org
155b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        SkScalar startX = 0;
156b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        int testLayers = kBench_Mode != this->getMode();
157b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        for (int doLayer = 0; doLayer <= testLayers; ++doLayer) {
158b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org            for (SkTLList<Clip>::Iter iter(fClips, SkTLList<Clip>::Iter::kHead_IterStart);
159b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                 NULL != iter.get();
160b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                 iter.next()) {
161b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                const Clip* clip = iter.get();
162b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                SkScalar x = startX;
163b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                for (int aa = 0; aa < 2; ++aa) {
164b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    if (doLayer) {
165b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        SkRect bounds;
166b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        clip->getBounds(&bounds);
167b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        bounds.outset(2, 2);
168b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        bounds.offset(x, y);
169b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        canvas->saveLayer(&bounds, NULL);
170b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    } else {
171b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        canvas->save();
172b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    }
173b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    canvas->translate(x, y);
174b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    clip->setOnCanvas(canvas, SkRegion::kIntersect_Op, SkToBool(aa));
175b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    canvas->drawBitmap(fBmp, 0, 0);
176b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    canvas->restore();
177b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    x += fBmp.width() + kMargin;
178b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                }
179b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                for (int aa = 0; aa < 2; ++aa) {
180b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org
181b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    SkPaint clipOutlinePaint;
182b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    clipOutlinePaint.setAntiAlias(true);
183b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    clipOutlinePaint.setColor(0x50505050);
184b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    clipOutlinePaint.setStyle(SkPaint::kStroke_Style);
185b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    clipOutlinePaint.setStrokeWidth(0);
186b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org
187b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    if (doLayer) {
188b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        SkRect bounds;
189b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        clip->getBounds(&bounds);
190b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        bounds.outset(2, 2);
191b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        bounds.offset(x, y);
192b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        canvas->saveLayer(&bounds, NULL);
193b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    } else {
194b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                        canvas->save();
195b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    }
196b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    canvas->translate(x, y);
197b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    SkPath closedClipPath;
198b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    clip->asClosedPath(&closedClipPath);
199b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    canvas->drawPath(closedClipPath, clipOutlinePaint);
200b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    clip->setOnCanvas(canvas, SkRegion::kIntersect_Op, SkToBool(aa));
201b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    canvas->scale(1.f, 1.8f);
202b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    canvas->drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1,
203b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                                     0, 1.5f * txtPaint.getTextSize(),
204b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                                     txtPaint);
205b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    canvas->restore();
206b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    x += textW + 2 * kMargin;
207b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                }
208b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                y += fBmp.height() + kMargin;
209a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org            }
210b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org            y = 0;
211b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org            startX += 2 * fBmp.width() + SkScalarCeilToInt(2 * textW) + 6 * kMargin;
212a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org        }
213a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    }
214a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
2156adce6783c5d7cbef276d04cc08a2b19789a0156commit-bot@chromium.org    virtual uint32_t onGetFlags() const {
216a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kAsBench_Flag | kSkipTiled_Flag;
2176adce6783c5d7cbef276d04cc08a2b19789a0156commit-bot@chromium.org    }
2186adce6783c5d7cbef276d04cc08a2b19789a0156commit-bot@chromium.org
219a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgprivate:
220b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org    class Clip {
221b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org    public:
222b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        enum ClipType {
223b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            kNone_ClipType,
224b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            kPath_ClipType,
225b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            kRect_ClipType
226b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        };
227b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org
228b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        Clip () : fClipType(kNone_ClipType) {}
2291dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com
230b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        void setOnCanvas(SkCanvas* canvas, SkRegion::Op op, bool aa) const {
231b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            switch (fClipType) {
232b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                case kPath_ClipType:
233b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    canvas->clipPath(fPath, op, aa);
234b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    break;
235b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                case kRect_ClipType:
236b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    canvas->clipRect(fRect, op, aa);
237b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    break;
238b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                case kNone_ClipType:
239b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    SkDEBUGFAIL("Uninitialized Clip.");
240b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    break;
241b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            }
242b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        }
2431dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com
244b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        void asClosedPath(SkPath* path) const {
245b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            switch (fClipType) {
246b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                case kPath_ClipType:
247b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    *path = fPath;
248b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    path->close();
249b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    break;
250b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                case kRect_ClipType:
251b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    path->reset();
252b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    path->addRect(fRect);
253b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    break;
254b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                case kNone_ClipType:
255b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    SkDEBUGFAIL("Uninitialized Clip.");
256b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org                    break;
257b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            }
258b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        }
2591dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com
260b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        void setPath(const SkPath& path) {
261b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            fClipType = kPath_ClipType;
262b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            fPath = path;
263b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        }
2641dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com
265b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        void setRect(const SkRect& rect) {
266b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            fClipType = kRect_ClipType;
267b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            fRect = rect;
268b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org            fPath.reset();
269b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        }
2701dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com
271b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        ClipType getType() const { return fClipType; }
2721dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com
273b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        void getBounds(SkRect* bounds) const {
274b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org            switch (fClipType) {
275b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                case kPath_ClipType:
276b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    *bounds = fPath.getBounds();
277b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    break;
278b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                case kRect_ClipType:
279b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    *bounds = fRect;
280b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    break;
281b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                case kNone_ClipType:
282b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    SkDEBUGFAIL("Uninitialized Clip.");
283b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org                    break;
284b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org            }
285b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org        }
286b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org
287b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org    private:
288b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        ClipType fClipType;
289b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        SkPath fPath;
290b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org        SkRect fRect;
291b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org    };
2921dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com
293b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org    SkTLList<Clip>   fClips;
294a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    SkBitmap         fBmp;
295a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
296a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org    typedef GM INHERITED;
297a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org};
298a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
299a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgDEF_GM( return SkNEW(ConvexPolyClip); )
300a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org
301a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org}
302