1cc03adb90901d226e8b0252a187b19a68fabcc42dandov
2cc03adb90901d226e8b0252a187b19a68fabcc42dandov/*
3cc03adb90901d226e8b0252a187b19a68fabcc42dandov * Copyright 2014 Google Inc.
4cc03adb90901d226e8b0252a187b19a68fabcc42dandov *
5cc03adb90901d226e8b0252a187b19a68fabcc42dandov * Use of this source code is governed by a BSD-style license that can be
6cc03adb90901d226e8b0252a187b19a68fabcc42dandov * found in the LICENSE file.
7cc03adb90901d226e8b0252a187b19a68fabcc42dandov */
8cc03adb90901d226e8b0252a187b19a68fabcc42dandov
9cc03adb90901d226e8b0252a187b19a68fabcc42dandov#include "gm.h"
10cc03adb90901d226e8b0252a187b19a68fabcc42dandov#include "SkPatchGrid.h"
11cc03adb90901d226e8b0252a187b19a68fabcc42dandov
12cc03adb90901d226e8b0252a187b19a68fabcc42dandovstatic void draw_control_points(SkCanvas* canvas, const SkPoint cubics[12]) {
13cc03adb90901d226e8b0252a187b19a68fabcc42dandov    //draw control points
14cc03adb90901d226e8b0252a187b19a68fabcc42dandov    SkPaint paint;
15cc03adb90901d226e8b0252a187b19a68fabcc42dandov    SkPoint bottom[4];
16cc03adb90901d226e8b0252a187b19a68fabcc42dandov    SkPatchUtils::getBottomCubic(cubics, bottom);
17cc03adb90901d226e8b0252a187b19a68fabcc42dandov    SkPoint top[4];
18cc03adb90901d226e8b0252a187b19a68fabcc42dandov    SkPatchUtils::getTopCubic(cubics, top);
19cc03adb90901d226e8b0252a187b19a68fabcc42dandov    SkPoint left[4];
20cc03adb90901d226e8b0252a187b19a68fabcc42dandov    SkPatchUtils::getLeftCubic(cubics, left);
21cc03adb90901d226e8b0252a187b19a68fabcc42dandov    SkPoint right[4];
22cc03adb90901d226e8b0252a187b19a68fabcc42dandov    SkPatchUtils::getRightCubic(cubics, right);
23cc03adb90901d226e8b0252a187b19a68fabcc42dandov
24cc03adb90901d226e8b0252a187b19a68fabcc42dandov    paint.setColor(SK_ColorBLACK);
25cc03adb90901d226e8b0252a187b19a68fabcc42dandov    paint.setStrokeWidth(0.5);
26cc03adb90901d226e8b0252a187b19a68fabcc42dandov    SkPoint corners[4] = { bottom[0], bottom[3], top[0], top[3] };
27cc03adb90901d226e8b0252a187b19a68fabcc42dandov    canvas->drawPoints(SkCanvas::kLines_PointMode, 4, bottom, paint);
28cc03adb90901d226e8b0252a187b19a68fabcc42dandov    canvas->drawPoints(SkCanvas::kLines_PointMode, 2, bottom+1, paint);
29cc03adb90901d226e8b0252a187b19a68fabcc42dandov    canvas->drawPoints(SkCanvas::kLines_PointMode, 4, top, paint);
30cc03adb90901d226e8b0252a187b19a68fabcc42dandov    canvas->drawPoints(SkCanvas::kLines_PointMode, 4, left, paint);
31cc03adb90901d226e8b0252a187b19a68fabcc42dandov    canvas->drawPoints(SkCanvas::kLines_PointMode, 4, right, paint);
32cc03adb90901d226e8b0252a187b19a68fabcc42dandov
33cc03adb90901d226e8b0252a187b19a68fabcc42dandov    canvas->drawPoints(SkCanvas::kLines_PointMode, 2, top+1, paint);
34cc03adb90901d226e8b0252a187b19a68fabcc42dandov    canvas->drawPoints(SkCanvas::kLines_PointMode, 2, left+1, paint);
35cc03adb90901d226e8b0252a187b19a68fabcc42dandov    canvas->drawPoints(SkCanvas::kLines_PointMode, 2, right+1, paint);
36cc03adb90901d226e8b0252a187b19a68fabcc42dandov
37cc03adb90901d226e8b0252a187b19a68fabcc42dandov    paint.setStrokeWidth(2);
38cc03adb90901d226e8b0252a187b19a68fabcc42dandov
39cc03adb90901d226e8b0252a187b19a68fabcc42dandov    paint.setColor(SK_ColorRED);
40cc03adb90901d226e8b0252a187b19a68fabcc42dandov    canvas->drawPoints(SkCanvas::kPoints_PointMode, 4, corners, paint);
41cc03adb90901d226e8b0252a187b19a68fabcc42dandov
42cc03adb90901d226e8b0252a187b19a68fabcc42dandov    paint.setColor(SK_ColorBLUE);
43cc03adb90901d226e8b0252a187b19a68fabcc42dandov    canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, bottom+1, paint);
44cc03adb90901d226e8b0252a187b19a68fabcc42dandov
45cc03adb90901d226e8b0252a187b19a68fabcc42dandov    paint.setColor(SK_ColorCYAN);
46cc03adb90901d226e8b0252a187b19a68fabcc42dandov    canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, top+1, paint);
47cc03adb90901d226e8b0252a187b19a68fabcc42dandov
48cc03adb90901d226e8b0252a187b19a68fabcc42dandov    paint.setColor(SK_ColorYELLOW);
49cc03adb90901d226e8b0252a187b19a68fabcc42dandov    canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, left+1, paint);
50cc03adb90901d226e8b0252a187b19a68fabcc42dandov
51cc03adb90901d226e8b0252a187b19a68fabcc42dandov    paint.setColor(SK_ColorGREEN);
52cc03adb90901d226e8b0252a187b19a68fabcc42dandov    canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, right+1, paint);
53cc03adb90901d226e8b0252a187b19a68fabcc42dandov}
54cc03adb90901d226e8b0252a187b19a68fabcc42dandov
55cc03adb90901d226e8b0252a187b19a68fabcc42dandovnamespace skiagm {
56cc03adb90901d226e8b0252a187b19a68fabcc42dandov/**
57cc03adb90901d226e8b0252a187b19a68fabcc42dandov * This GM draws a grid of patches, it only uses colors so it could be considered a mesh gradient.
58cc03adb90901d226e8b0252a187b19a68fabcc42dandov */
59cc03adb90901d226e8b0252a187b19a68fabcc42dandovclass SkPatchGridGM : public GM {
60cc03adb90901d226e8b0252a187b19a68fabcc42dandov
61cc03adb90901d226e8b0252a187b19a68fabcc42dandovpublic:
62cc03adb90901d226e8b0252a187b19a68fabcc42dandov    SkPatchGridGM() {
63cc03adb90901d226e8b0252a187b19a68fabcc42dandov        this->setBGColor(0xFFFFFFFF);
64cc03adb90901d226e8b0252a187b19a68fabcc42dandov    }
65cc03adb90901d226e8b0252a187b19a68fabcc42dandov
66cc03adb90901d226e8b0252a187b19a68fabcc42dandovprotected:
6736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
68cc03adb90901d226e8b0252a187b19a68fabcc42dandov        return SkString("patch_grid");
69cc03adb90901d226e8b0252a187b19a68fabcc42dandov    }
70cc03adb90901d226e8b0252a187b19a68fabcc42dandov
7136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override {
72cc03adb90901d226e8b0252a187b19a68fabcc42dandov        return SkISize::Make(800, 800);
73cc03adb90901d226e8b0252a187b19a68fabcc42dandov    }
74cc03adb90901d226e8b0252a187b19a68fabcc42dandov
7536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
76cc03adb90901d226e8b0252a187b19a68fabcc42dandov
77cc03adb90901d226e8b0252a187b19a68fabcc42dandov        SkPaint paint;
78cc03adb90901d226e8b0252a187b19a68fabcc42dandov
79cc03adb90901d226e8b0252a187b19a68fabcc42dandov        SkPoint vertices[4][5] = {
80cc03adb90901d226e8b0252a187b19a68fabcc42dandov            {{50,50}, {150,50}, {250,50},{350,50},{450,50}},
81cc03adb90901d226e8b0252a187b19a68fabcc42dandov            {{50,150}, {120,120}, {250,150},{350,150},{450,150}},
82cc03adb90901d226e8b0252a187b19a68fabcc42dandov            {{50,250}, {150,250}, {250,250},{350,250},{450,250}},
83cc03adb90901d226e8b0252a187b19a68fabcc42dandov            {{100,300}, {150,350}, {250,350},{350,350},{450,350}}
84cc03adb90901d226e8b0252a187b19a68fabcc42dandov        };
85cc03adb90901d226e8b0252a187b19a68fabcc42dandov
86cc03adb90901d226e8b0252a187b19a68fabcc42dandov        SkColor cornerColors[4][5] = {
87cc03adb90901d226e8b0252a187b19a68fabcc42dandov            {SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE},
88cc03adb90901d226e8b0252a187b19a68fabcc42dandov            {SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED},
89cc03adb90901d226e8b0252a187b19a68fabcc42dandov            {SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE},
90cc03adb90901d226e8b0252a187b19a68fabcc42dandov            {SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED},
91cc03adb90901d226e8b0252a187b19a68fabcc42dandov        };
92cc03adb90901d226e8b0252a187b19a68fabcc42dandov
93cc03adb90901d226e8b0252a187b19a68fabcc42dandov        SkPoint hrzCtrl[4][8] = {
94cc03adb90901d226e8b0252a187b19a68fabcc42dandov            {{75,30},{125,45},{175,70},{225,20},{275,50},{325,50},{375,5},{425,90}},
95cc03adb90901d226e8b0252a187b19a68fabcc42dandov            {{75,150},{125,150},{175,150},{225,150},{275,150},{325,150},{375,150},{425,150}},
96cc03adb90901d226e8b0252a187b19a68fabcc42dandov            {{75,250},{125,250},{175,250},{225,250},{275,200},{325,150},{375,250},{425,250}},
97cc03adb90901d226e8b0252a187b19a68fabcc42dandov            {{75,350},{125,350},{175,350},{225,350},{275,350},{325,350},{375,350},{425,350}}
98cc03adb90901d226e8b0252a187b19a68fabcc42dandov        };
99cc03adb90901d226e8b0252a187b19a68fabcc42dandov
100cc03adb90901d226e8b0252a187b19a68fabcc42dandov        SkPoint vrtCtrl[6][5] = {
101cc03adb90901d226e8b0252a187b19a68fabcc42dandov            {{50,75},{150,75},{250,75},{350,75},{450,75}},
102cc03adb90901d226e8b0252a187b19a68fabcc42dandov            {{50,125},{150,125},{250,125},{350,125},{450,125}},
103cc03adb90901d226e8b0252a187b19a68fabcc42dandov            {{50,175},{150,175},{220,225},{350,175},{470,225}},
104cc03adb90901d226e8b0252a187b19a68fabcc42dandov            {{50,225},{150,225},{220,175},{350,225},{470,155}},
105cc03adb90901d226e8b0252a187b19a68fabcc42dandov            {{50,275},{150,275},{250,275},{350,275},{400,305}},
106cc03adb90901d226e8b0252a187b19a68fabcc42dandov            {{50,325},{150,325},{250,325},{350,325},{450,325}}
107cc03adb90901d226e8b0252a187b19a68fabcc42dandov        };
108cc03adb90901d226e8b0252a187b19a68fabcc42dandov
109cc03adb90901d226e8b0252a187b19a68fabcc42dandov        static const int kRows = 3;
110cc03adb90901d226e8b0252a187b19a68fabcc42dandov        static const int kCols = 4;
111cc03adb90901d226e8b0252a187b19a68fabcc42dandov
112cc03adb90901d226e8b0252a187b19a68fabcc42dandov        canvas->scale(3, 3);
113cc03adb90901d226e8b0252a187b19a68fabcc42dandov        SkPatchGrid grid(kRows, kCols, SkPatchGrid::kColors_VertexType, NULL);
114cc03adb90901d226e8b0252a187b19a68fabcc42dandov        for (int i = 0; i < kRows; i++) {
115cc03adb90901d226e8b0252a187b19a68fabcc42dandov            for (int j = 0; j < kCols; j++) {
116cc03adb90901d226e8b0252a187b19a68fabcc42dandov                SkPoint points[12];
117cc03adb90901d226e8b0252a187b19a68fabcc42dandov
118cc03adb90901d226e8b0252a187b19a68fabcc42dandov                //set corners
119cc03adb90901d226e8b0252a187b19a68fabcc42dandov                points[SkPatchUtils::kTopP0_CubicCtrlPts] = vertices[i][j];
120cc03adb90901d226e8b0252a187b19a68fabcc42dandov                points[SkPatchUtils::kTopP3_CubicCtrlPts] = vertices[i][j + 1];
121cc03adb90901d226e8b0252a187b19a68fabcc42dandov                points[SkPatchUtils::kBottomP0_CubicCtrlPts] = vertices[i + 1][j];
122cc03adb90901d226e8b0252a187b19a68fabcc42dandov                points[SkPatchUtils::kBottomP3_CubicCtrlPts] = vertices[i + 1][j + 1];
123cc03adb90901d226e8b0252a187b19a68fabcc42dandov
124cc03adb90901d226e8b0252a187b19a68fabcc42dandov                points[SkPatchUtils::kTopP1_CubicCtrlPts] = hrzCtrl[i][j * 2];
125cc03adb90901d226e8b0252a187b19a68fabcc42dandov                points[SkPatchUtils::kTopP2_CubicCtrlPts] = hrzCtrl[i][j * 2 + 1];
126cc03adb90901d226e8b0252a187b19a68fabcc42dandov                points[SkPatchUtils::kBottomP1_CubicCtrlPts] = hrzCtrl[i + 1][j * 2];
127cc03adb90901d226e8b0252a187b19a68fabcc42dandov                points[SkPatchUtils::kBottomP2_CubicCtrlPts] = hrzCtrl[i + 1][j * 2 + 1];
128cc03adb90901d226e8b0252a187b19a68fabcc42dandov
129cc03adb90901d226e8b0252a187b19a68fabcc42dandov                points[SkPatchUtils::kLeftP1_CubicCtrlPts] = vrtCtrl[i * 2][j];
130cc03adb90901d226e8b0252a187b19a68fabcc42dandov                points[SkPatchUtils::kLeftP2_CubicCtrlPts] = vrtCtrl[i * 2 + 1][j];
131cc03adb90901d226e8b0252a187b19a68fabcc42dandov                points[SkPatchUtils::kRightP1_CubicCtrlPts] = vrtCtrl[i * 2][j + 1];
132cc03adb90901d226e8b0252a187b19a68fabcc42dandov                points[SkPatchUtils::kRightP2_CubicCtrlPts] = vrtCtrl[i * 2 + 1][j + 1];
133cc03adb90901d226e8b0252a187b19a68fabcc42dandov
134cc03adb90901d226e8b0252a187b19a68fabcc42dandov                SkColor colors[4];
135cc03adb90901d226e8b0252a187b19a68fabcc42dandov                colors[0] = cornerColors[i][j];
136cc03adb90901d226e8b0252a187b19a68fabcc42dandov                colors[1] = cornerColors[i][j + 1];
137cc03adb90901d226e8b0252a187b19a68fabcc42dandov                colors[3] = cornerColors[i + 1][j];
138cc03adb90901d226e8b0252a187b19a68fabcc42dandov                colors[2] = cornerColors[i + 1][j + 1];
139cc03adb90901d226e8b0252a187b19a68fabcc42dandov
140cc03adb90901d226e8b0252a187b19a68fabcc42dandov                grid.setPatch(j, i, points, colors, NULL);
141cc03adb90901d226e8b0252a187b19a68fabcc42dandov            }
142cc03adb90901d226e8b0252a187b19a68fabcc42dandov        }
143cc03adb90901d226e8b0252a187b19a68fabcc42dandov
144cc03adb90901d226e8b0252a187b19a68fabcc42dandov        grid.draw(canvas, paint);
145cc03adb90901d226e8b0252a187b19a68fabcc42dandov        SkISize dims = grid.getDimensions();
146cc03adb90901d226e8b0252a187b19a68fabcc42dandov        for (int y = 0; y < dims.height(); y++) {
147cc03adb90901d226e8b0252a187b19a68fabcc42dandov            for (int x = 0; x < dims.width(); x++) {
148cc03adb90901d226e8b0252a187b19a68fabcc42dandov                SkPoint cubics[12];
149cc03adb90901d226e8b0252a187b19a68fabcc42dandov                grid.getPatch(x, y, cubics, NULL, NULL);
150cc03adb90901d226e8b0252a187b19a68fabcc42dandov                draw_control_points(canvas, cubics);
151cc03adb90901d226e8b0252a187b19a68fabcc42dandov            }
152cc03adb90901d226e8b0252a187b19a68fabcc42dandov        }
153cc03adb90901d226e8b0252a187b19a68fabcc42dandov    }
154cc03adb90901d226e8b0252a187b19a68fabcc42dandov
155cc03adb90901d226e8b0252a187b19a68fabcc42dandovprivate:
156cc03adb90901d226e8b0252a187b19a68fabcc42dandov    typedef GM INHERITED;
157cc03adb90901d226e8b0252a187b19a68fabcc42dandov};
158cc03adb90901d226e8b0252a187b19a68fabcc42dandov
159cc03adb90901d226e8b0252a187b19a68fabcc42dandovDEF_GM(return SkNEW(SkPatchGridGM); )
160cc03adb90901d226e8b0252a187b19a68fabcc42dandov
161cc03adb90901d226e8b0252a187b19a68fabcc42dandov}
162