1fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com
2fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com/*
3fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com * Copyright 2011 Google Inc.
4fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com *
5fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
6fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com * found in the LICENSE file.
7fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com */
8fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com#include "gm.h"
9fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com#include "SkCanvas.h"
10fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com#include "SkPaint.h"
11fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com#include "SkRandom.h"
12fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com
13fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.comnamespace skiagm {
14fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com
15fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.comclass EmptyPathGM : public GM {
16fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.compublic:
17fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com    EmptyPathGM() {}
18fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com
19fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.comprotected:
20fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com    SkString onShortName() {
21fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        return SkString("emptypath");
22fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com    }
23ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
24f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    SkISize onISize() { return SkISize::Make(600, 280); }
25fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com
26fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com    void drawEmpty(SkCanvas* canvas,
27fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                    SkColor color,
28fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                    const SkRect& clip,
29fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                    SkPaint::Style style,
30fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                    SkPath::FillType fill) {
31fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        SkPath path;
32fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        path.setFillType(fill);
33fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        SkPaint paint;
34fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        paint.setColor(color);
35fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        paint.setStyle(style);
36fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        canvas->save();
37fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        canvas->clipRect(clip);
38fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        canvas->drawPath(path, paint);
39fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        canvas->restore();
40fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com    }
41ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
42fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com    virtual void onDraw(SkCanvas* canvas) {
43fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        struct FillAndName {
44fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com            SkPath::FillType fFill;
45fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com            const char*      fName;
46fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        };
47fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        static const FillAndName gFills[] = {
48fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com            {SkPath::kWinding_FillType, "Winding"},
49fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com            {SkPath::kEvenOdd_FillType, "Even / Odd"},
50fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com            {SkPath::kInverseWinding_FillType, "Inverse Winding"},
51fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com            {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"},
52fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        };
53fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        struct StyleAndName {
54fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com            SkPaint::Style fStyle;
55fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com            const char*    fName;
56fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        };
57fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        static const StyleAndName gStyles[] = {
58fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com            {SkPaint::kFill_Style, "Fill"},
59fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com            {SkPaint::kStroke_Style, "Stroke"},
60fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com            {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"},
61fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        };
62fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com
63fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        SkPaint titlePaint;
64fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        titlePaint.setColor(SK_ColorBLACK);
65fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        titlePaint.setAntiAlias(true);
66fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        titlePaint.setLCDRenderText(true);
67fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        titlePaint.setTextSize(15 * SK_Scalar1);
68fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        const char title[] = "Empty Paths Drawn Into Rectangle Clips With "
69fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                             "Indicated Style and Fill";
70fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        canvas->drawText(title, strlen(title),
71fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                            20 * SK_Scalar1,
72fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                            20 * SK_Scalar1,
73fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                            titlePaint);
74fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com
75e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkLCGRandom rand;
76fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1);
77fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        int i = 0;
78fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        canvas->save();
79fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        canvas->translate(10 * SK_Scalar1, 0);
80fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        canvas->save();
81f12449b5d2867ca653aa53ac58fc1148e7f0b636bsalomon@google.com        for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) {
82f12449b5d2867ca653aa53ac58fc1148e7f0b636bsalomon@google.com            for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) {
83fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                if (0 == i % 4) {
84fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                    canvas->restore();
85fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                    canvas->translate(0, rect.height() + 40 * SK_Scalar1);
86fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                    canvas->save();
87fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                } else {
88fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                    canvas->translate(rect.width() + 40 * SK_Scalar1, 0);
89fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                }
90fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                ++i;
91fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com
92fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com
93fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                SkColor color = rand.nextU();
94fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                color = 0xff000000| color; // force solid
95fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                this->drawEmpty(canvas, color, rect,
96fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                                gStyles[style].fStyle, gFills[fill].fFill);
97fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com
98fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                SkPaint rectPaint;
99fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                rectPaint.setColor(SK_ColorBLACK);
100fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                rectPaint.setStyle(SkPaint::kStroke_Style);
101fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                rectPaint.setStrokeWidth(-1);
102fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                rectPaint.setAntiAlias(true);
103fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                canvas->drawRect(rect, rectPaint);
104fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com
105fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                SkPaint labelPaint;
106fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                labelPaint.setColor(color);
107fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                labelPaint.setAntiAlias(true);
108fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                labelPaint.setLCDRenderText(true);
109fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                labelPaint.setTextSize(12 * SK_Scalar1);
110fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                canvas->drawText(gStyles[style].fName,
111fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                                 strlen(gStyles[style].fName),
112fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                                 0, rect.height() + 15 * SK_Scalar1,
113fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                                 labelPaint);
114fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                canvas->drawText(gFills[fill].fName,
115fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                                 strlen(gFills[fill].fName),
116fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                                 0, rect.height() + 28 * SK_Scalar1,
117fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com                                 labelPaint);
118fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com            }
119fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        }
120fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        canvas->restore();
121fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com        canvas->restore();
122fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com    }
123ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
124fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.comprivate:
125fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com    typedef GM INHERITED;
126fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com};
127fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com
128fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com//////////////////////////////////////////////////////////////////////////////
129fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com
130fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.comstatic GM* MyFactory(void*) { return new EmptyPathGM; }
131fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.comstatic GMRegistry reg(MyFactory);
132fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com
133fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com}
134