pathinterior.cpp revision b1c8827321b230a77ea03cbdad8008b4d33844ff
1b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com/*
2b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com * Copyright 2012 Google Inc.
3b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com *
4b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com * Use of this source code is governed by a BSD-style license that can be
5b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com * found in the LICENSE file.
6b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com */
7b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
8b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com#include "gm.h"
9b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com#include "SkCanvas.h"
10b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com#include "SkGraphics.h"
11b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com#include "SkRandom.h"
12b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com#include "SkLayerDrawLooper.h"
13b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com#include "SkBlurMaskFilter.h"
14b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
15b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.comstatic SkRect inset(const SkRect& r) {
16b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    SkRect rect = r;
17b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    rect.inset(r.width() / 8, r.height() / 8);
18b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    return rect;
19b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com}
20b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
21b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.comclass PathInteriorGM : public skiagm::GM {
22b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.compublic:
23b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    PathInteriorGM() {
24b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        this->setBGColor(0xFFDDDDDD);
25b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    }
26b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
27b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.comprotected:
28b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    virtual SkISize onISize() {
29b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        return SkISize::Make(960, 480);
30b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    }
31b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
32b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    virtual SkString onShortName() SK_OVERRIDE {
33b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        return SkString("pathinterior");
34b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    }
35b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
36b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    void show(SkCanvas* canvas, const SkPath& path) {
37b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        SkPaint paint;
38b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        paint.setAntiAlias(true);
39b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
40b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        SkRect rect;
41b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com#if 0
42b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        bool hasInterior = path.hasRectangularInterior(&rect);
43b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com#else
44b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        bool hasInterior = false;
45b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com#endif
46b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
47b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        paint.setColor(hasInterior ? 0xFF8888FF : SK_ColorGRAY);
48b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        canvas->drawPath(path, paint);
49b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        paint.setStyle(SkPaint::kStroke_Style);
50b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        paint.setColor(SK_ColorRED);
51b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        canvas->drawPath(path, paint);
52b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
53b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        if (hasInterior) {
54b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com            paint.setStyle(SkPaint::kFill_Style);
55b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com            paint.setColor(0x8800FF00);
56b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com            canvas->drawRect(rect, paint);
57b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        }
58b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    }
59b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
60b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
61b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        canvas->translate(8, 8);
62b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
63b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        const SkRect rect = { 0, 0, 100, 100 };
64b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        const SkScalar RAD = rect.width()/8;
65b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
66b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        int i = 0;
67b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        for (int doEvenOdd = 0; doEvenOdd <= 1; ++doEvenOdd) {
68b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com            for (int outerRR = 0; outerRR <= 1; ++outerRR) {
69b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                for (int innerRR = 0; innerRR <= 1; ++innerRR) {
70b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                    for (int outerCW = 0; outerCW <= 1; ++outerCW) {
71b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                        for (int innerCW = 0; innerCW <= 1; ++innerCW) {
72b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                            SkPath path;
73b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                            path.setFillType(doEvenOdd ? SkPath::kEvenOdd_FillType : SkPath::kWinding_FillType);
74b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                            SkPath::Direction outerDir = outerCW ? SkPath::kCW_Direction : SkPath::kCCW_Direction;
75b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                            SkPath::Direction innerDir = innerCW ? SkPath::kCW_Direction : SkPath::kCCW_Direction;
76b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                            if (outerRR) {
77b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                                path.addRoundRect(rect, RAD, RAD, outerDir);
78b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                            } else {
79b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                                path.addRect(rect, outerDir);
80b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                            }
81b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                            SkRect inner = inset(rect);
82b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                            if (innerRR) {
83b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                                path.addRoundRect(inner, RAD, RAD, innerDir);
84b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                            } else {
85b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                                path.addRect(inner, innerDir);
86b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                            }
87b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
88b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                            SkScalar dx = (i / 4) * rect.width() * 6 / 5;
89b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                            SkScalar dy = (i % 4) * rect.height() * 6 / 5;
90b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                            i++;
91b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                            path.offset(dx, dy);
92b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
93b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                            this->show(canvas, path);
94b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                        }
95b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                    }
96b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                }
97b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com            }
98b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        }
99b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    }
100b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
101b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.comprivate:
102b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
103b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    typedef GM INHERITED;
104b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com};
105b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
106b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com//////////////////////////////////////////////////////////////////////////////
107b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
108b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.comstatic skiagm::GM* MyFactory(void*) { return new PathInteriorGM; }
109b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.comstatic skiagm::GMRegistry reg(MyFactory);
110b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
111