1 /*
2 * Copyright 2014 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "gm.h"
9 #include "SkGradientShader.h"
10 #include "SkPatchUtils.h"
11
make_shader()12 static sk_sp<SkShader> make_shader() {
13 const SkColor colors[] = {
14 SK_ColorRED, SK_ColorCYAN, SK_ColorGREEN, SK_ColorWHITE, SK_ColorMAGENTA, SK_ColorBLUE,
15 SK_ColorYELLOW,
16 };
17 const SkPoint pts[] = { { 100.f / 4.f, 0.f }, { 3.f * 100.f / 4.f, 100.f } };
18
19 return SkGradientShader::MakeLinear(pts, colors, nullptr, SK_ARRAY_COUNT(colors),
20 SkShader::kMirror_TileMode);
21 }
22
draw_control_points(SkCanvas * canvas,const SkPoint cubics[12])23 static void draw_control_points(SkCanvas* canvas, const SkPoint cubics[12]) {
24 //draw control points
25 SkPaint paint;
26 SkPoint bottom[SkPatchUtils::kNumPtsCubic];
27 SkPatchUtils::getBottomCubic(cubics, bottom);
28 SkPoint top[SkPatchUtils::kNumPtsCubic];
29 SkPatchUtils::getTopCubic(cubics, top);
30 SkPoint left[SkPatchUtils::kNumPtsCubic];
31 SkPatchUtils::getLeftCubic(cubics, left);
32 SkPoint right[SkPatchUtils::kNumPtsCubic];
33 SkPatchUtils::getRightCubic(cubics, right);
34
35 paint.setColor(SK_ColorBLACK);
36 paint.setStrokeWidth(0.5f);
37 SkPoint corners[4] = { bottom[0], bottom[3], top[0], top[3] };
38 canvas->drawPoints(SkCanvas::kLines_PointMode, 4, bottom, paint);
39 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, bottom + 1, paint);
40 canvas->drawPoints(SkCanvas::kLines_PointMode, 4, top, paint);
41 canvas->drawPoints(SkCanvas::kLines_PointMode, 4, left, paint);
42 canvas->drawPoints(SkCanvas::kLines_PointMode, 4, right, paint);
43
44 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, top + 1, paint);
45 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, left + 1, paint);
46 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, right + 1, paint);
47
48 paint.setStrokeWidth(2);
49
50 paint.setColor(SK_ColorRED);
51 canvas->drawPoints(SkCanvas::kPoints_PointMode, 4, corners, paint);
52
53 paint.setColor(SK_ColorBLUE);
54 canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, bottom + 1, paint);
55
56 paint.setColor(SK_ColorCYAN);
57 canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, top + 1, paint);
58
59 paint.setColor(SK_ColorYELLOW);
60 canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, left + 1, paint);
61
62 paint.setColor(SK_ColorGREEN);
63 canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, right + 1, paint);
64 }
65
66 DEF_SIMPLE_GM(patch_primitive, canvas, 1500, 1100) {
67 SkPaint paint;
68
69 // The order of the colors and points is clockwise starting at upper-left corner.
70 const SkPoint cubics[SkPatchUtils::kNumCtrlPts] = {
71 //top points
72 {100,100},{150,50},{250,150}, {300,100},
73 //right points
74 {250, 150},{350,250},
75 //bottom points
76 {300,300},{250,250},{150,350},{100,300},
77 //left points
78 {50,250},{150,150}
79 };
80
81 const SkColor colors[SkPatchUtils::kNumCorners] = {
82 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorCYAN
83 };
84 const SkPoint texCoords[SkPatchUtils::kNumCorners] = {
85 {0.0f, 0.0f}, {100.0f, 0.0f}, {100.0f,100.0f}, {0.0f, 100.0f}}
86 ;
87
88 const SkBlendMode modes[] = {
89 SkBlendMode::kSrc,
90 SkBlendMode::kDst,
91 SkBlendMode::kModulate,
92 };
93
94 sk_sp<SkShader> shader(make_shader());
95
96 canvas->save();
97 for (int y = 0; y < 3; y++) {
98 for (int x = 0; x < 4; x++) {
99 canvas->save();
100 canvas->translate(x * 350.0f, y * 350.0f);
101 switch (x) {
102 case 0:
103 canvas->drawPatch(cubics, nullptr, nullptr, modes[y], paint);
104 break;
105 case 1:
106 canvas->drawPatch(cubics, colors, nullptr, modes[y], paint);
107 break;
108 case 2:
109 paint.setShader(shader);
110 canvas->drawPatch(cubics, nullptr, texCoords, modes[y], paint);
111 paint.setShader(nullptr);
112 break;
113 case 3:
114 paint.setShader(shader);
115 canvas->drawPatch(cubics, colors, texCoords, modes[y], paint);
116 paint.setShader(nullptr);
117 break;
118 default:
119 break;
120 }
121
122 draw_control_points(canvas, cubics);
123 canvas->restore();
124 }
125 }
126 canvas->restore();
127 }
128