| 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 #include "SkPatch.h" | 
| 18 | 18 | 
| 19 static void draw_control_points(SkCanvas* canvas, SkPatch& patch, SkPaint& paint
     ) { | 19 static void draw_control_points(SkCanvas* canvas, const SkPatch& patch) { | 
| 20     //draw control points | 20     //draw control points | 
| 21     SkPaint copy(paint); | 21     SkPaint paint; | 
| 22     SkPoint bottom[4]; | 22     SkPoint bottom[SkPatch::kNumPtsCubic]; | 
| 23     patch.getBottomPoints(bottom); | 23     patch.getBottomPoints(bottom); | 
| 24     SkPoint top[4]; | 24     SkPoint top[SkPatch::kNumPtsCubic]; | 
| 25     patch.getTopPoints(top); | 25     patch.getTopPoints(top); | 
| 26     SkPoint left[4]; | 26     SkPoint left[SkPatch::kNumPtsCubic]; | 
| 27     patch.getLeftPoints(left); | 27     patch.getLeftPoints(left); | 
| 28     SkPoint right[4]; | 28     SkPoint right[SkPatch::kNumPtsCubic]; | 
| 29     patch.getRightPoints(right); | 29     patch.getRightPoints(right); | 
| 30 | 30 | 
| 31     copy.setColor(SK_ColorBLACK); | 31     paint.setColor(SK_ColorBLACK); | 
| 32     copy.setStrokeWidth(0.5); | 32     paint.setStrokeWidth(0.5); | 
| 33     SkPoint corners[4] = { bottom[0], bottom[3], top[0], top[3] }; | 33     SkPoint corners[4] = { bottom[0], bottom[3], top[0], top[3] }; | 
| 34     canvas->drawPoints(SkCanvas::kLines_PointMode, 4, bottom, copy); | 34     canvas->drawPoints(SkCanvas::kLines_PointMode, 4, bottom, paint); | 
| 35     canvas->drawPoints(SkCanvas::kLines_PointMode, 2, bottom+1, copy); | 35     canvas->drawPoints(SkCanvas::kLines_PointMode, 2, bottom+1, paint); | 
| 36     canvas->drawPoints(SkCanvas::kLines_PointMode, 4, top, copy); | 36     canvas->drawPoints(SkCanvas::kLines_PointMode, 4, top, paint); | 
| 37     canvas->drawPoints(SkCanvas::kLines_PointMode, 4, left, copy); | 37     canvas->drawPoints(SkCanvas::kLines_PointMode, 4, left, paint); | 
| 38     canvas->drawPoints(SkCanvas::kLines_PointMode, 4, right, copy); | 38     canvas->drawPoints(SkCanvas::kLines_PointMode, 4, right, paint); | 
| 39 | 39 | 
| 40     canvas->drawPoints(SkCanvas::kLines_PointMode, 2, top+1, copy); | 40     canvas->drawPoints(SkCanvas::kLines_PointMode, 2, top+1, paint); | 
| 41     canvas->drawPoints(SkCanvas::kLines_PointMode, 2, left+1, copy); | 41     canvas->drawPoints(SkCanvas::kLines_PointMode, 2, left+1, paint); | 
| 42     canvas->drawPoints(SkCanvas::kLines_PointMode, 2, right+1, copy); | 42     canvas->drawPoints(SkCanvas::kLines_PointMode, 2, right+1, paint); | 
| 43 | 43 | 
| 44     copy.setStrokeWidth(2); | 44     paint.setStrokeWidth(2); | 
| 45 | 45 | 
| 46     copy.setColor(SK_ColorRED); | 46     paint.setColor(SK_ColorRED); | 
| 47     canvas->drawPoints(SkCanvas::kPoints_PointMode, 4, corners, copy); | 47     canvas->drawPoints(SkCanvas::kPoints_PointMode, 4, corners, paint); | 
| 48 | 48 | 
| 49     copy.setColor(SK_ColorBLUE); | 49     paint.setColor(SK_ColorBLUE); | 
| 50     canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, bottom+1, copy); | 50     canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, bottom+1, paint); | 
| 51 | 51 | 
| 52     copy.setColor(SK_ColorCYAN); | 52     paint.setColor(SK_ColorCYAN); | 
| 53     canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, top+1, copy); | 53     canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, top+1, paint); | 
| 54 | 54 | 
| 55     copy.setColor(SK_ColorYELLOW); | 55     paint.setColor(SK_ColorYELLOW); | 
| 56     canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, left+1, copy); | 56     canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, left+1, paint); | 
| 57 | 57 | 
| 58     copy.setColor(SK_ColorGREEN); | 58     paint.setColor(SK_ColorGREEN); | 
| 59     canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, right+1, copy); | 59     canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, right+1, paint); | 
| 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 } | 60 } | 
| 75 | 61 | 
| 76 namespace skiagm { | 62 namespace skiagm { | 
| 77 /** | 63 /** | 
| 78  * This GM draws a SkPatch. | 64  * This GM draws a SkPatch. | 
| 79  */ | 65  */ | 
| 80 class SkPatchGM : public GM { | 66 class SkPatchGM : public GM { | 
| 81 | 67 | 
| 82 public: | 68 public: | 
| 83     SkPatchGM() { | 69     SkPatchGM() { | 
| 84         this->setBGColor(0xFFFFFFFF); | 70         this->setBGColor(0xFFFFFFFF); | 
| 85     } | 71     } | 
| 86 | 72 | 
| 87 protected: | 73 protected: | 
| 88     virtual SkString onShortName() SK_OVERRIDE { | 74     virtual SkString onShortName() SK_OVERRIDE { | 
| 89         return SkString("patch_primitive"); | 75         return SkString("patch_primitive"); | 
| 90     } | 76     } | 
| 91 | 77 | 
| 92     virtual SkISize onISize() SK_OVERRIDE { | 78     virtual SkISize onISize() SK_OVERRIDE { | 
| 93         return SkISize::Make(800, 800); | 79         return SkISize::Make(800, 800); | 
| 94     } | 80     } | 
| 95 | 81 | 
| 96     virtual uint32_t onGetFlags() const SK_OVERRIDE { | 82     virtual uint32_t onGetFlags() const SK_OVERRIDE { | 
| 97         return kSkipTiled_Flag | kSkipPipe_Flag | kSkipPicture_Flag; | 83         return kSkipTiled_Flag; | 
| 98     } | 84     } | 
| 99 | 85 | 
| 100     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { | 86     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { | 
| 101 | 87 | 
| 102         SkPaint paint; | 88         SkPaint paint; | 
| 103         SkColor colors[4] = { | 89 | 
|  | 90         // The order of the colors and points is clockwise starting at upper-lef
     t corner. | 
|  | 91         SkColor colors[SkPatch::kNumColors] = { | 
| 104             SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorCYAN | 92             SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorCYAN | 
| 105         }; | 93         }; | 
| 106         SkPoint points[12] = { | 94         SkPoint points[SkPatch::kNumCtrlPts] = { | 
|  | 95             //top points | 
| 107             {50,50},{75,20},{125,80}, {150,50}, | 96             {50,50},{75,20},{125,80}, {150,50}, | 
| 108             {120,75},{180,125},{150,150}, | 97             //right points | 
| 109             {125,120},{75,180},{50,150}, | 98             {120,75},{180,125}, | 
|  | 99             //bottom points | 
|  | 100             {150,150},{125,120},{75,180},{50,150}, | 
|  | 101             //left points | 
| 110             {20,125},{80,75} | 102             {20,125},{80,75} | 
| 111         }; | 103         }; | 
| 112 | 104 | 
| 113         SkRandom rnd; | 105         SkPatch patch(points, colors); | 
| 114         SkScalar scale = 0.5f; | 106         static const SkScalar kScale = 0.5f; | 
|  | 107         canvas->translate(100, 100); | 
| 115         canvas->save(); | 108         canvas->save(); | 
| 116         for (SkScalar x = 0; x < 4; x++) { | 109         for (SkScalar x = 0; x < 4; x++) { | 
| 117             canvas->save(); | 110             canvas->save(); | 
| 118             canvas->scale(scale * (x + 1), scale * (x + 1)); | 111             canvas->scale(kScale * (x + 1), kScale * (x + 1)); | 
| 119             canvas->translate(x * 100, 0); | 112             canvas->translate(x * 100, 0); | 
| 120             draw_random_patch(points, colors, canvas, paint, &rnd); | 113             canvas->drawPatch(patch, paint); | 
|  | 114             draw_control_points(canvas, patch); | 
| 121             canvas->restore(); | 115             canvas->restore(); | 
| 122         } | 116         } | 
|  | 117 | 
| 123         canvas->translate(0, 270); | 118         canvas->translate(0, 270); | 
| 124         SkScalar skew = 0.1f; | 119 | 
|  | 120         static const SkScalar kSkew = 0.2f; | 
| 125         for (SkScalar x = 0; x < 4; x++) { | 121         for (SkScalar x = 0; x < 4; x++) { | 
| 126             canvas->save(); | 122             canvas->save(); | 
| 127             canvas->scale(scale * (x + 1), scale * (x + 1)); | 123             canvas->scale(kScale * (x + 1), kScale * (x + 1)); | 
| 128             canvas->skew(skew * (x + 1), skew * (x + 1)); |  | 
| 129             canvas->translate(x * 100, 0); | 124             canvas->translate(x * 100, 0); | 
| 130             draw_random_patch(points, colors, canvas, paint, &rnd); | 125             canvas->skew(kSkew * (x + 1), kSkew * (x + 1)); | 
|  | 126             canvas->drawPatch(patch, paint); | 
|  | 127             draw_control_points(canvas, patch); | 
| 131             canvas->restore(); | 128             canvas->restore(); | 
| 132         } | 129         } | 
| 133         canvas->restore(); | 130         canvas->restore(); | 
| 134     } | 131     } | 
| 135 | 132 | 
| 136 private: | 133 private: | 
| 137     typedef GM INHERITED; | 134     typedef GM INHERITED; | 
| 138 }; | 135 }; | 
| 139 | 136 | 
| 140 DEF_GM(return SkNEW(SkPatchGM); ) | 137 DEF_GM(return SkNEW(SkPatchGM); ) | 
| 141 | 138 | 
| 142 } | 139 } | 
| 143 | 140 | 
| 144 #endif | 141 #endif | 
| OLD | NEW | 
|---|