Add fixes & test for isConfigTexturable and isConfigRenderable
[platform/upstream/libSkiaSharp.git] / gm / patch.cpp
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
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
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 }