150d715476b1d3a00fb43c13e34a80ea0a01d32bfdandov
250d715476b1d3a00fb43c13e34a80ea0a01d32bfdandov/*
350d715476b1d3a00fb43c13e34a80ea0a01d32bfdandov * Copyright 2014 Google Inc.
450d715476b1d3a00fb43c13e34a80ea0a01d32bfdandov *
550d715476b1d3a00fb43c13e34a80ea0a01d32bfdandov * Use of this source code is governed by a BSD-style license that can be
650d715476b1d3a00fb43c13e34a80ea0a01d32bfdandov * found in the LICENSE file.
750d715476b1d3a00fb43c13e34a80ea0a01d32bfdandov */
850d715476b1d3a00fb43c13e34a80ea0a01d32bfdandov
950d715476b1d3a00fb43c13e34a80ea0a01d32bfdandov#include "gm.h"
10b3c9d1c33caf325aada244204215eb790c228c12dandov#include "SkGradientShader.h"
11b3c9d1c33caf325aada244204215eb790c228c12dandov#include "SkPatchUtils.h"
12b3c9d1c33caf325aada244204215eb790c228c12dandov
13b3c9d1c33caf325aada244204215eb790c228c12dandovstatic SkShader* make_shader() {
14b3c9d1c33caf325aada244204215eb790c228c12dandov    const SkColor colors[] = {
15b3c9d1c33caf325aada244204215eb790c228c12dandov        SK_ColorRED, SK_ColorCYAN, SK_ColorGREEN, SK_ColorWHITE, SK_ColorMAGENTA, SK_ColorBLUE,
16b3c9d1c33caf325aada244204215eb790c228c12dandov        SK_ColorYELLOW,
17b3c9d1c33caf325aada244204215eb790c228c12dandov    };
18b3c9d1c33caf325aada244204215eb790c228c12dandov    const SkPoint pts[] = { { 100.f / 4.f, 0.f }, { 3.f * 100.f / 4.f, 100.f } };
19b3c9d1c33caf325aada244204215eb790c228c12dandov
202880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    return SkGradientShader::CreateLinear(pts, colors, nullptr, SK_ARRAY_COUNT(colors),
21b3c9d1c33caf325aada244204215eb790c228c12dandov                                          SkShader::kMirror_TileMode);
22b3c9d1c33caf325aada244204215eb790c228c12dandov}
2350d715476b1d3a00fb43c13e34a80ea0a01d32bfdandov
24b3c9d1c33caf325aada244204215eb790c228c12dandovstatic void draw_control_points(SkCanvas* canvas, const SkPoint cubics[12]) {
25ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov    //draw control points
26963137b75c0a1fe91f35e9826742f36309f5e65ddandov    SkPaint paint;
27b3c9d1c33caf325aada244204215eb790c228c12dandov    SkPoint bottom[SkPatchUtils::kNumPtsCubic];
28b3c9d1c33caf325aada244204215eb790c228c12dandov    SkPatchUtils::getBottomCubic(cubics, bottom);
29b3c9d1c33caf325aada244204215eb790c228c12dandov    SkPoint top[SkPatchUtils::kNumPtsCubic];
30b3c9d1c33caf325aada244204215eb790c228c12dandov    SkPatchUtils::getTopCubic(cubics, top);
31b3c9d1c33caf325aada244204215eb790c228c12dandov    SkPoint left[SkPatchUtils::kNumPtsCubic];
32b3c9d1c33caf325aada244204215eb790c228c12dandov    SkPatchUtils::getLeftCubic(cubics, left);
33b3c9d1c33caf325aada244204215eb790c228c12dandov    SkPoint right[SkPatchUtils::kNumPtsCubic];
34b3c9d1c33caf325aada244204215eb790c228c12dandov    SkPatchUtils::getRightCubic(cubics, right);
35ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov
36963137b75c0a1fe91f35e9826742f36309f5e65ddandov    paint.setColor(SK_ColorBLACK);
37b3c9d1c33caf325aada244204215eb790c228c12dandov    paint.setStrokeWidth(0.5f);
38ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov    SkPoint corners[4] = { bottom[0], bottom[3], top[0], top[3] };
39963137b75c0a1fe91f35e9826742f36309f5e65ddandov    canvas->drawPoints(SkCanvas::kLines_PointMode, 4, bottom, paint);
40b3c9d1c33caf325aada244204215eb790c228c12dandov    canvas->drawPoints(SkCanvas::kLines_PointMode, 2, bottom + 1, paint);
41963137b75c0a1fe91f35e9826742f36309f5e65ddandov    canvas->drawPoints(SkCanvas::kLines_PointMode, 4, top, paint);
42963137b75c0a1fe91f35e9826742f36309f5e65ddandov    canvas->drawPoints(SkCanvas::kLines_PointMode, 4, left, paint);
43963137b75c0a1fe91f35e9826742f36309f5e65ddandov    canvas->drawPoints(SkCanvas::kLines_PointMode, 4, right, paint);
44ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov
45b3c9d1c33caf325aada244204215eb790c228c12dandov    canvas->drawPoints(SkCanvas::kLines_PointMode, 2, top + 1, paint);
46b3c9d1c33caf325aada244204215eb790c228c12dandov    canvas->drawPoints(SkCanvas::kLines_PointMode, 2, left + 1, paint);
47b3c9d1c33caf325aada244204215eb790c228c12dandov    canvas->drawPoints(SkCanvas::kLines_PointMode, 2, right + 1, paint);
48ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov
49963137b75c0a1fe91f35e9826742f36309f5e65ddandov    paint.setStrokeWidth(2);
50ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov
51963137b75c0a1fe91f35e9826742f36309f5e65ddandov    paint.setColor(SK_ColorRED);
52963137b75c0a1fe91f35e9826742f36309f5e65ddandov    canvas->drawPoints(SkCanvas::kPoints_PointMode, 4, corners, paint);
53ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov
54963137b75c0a1fe91f35e9826742f36309f5e65ddandov    paint.setColor(SK_ColorBLUE);
55b3c9d1c33caf325aada244204215eb790c228c12dandov    canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, bottom + 1, paint);
56ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov
57963137b75c0a1fe91f35e9826742f36309f5e65ddandov    paint.setColor(SK_ColorCYAN);
58b3c9d1c33caf325aada244204215eb790c228c12dandov    canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, top + 1, paint);
59ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov
60963137b75c0a1fe91f35e9826742f36309f5e65ddandov    paint.setColor(SK_ColorYELLOW);
61b3c9d1c33caf325aada244204215eb790c228c12dandov    canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, left + 1, paint);
62ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov
63963137b75c0a1fe91f35e9826742f36309f5e65ddandov    paint.setColor(SK_ColorGREEN);
64b3c9d1c33caf325aada244204215eb790c228c12dandov    canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, right + 1, paint);
65ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov}
66ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov
672880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_SIMPLE_GM(patch_primitive, canvas, 800, 800) {
6850d715476b1d3a00fb43c13e34a80ea0a01d32bfdandov        SkPaint paint;
69963137b75c0a1fe91f35e9826742f36309f5e65ddandov
70963137b75c0a1fe91f35e9826742f36309f5e65ddandov        // The order of the colors and points is clockwise starting at upper-left corner.
71b3c9d1c33caf325aada244204215eb790c228c12dandov        const SkPoint cubics[SkPatchUtils::kNumCtrlPts] = {
72963137b75c0a1fe91f35e9826742f36309f5e65ddandov            //top points
73b3c9d1c33caf325aada244204215eb790c228c12dandov            {100,100},{150,50},{250,150}, {300,100},
74963137b75c0a1fe91f35e9826742f36309f5e65ddandov            //right points
75b3c9d1c33caf325aada244204215eb790c228c12dandov            {250, 150},{350,250},
76963137b75c0a1fe91f35e9826742f36309f5e65ddandov            //bottom points
77b3c9d1c33caf325aada244204215eb790c228c12dandov            {300,300},{250,250},{150,350},{100,300},
78963137b75c0a1fe91f35e9826742f36309f5e65ddandov            //left points
79b3c9d1c33caf325aada244204215eb790c228c12dandov            {50,250},{150,150}
8050d715476b1d3a00fb43c13e34a80ea0a01d32bfdandov        };
8150d715476b1d3a00fb43c13e34a80ea0a01d32bfdandov
82b3c9d1c33caf325aada244204215eb790c228c12dandov        const SkColor colors[SkPatchUtils::kNumCorners] = {
83b3c9d1c33caf325aada244204215eb790c228c12dandov            SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorCYAN
84b3c9d1c33caf325aada244204215eb790c228c12dandov        };
85b3c9d1c33caf325aada244204215eb790c228c12dandov        const SkPoint texCoords[SkPatchUtils::kNumCorners] = {
86b3c9d1c33caf325aada244204215eb790c228c12dandov            {0.0f, 0.0f}, {100.0f, 0.0f}, {100.0f,100.0f}, {0.0f, 100.0f}}
87b3c9d1c33caf325aada244204215eb790c228c12dandov        ;
88963137b75c0a1fe91f35e9826742f36309f5e65ddandov
89b3c9d1c33caf325aada244204215eb790c228c12dandov        const SkXfermode::Mode modes[] = {
90b3c9d1c33caf325aada244204215eb790c228c12dandov            SkXfermode::kSrc_Mode,
91b3c9d1c33caf325aada244204215eb790c228c12dandov            SkXfermode::kDst_Mode,
92b3c9d1c33caf325aada244204215eb790c228c12dandov            SkXfermode::kModulate_Mode,
93b3c9d1c33caf325aada244204215eb790c228c12dandov        };
94963137b75c0a1fe91f35e9826742f36309f5e65ddandov
95b3c9d1c33caf325aada244204215eb790c228c12dandov        SkAutoTUnref<SkShader> shader(make_shader());
96b3c9d1c33caf325aada244204215eb790c228c12dandov
97b3c9d1c33caf325aada244204215eb790c228c12dandov        canvas->save();
98b3c9d1c33caf325aada244204215eb790c228c12dandov        for (int y = 0; y < 3; y++) {
99b3c9d1c33caf325aada244204215eb790c228c12dandov            SkAutoTUnref<SkXfermode> xfer(SkXfermode::Create(modes[y]));
100b3c9d1c33caf325aada244204215eb790c228c12dandov
101b3c9d1c33caf325aada244204215eb790c228c12dandov            for (int x = 0; x < 4; x++) {
102b3c9d1c33caf325aada244204215eb790c228c12dandov                canvas->save();
103b3c9d1c33caf325aada244204215eb790c228c12dandov                canvas->translate(x * 350.0f, y * 350.0f);
104b3c9d1c33caf325aada244204215eb790c228c12dandov                switch (x) {
105b3c9d1c33caf325aada244204215eb790c228c12dandov                    case 0:
1062880df2609eba09b555ca37be04b6ad89290c765Tom Hudson                        canvas->drawPatch(cubics, nullptr, nullptr, xfer, paint);
107b3c9d1c33caf325aada244204215eb790c228c12dandov                        break;
108b3c9d1c33caf325aada244204215eb790c228c12dandov                    case 1:
1092880df2609eba09b555ca37be04b6ad89290c765Tom Hudson                        canvas->drawPatch(cubics, colors, nullptr, xfer, paint);
110b3c9d1c33caf325aada244204215eb790c228c12dandov                        break;
111b3c9d1c33caf325aada244204215eb790c228c12dandov                    case 2:
112b3c9d1c33caf325aada244204215eb790c228c12dandov                        paint.setShader(shader);
1132880df2609eba09b555ca37be04b6ad89290c765Tom Hudson                        canvas->drawPatch(cubics, nullptr, texCoords, xfer, paint);
1142880df2609eba09b555ca37be04b6ad89290c765Tom Hudson                        paint.setShader(nullptr);
115b3c9d1c33caf325aada244204215eb790c228c12dandov                        break;
116b3c9d1c33caf325aada244204215eb790c228c12dandov                    case 3:
117b3c9d1c33caf325aada244204215eb790c228c12dandov                        paint.setShader(shader);
118b3c9d1c33caf325aada244204215eb790c228c12dandov                        canvas->drawPatch(cubics, colors, texCoords, xfer, paint);
1192880df2609eba09b555ca37be04b6ad89290c765Tom Hudson                        paint.setShader(nullptr);
120b3c9d1c33caf325aada244204215eb790c228c12dandov                        break;
121b3c9d1c33caf325aada244204215eb790c228c12dandov                    default:
122b3c9d1c33caf325aada244204215eb790c228c12dandov                        break;
123b3c9d1c33caf325aada244204215eb790c228c12dandov                }
124b3c9d1c33caf325aada244204215eb790c228c12dandov
125b3c9d1c33caf325aada244204215eb790c228c12dandov                draw_control_points(canvas, cubics);
126b3c9d1c33caf325aada244204215eb790c228c12dandov                canvas->restore();
127b3c9d1c33caf325aada244204215eb790c228c12dandov            }
128ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov        }
129ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov        canvas->restore();
13050d715476b1d3a00fb43c13e34a80ea0a01d32bfdandov}
131