diff options
Diffstat (limited to 'gm/patch.cpp')
-rw-r--r-- | gm/patch.cpp | 146 |
1 files changed, 88 insertions, 58 deletions
diff --git a/gm/patch.cpp b/gm/patch.cpp index eb99944c0b..5658ef6a88 100644 --- a/gm/patch.cpp +++ b/gm/patch.cpp @@ -14,14 +14,71 @@ #include "GrContext.h" #include "GrTest.h" - #include "SkPatch.h" +static void draw_control_points(SkCanvas* canvas, SkPatch& patch, SkPaint& paint) { + //draw control points + SkPaint copy(paint); + SkPoint bottom[4]; + patch.getBottomPoints(bottom); + SkPoint top[4]; + patch.getTopPoints(top); + SkPoint left[4]; + patch.getLeftPoints(left); + SkPoint right[4]; + patch.getRightPoints(right); + + copy.setColor(SK_ColorBLACK); + copy.setStrokeWidth(0.5); + SkPoint corners[4] = { bottom[0], bottom[3], top[0], top[3] }; + canvas->drawPoints(SkCanvas::kLines_PointMode, 4, bottom, copy); + canvas->drawPoints(SkCanvas::kLines_PointMode, 2, bottom+1, copy); + canvas->drawPoints(SkCanvas::kLines_PointMode, 4, top, copy); + canvas->drawPoints(SkCanvas::kLines_PointMode, 4, left, copy); + canvas->drawPoints(SkCanvas::kLines_PointMode, 4, right, copy); + + canvas->drawPoints(SkCanvas::kLines_PointMode, 2, top+1, copy); + canvas->drawPoints(SkCanvas::kLines_PointMode, 2, left+1, copy); + canvas->drawPoints(SkCanvas::kLines_PointMode, 2, right+1, copy); + + copy.setStrokeWidth(2); + + copy.setColor(SK_ColorRED); + canvas->drawPoints(SkCanvas::kPoints_PointMode, 4, corners, copy); + + copy.setColor(SK_ColorBLUE); + canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, bottom+1, copy); + + copy.setColor(SK_ColorCYAN); + canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, top+1, copy); + + copy.setColor(SK_ColorYELLOW); + canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, left+1, copy); + + copy.setColor(SK_ColorGREEN); + canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, right+1, copy); +} + +static void draw_random_patch(SkPoint points[12], SkColor colors[4], SkCanvas* canvas, + SkPaint& paint, SkRandom* rnd) { + SkPoint ptsCpy[12]; + memcpy(ptsCpy, points, 12 * sizeof(SkPoint)); + for (int i = 0; i < 5; i++) { + int index = rnd->nextRangeU(0, 11); + SkScalar dx = rnd->nextRangeScalar(-50, 50), dy = rnd->nextRangeScalar(-50, 50); + ptsCpy[index].offset(dx, dy); + } + SkPatch patch(ptsCpy, colors); + canvas->drawPatch(patch, paint); + draw_control_points(canvas, patch, paint); +} + namespace skiagm { /** * This GM draws a SkPatch. */ class SkPatchGM : public GM { + public: SkPatchGM() { this->setBGColor(0xFFFFFFFF); @@ -37,77 +94,50 @@ protected: } virtual uint32_t onGetFlags() const SK_OVERRIDE { - return kGPUOnly_Flag; + return kSkipTiled_Flag | kSkipPipe_Flag | kSkipPicture_Flag; } - - + virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { - + SkPaint paint; SkColor colors[4] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorCYAN }; - SkPoint points[] = { - {100,100},{130,50},{500,70}, {650,60}, - {350,125},{490,555},{600,700}, - {515,595},{140,550},{110,590}, - {125,400},{70,150} - + SkPoint points[12] = { + {50,50},{75,20},{125,80}, {150,50}, + {120,75},{180,125},{150,150}, + {125,120},{75,180},{50,150}, + {20,125},{80,75} }; - - SkPatch coons(points, colors); - SkPatch::VertexData data; - coons.getVertexData(&data, 10); - - canvas->drawVertices(SkCanvas::kTriangles_VertexMode,data.fVertexCount, - data.fPoints, data.fTexCoords, data.fColors, NULL, data.fIndices, - data.fIndexCount, paint); - - //draw control points - SkPoint bottom[4]; - coons.getBottomPoints(bottom); - SkPoint top[4]; - coons.getTopPoints(top); - SkPoint left[4]; - coons.getLeftPoints(left); - SkPoint right[4]; - coons.getRightPoints(right); - - SkPoint corners[4] = { bottom[0], bottom[3], top[0], top[3] }; - canvas->drawPoints(SkCanvas::kLines_PointMode, 4, bottom, paint); - canvas->drawPoints(SkCanvas::kLines_PointMode, 2, bottom+1, paint); - canvas->drawPoints(SkCanvas::kLines_PointMode, 4, top, paint); - canvas->drawPoints(SkCanvas::kLines_PointMode, 4, left, paint); - canvas->drawPoints(SkCanvas::kLines_PointMode, 4, right, paint); - - canvas->drawPoints(SkCanvas::kLines_PointMode, 2, top+1, paint); - canvas->drawPoints(SkCanvas::kLines_PointMode, 2, left+1, paint); - canvas->drawPoints(SkCanvas::kLines_PointMode, 2, right+1, paint); - - paint.setStrokeWidth(10); - - paint.setColor(SK_ColorRED); - canvas->drawPoints(SkCanvas::kPoints_PointMode, 4, corners, paint); - - paint.setColor(SK_ColorBLUE); - canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, bottom+1, paint); - - paint.setColor(SK_ColorCYAN); - canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, top+1, paint); - - paint.setColor(SK_ColorYELLOW); - canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, left+1, paint); - - paint.setColor(SK_ColorGREEN); - canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, right+1, paint); + SkRandom rnd; + SkScalar scale = 0.5f; + canvas->save(); + for (SkScalar x = 0; x < 4; x++) { + canvas->save(); + canvas->scale(scale * (x + 1), scale * (x + 1)); + canvas->translate(x * 100, 0); + draw_random_patch(points, colors, canvas, paint, &rnd); + canvas->restore(); + } + canvas->translate(0, 270); + SkScalar skew = 0.1f; + for (SkScalar x = 0; x < 4; x++) { + canvas->save(); + canvas->scale(scale * (x + 1), scale * (x + 1)); + canvas->skew(skew * (x + 1), skew * (x + 1)); + canvas->translate(x * 100, 0); + draw_random_patch(points, colors, canvas, paint, &rnd); + canvas->restore(); + } + canvas->restore(); } private: typedef GM INHERITED; }; -DEF_GM( return SkNEW(SkPatchGM); ) +DEF_GM(return SkNEW(SkPatchGM); ) } |