blob: 5658ef6a889d9d65788a708a7cff44e57259b9d6 [file] [log] [blame]
dandov50d71542014-07-25 10:44:53 -07001
2/*
3 * Copyright 2014 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9// This test only works with the GPU backend.
10
11#include "gm.h"
12
13#if SK_SUPPORT_GPU
14
15#include "GrContext.h"
16#include "GrTest.h"
dandov50d71542014-07-25 10:44:53 -070017#include "SkPatch.h"
18
dandovecfff212014-08-04 10:02:00 -070019static 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
62static void draw_random_patch(SkPoint points[12], SkColor colors[4], SkCanvas* canvas,
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}
75
dandov50d71542014-07-25 10:44:53 -070076namespace skiagm {
77/**
78 * This GM draws a SkPatch.
79 */
80class SkPatchGM : public GM {
dandovecfff212014-08-04 10:02:00 -070081
dandov50d71542014-07-25 10:44:53 -070082public:
83 SkPatchGM() {
84 this->setBGColor(0xFFFFFFFF);
85 }
86
87protected:
88 virtual SkString onShortName() SK_OVERRIDE {
89 return SkString("patch_primitive");
90 }
91
92 virtual SkISize onISize() SK_OVERRIDE {
93 return SkISize::Make(800, 800);
94 }
95
96 virtual uint32_t onGetFlags() const SK_OVERRIDE {
dandovecfff212014-08-04 10:02:00 -070097 return kSkipTiled_Flag | kSkipPipe_Flag | kSkipPicture_Flag;
dandov50d71542014-07-25 10:44:53 -070098 }
dandovecfff212014-08-04 10:02:00 -070099
dandov50d71542014-07-25 10:44:53 -0700100 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
dandovecfff212014-08-04 10:02:00 -0700101
dandov50d71542014-07-25 10:44:53 -0700102 SkPaint paint;
103 SkColor colors[4] = {
104 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorCYAN
105 };
dandovecfff212014-08-04 10:02:00 -0700106 SkPoint points[12] = {
107 {50,50},{75,20},{125,80}, {150,50},
108 {120,75},{180,125},{150,150},
109 {125,120},{75,180},{50,150},
110 {20,125},{80,75}
dandov50d71542014-07-25 10:44:53 -0700111 };
dandov50d71542014-07-25 10:44:53 -0700112
dandovecfff212014-08-04 10:02:00 -0700113 SkRandom rnd;
114 SkScalar scale = 0.5f;
115 canvas->save();
116 for (SkScalar x = 0; x < 4; x++) {
117 canvas->save();
118 canvas->scale(scale * (x + 1), scale * (x + 1));
119 canvas->translate(x * 100, 0);
120 draw_random_patch(points, colors, canvas, paint, &rnd);
121 canvas->restore();
122 }
123 canvas->translate(0, 270);
124 SkScalar skew = 0.1f;
125 for (SkScalar x = 0; x < 4; x++) {
126 canvas->save();
127 canvas->scale(scale * (x + 1), scale * (x + 1));
128 canvas->skew(skew * (x + 1), skew * (x + 1));
129 canvas->translate(x * 100, 0);
130 draw_random_patch(points, colors, canvas, paint, &rnd);
131 canvas->restore();
132 }
133 canvas->restore();
dandov50d71542014-07-25 10:44:53 -0700134 }
135
136private:
137 typedef GM INHERITED;
138};
139
dandovecfff212014-08-04 10:02:00 -0700140DEF_GM(return SkNEW(SkPatchGM); )
dandov50d71542014-07-25 10:44:53 -0700141
142}
143
144#endif