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:
28a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
29a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
30a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
31a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
32b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    virtual SkISize onISize() {
333b8f472307fd01c8768d493121c57f7cf999734freed@google.com        return SkISize::Make(770, 770);
34b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    }
35b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
36b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    virtual SkString onShortName() SK_OVERRIDE {
37b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        return SkString("pathinterior");
38b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    }
39b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
40b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    void show(SkCanvas* canvas, const SkPath& path) {
41b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        SkPaint paint;
42b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        paint.setAntiAlias(true);
43b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
44b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        SkRect rect;
45b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com#if 0
46b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        bool hasInterior = path.hasRectangularInterior(&rect);
47b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com#else
48b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        bool hasInterior = false;
49b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com#endif
50b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
51b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        paint.setColor(hasInterior ? 0xFF8888FF : SK_ColorGRAY);
52b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        canvas->drawPath(path, paint);
53b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        paint.setStyle(SkPaint::kStroke_Style);
54b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        paint.setColor(SK_ColorRED);
55b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        canvas->drawPath(path, paint);
5673b140a9f668c189b0682cc5f82d9fb57ff8bc15skia.committer@gmail.com
57b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        if (hasInterior) {
58b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com            paint.setStyle(SkPaint::kFill_Style);
59b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com            paint.setColor(0x8800FF00);
60b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com            canvas->drawRect(rect, paint);
61b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        }
62b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    }
63b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
64b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
653b8f472307fd01c8768d493121c57f7cf999734freed@google.com        canvas->translate(8.5f, 8.5f);
66b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
673b8f472307fd01c8768d493121c57f7cf999734freed@google.com        const SkRect rect = { 0, 0, 80, 80 };
68b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        const SkScalar RAD = rect.width()/8;
69b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
70b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        int i = 0;
713b8f472307fd01c8768d493121c57f7cf999734freed@google.com        for (int insetFirst = 0; insetFirst <= 1; ++insetFirst) {
723b8f472307fd01c8768d493121c57f7cf999734freed@google.com            for (int doEvenOdd = 0; doEvenOdd <= 1; ++doEvenOdd) {
733b8f472307fd01c8768d493121c57f7cf999734freed@google.com                for (int outerRR = 0; outerRR <= 1; ++outerRR) {
743b8f472307fd01c8768d493121c57f7cf999734freed@google.com                    for (int innerRR = 0; innerRR <= 1; ++innerRR) {
753b8f472307fd01c8768d493121c57f7cf999734freed@google.com                        for (int outerCW = 0; outerCW <= 1; ++outerCW) {
763b8f472307fd01c8768d493121c57f7cf999734freed@google.com                            for (int innerCW = 0; innerCW <= 1; ++innerCW) {
773b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                SkPath path;
783b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                path.setFillType(doEvenOdd ? SkPath::kEvenOdd_FillType : SkPath::kWinding_FillType);
793b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                SkPath::Direction outerDir = outerCW ? SkPath::kCW_Direction : SkPath::kCCW_Direction;
803b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                SkPath::Direction innerDir = innerCW ? SkPath::kCW_Direction : SkPath::kCCW_Direction;
810264fb4543b0d8cebe00f1ee32433784f4ceb074skia.committer@gmail.com
823b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                SkRect r = insetFirst ? inset(rect) : rect;
833b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                if (outerRR) {
843b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                    path.addRoundRect(r, RAD, RAD, outerDir);
853b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                } else {
863b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                    path.addRect(r, outerDir);
873b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                }
883b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                r = insetFirst ? rect : inset(rect);
893b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                if (innerRR) {
903b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                    path.addRoundRect(r, RAD, RAD, innerDir);
913b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                } else {
923b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                    path.addRect(r, innerDir);
933b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                }
943b8f472307fd01c8768d493121c57f7cf999734freed@google.com
953b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                SkScalar dx = (i / 8) * rect.width() * 6 / 5;
963b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                SkScalar dy = (i % 8) * rect.height() * 6 / 5;
973b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                i++;
983b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                path.offset(dx, dy);
990264fb4543b0d8cebe00f1ee32433784f4ceb074skia.committer@gmail.com
1003b8f472307fd01c8768d493121c57f7cf999734freed@google.com                                this->show(canvas, path);
101b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                            }
102b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                        }
103b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                    }
104b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com                }
105b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com            }
106b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com        }
107b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    }
108b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
109b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.comprivate:
110b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
111b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com    typedef GM INHERITED;
112b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com};
113b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
114b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com//////////////////////////////////////////////////////////////////////////////
115b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.com
116b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.comstatic skiagm::GM* MyFactory(void*) { return new PathInteriorGM; }
117b1c8827321b230a77ea03cbdad8008b4d33844ffreed@google.comstatic skiagm::GMRegistry reg(MyFactory);
118