OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2014 Google Inc. | 3 * Copyright 2014 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 // This test only works with the GPU backend. | 9 // This test only works with the GPU backend. |
10 | 10 |
11 #include "gm.h" | 11 #include "gm.h" |
12 | 12 |
13 #if SK_SUPPORT_GPU | 13 #if SK_SUPPORT_GPU |
14 | 14 |
15 #include "GrContext.h" | 15 #include "GrContext.h" |
16 #include "GrTest.h" | 16 #include "GrTest.h" |
| 17 #include "SkPatch.h" |
17 | 18 |
18 #include "SkPatch.h" | 19 static void draw_control_points(SkCanvas* canvas, SkPatch& patch, SkPaint& paint
) { |
| 20 //draw control points |
| 21 SkPaint copy(paint); |
| 22 SkPoint bottom[4]; |
| 23 patch.getBottomPoints(bottom); |
| 24 SkPoint top[4]; |
| 25 patch.getTopPoints(top); |
| 26 SkPoint left[4]; |
| 27 patch.getLeftPoints(left); |
| 28 SkPoint right[4]; |
| 29 patch.getRightPoints(right); |
| 30 |
| 31 copy.setColor(SK_ColorBLACK); |
| 32 copy.setStrokeWidth(0.5); |
| 33 SkPoint corners[4] = { bottom[0], bottom[3], top[0], top[3] }; |
| 34 canvas->drawPoints(SkCanvas::kLines_PointMode, 4, bottom, copy); |
| 35 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, bottom+1, copy); |
| 36 canvas->drawPoints(SkCanvas::kLines_PointMode, 4, top, copy); |
| 37 canvas->drawPoints(SkCanvas::kLines_PointMode, 4, left, copy); |
| 38 canvas->drawPoints(SkCanvas::kLines_PointMode, 4, right, copy); |
| 39 |
| 40 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, top+1, copy); |
| 41 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, left+1, copy); |
| 42 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, right+1, copy); |
| 43 |
| 44 copy.setStrokeWidth(2); |
| 45 |
| 46 copy.setColor(SK_ColorRED); |
| 47 canvas->drawPoints(SkCanvas::kPoints_PointMode, 4, corners, copy); |
| 48 |
| 49 copy.setColor(SK_ColorBLUE); |
| 50 canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, bottom+1, copy); |
| 51 |
| 52 copy.setColor(SK_ColorCYAN); |
| 53 canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, top+1, copy); |
| 54 |
| 55 copy.setColor(SK_ColorYELLOW); |
| 56 canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, left+1, copy); |
| 57 |
| 58 copy.setColor(SK_ColorGREEN); |
| 59 canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, right+1, copy); |
| 60 } |
| 61 |
| 62 static void draw_random_patch(SkPoint points[12], SkColor colors[4], SkCanvas* c
anvas, |
| 63 SkPaint& paint, SkRandom* rnd) { |
| 64 SkPoint ptsCpy[12]; |
| 65 memcpy(ptsCpy, points, 12 * sizeof(SkPoint)); |
| 66 for (int i = 0; i < 5; i++) { |
| 67 int index = rnd->nextRangeU(0, 11); |
| 68 SkScalar dx = rnd->nextRangeScalar(-50, 50), dy = rnd->nextRangeScalar(-
50, 50); |
| 69 ptsCpy[index].offset(dx, dy); |
| 70 } |
| 71 SkPatch patch(ptsCpy, colors); |
| 72 canvas->drawPatch(patch, paint); |
| 73 draw_control_points(canvas, patch, paint); |
| 74 } |
19 | 75 |
20 namespace skiagm { | 76 namespace skiagm { |
21 /** | 77 /** |
22 * This GM draws a SkPatch. | 78 * This GM draws a SkPatch. |
23 */ | 79 */ |
24 class SkPatchGM : public GM { | 80 class SkPatchGM : public GM { |
| 81 |
25 public: | 82 public: |
26 SkPatchGM() { | 83 SkPatchGM() { |
27 this->setBGColor(0xFFFFFFFF); | 84 this->setBGColor(0xFFFFFFFF); |
28 } | 85 } |
29 | 86 |
30 protected: | 87 protected: |
31 virtual SkString onShortName() SK_OVERRIDE { | 88 virtual SkString onShortName() SK_OVERRIDE { |
32 return SkString("patch_primitive"); | 89 return SkString("patch_primitive"); |
33 } | 90 } |
34 | 91 |
35 virtual SkISize onISize() SK_OVERRIDE { | 92 virtual SkISize onISize() SK_OVERRIDE { |
36 return SkISize::Make(800, 800); | 93 return SkISize::Make(800, 800); |
37 } | 94 } |
38 | 95 |
39 virtual uint32_t onGetFlags() const SK_OVERRIDE { | 96 virtual uint32_t onGetFlags() const SK_OVERRIDE { |
40 return kGPUOnly_Flag; | 97 return kSkipTiled_Flag | kSkipPipe_Flag | kSkipPicture_Flag; |
41 } | 98 } |
42 | 99 |
43 | |
44 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { | 100 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { |
45 | 101 |
46 SkPaint paint; | 102 SkPaint paint; |
47 SkColor colors[4] = { | 103 SkColor colors[4] = { |
48 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorCYAN | 104 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorCYAN |
49 }; | 105 }; |
50 SkPoint points[] = { | 106 SkPoint points[12] = { |
51 {100,100},{130,50},{500,70}, {650,60}, | 107 {50,50},{75,20},{125,80}, {150,50}, |
52 {350,125},{490,555},{600,700}, | 108 {120,75},{180,125},{150,150}, |
53 {515,595},{140,550},{110,590}, | 109 {125,120},{75,180},{50,150}, |
54 {125,400},{70,150} | 110 {20,125},{80,75} |
55 | |
56 }; | 111 }; |
57 | |
58 SkPatch coons(points, colors); | |
59 | 112 |
60 SkPatch::VertexData data; | 113 SkRandom rnd; |
61 coons.getVertexData(&data, 10); | 114 SkScalar scale = 0.5f; |
62 | 115 canvas->save(); |
63 canvas->drawVertices(SkCanvas::kTriangles_VertexMode,data.fVertexCount, | 116 for (SkScalar x = 0; x < 4; x++) { |
64 data.fPoints, data.fTexCoords, data.fColors, NULL, data.fIndices, | 117 canvas->save(); |
65 data.fIndexCount, paint); | 118 canvas->scale(scale * (x + 1), scale * (x + 1)); |
66 | 119 canvas->translate(x * 100, 0); |
67 //draw control points | 120 draw_random_patch(points, colors, canvas, paint, &rnd); |
68 SkPoint bottom[4]; | 121 canvas->restore(); |
69 coons.getBottomPoints(bottom); | 122 } |
70 SkPoint top[4]; | 123 canvas->translate(0, 270); |
71 coons.getTopPoints(top); | 124 SkScalar skew = 0.1f; |
72 SkPoint left[4]; | 125 for (SkScalar x = 0; x < 4; x++) { |
73 coons.getLeftPoints(left); | 126 canvas->save(); |
74 SkPoint right[4]; | 127 canvas->scale(scale * (x + 1), scale * (x + 1)); |
75 coons.getRightPoints(right); | 128 canvas->skew(skew * (x + 1), skew * (x + 1)); |
76 | 129 canvas->translate(x * 100, 0); |
77 SkPoint corners[4] = { bottom[0], bottom[3], top[0], top[3] }; | 130 draw_random_patch(points, colors, canvas, paint, &rnd); |
78 canvas->drawPoints(SkCanvas::kLines_PointMode, 4, bottom, paint); | 131 canvas->restore(); |
79 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, bottom+1, paint); | 132 } |
80 canvas->drawPoints(SkCanvas::kLines_PointMode, 4, top, paint); | 133 canvas->restore(); |
81 canvas->drawPoints(SkCanvas::kLines_PointMode, 4, left, paint); | |
82 canvas->drawPoints(SkCanvas::kLines_PointMode, 4, right, paint); | |
83 | |
84 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, top+1, paint); | |
85 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, left+1, paint); | |
86 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, right+1, paint); | |
87 | |
88 paint.setStrokeWidth(10); | |
89 | |
90 paint.setColor(SK_ColorRED); | |
91 canvas->drawPoints(SkCanvas::kPoints_PointMode, 4, corners, paint); | |
92 | |
93 paint.setColor(SK_ColorBLUE); | |
94 canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, bottom+1, paint); | |
95 | |
96 paint.setColor(SK_ColorCYAN); | |
97 canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, top+1, paint); | |
98 | |
99 paint.setColor(SK_ColorYELLOW); | |
100 canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, left+1, paint); | |
101 | |
102 paint.setColor(SK_ColorGREEN); | |
103 canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, right+1, paint); | |
104 } | 134 } |
105 | 135 |
106 private: | 136 private: |
107 typedef GM INHERITED; | 137 typedef GM INHERITED; |
108 }; | 138 }; |
109 | 139 |
110 DEF_GM( return SkNEW(SkPatchGM); ) | 140 DEF_GM(return SkNEW(SkPatchGM); ) |
111 | 141 |
112 } | 142 } |
113 | 143 |
114 #endif | 144 #endif |
OLD | NEW |