1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2013 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "gm.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "sk_tool_utils.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBitmap.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPathOps.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRect.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace skiagm {
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass PathOpsInverseGM : public GM {
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    PathOpsInverseGM() {
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onOnceBeforeDraw() override {
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const unsigned oneColor = sk_tool_utils::color_to_565(0xFF8080FF);
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const unsigned twoColor = 0x807F1f1f;
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkColor blendColor = blend(oneColor, twoColor);
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        makePaint(&fOnePaint, oneColor);
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        makePaint(&fTwoPaint, twoColor);
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        makePaint(&fOpPaint[kDifference_SkPathOp], oneColor);
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        makePaint(&fOpPaint[kIntersect_SkPathOp], blendColor);
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        makePaint(&fOpPaint[kUnion_SkPathOp], sk_tool_utils::color_to_565(0xFFc0FFc0));
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        makePaint(&fOpPaint[kReverseDifference_SkPathOp], twoColor);
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        makePaint(&fOpPaint[kXOR_SkPathOp], sk_tool_utils::color_to_565(0xFFa0FFe0));
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        makePaint(&fOutlinePaint, 0xFF000000);
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fOutlinePaint.setStyle(SkPaint::kStroke_Style);
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkColor blend(SkColor one, SkColor two) {
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkBitmap temp;
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        temp.allocN32Pixels(1, 1);
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkCanvas canvas(temp);
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas.drawColor(one);
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas.drawColor(two);
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        void* pixels = temp.getPixels();
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return *(SkColor*) pixels;
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void makePaint(SkPaint* paint, SkColor color) {
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint->setAntiAlias(true);
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint->setStyle(SkPaint::kFill_Style);
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint->setColor(color);
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString onShortName() override {
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkString("pathopsinverse");
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkISize onISize() override {
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkISize::Make(1200, 900);
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(SkCanvas* canvas) override {
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPath one, two;
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        int yPos = 0;
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int oneFill = 0; oneFill <= 1; ++oneFill) {
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkPath::FillType oneF = oneFill ? SkPath::kInverseEvenOdd_FillType
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    : SkPath::kEvenOdd_FillType;
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int twoFill = 0; twoFill <= 1; ++twoFill) {
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkPath::FillType twoF = twoFill ? SkPath::kInverseEvenOdd_FillType
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        : SkPath::kEvenOdd_FillType;
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                one.reset();
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                one.setFillType(oneF);
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                one.addRect(10, 10, 70, 70);
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                two.reset();
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                two.setFillType(twoF);
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                two.addRect(40, 40, 100, 100);
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->save();
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->translate(0, SkIntToScalar(yPos));
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->clipRect(SkRect::MakeWH(110, 110), true);
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->drawPath(one, fOnePaint);
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->drawPath(one, fOutlinePaint);
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->drawPath(two, fTwoPaint);
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->drawPath(two, fOutlinePaint);
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->restore();
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                int xPos = 150;
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                for (int op = kDifference_SkPathOp; op <= kReverseDifference_SkPathOp; ++op) {
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkPath result;
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    Op(one, two, (SkPathOp) op, &result);
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->save();
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->translate(SkIntToScalar(xPos), SkIntToScalar(yPos));
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->clipRect(SkRect::MakeWH(110, 110), true);
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->drawPath(result, fOpPaint[op]);
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->drawPath(result, fOutlinePaint);
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->restore();
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    xPos += 150;
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                yPos += 150;
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint fOnePaint;
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint fTwoPaint;
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint fOutlinePaint;
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint fOpPaint[kReverseDifference_SkPathOp - kDifference_SkPathOp + 1];
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef GM INHERITED;
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot//////////////////////////////////////////////////////////////////////////////
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic GM* MyFactory(void*) { return new PathOpsInverseGM; }
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic GMRegistry reg(MyFactory);
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
116