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 12static 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 23static 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 66DEF_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} 128