1cc03adb90901d226e8b0252a187b19a68fabcc42dandov 2cc03adb90901d226e8b0252a187b19a68fabcc42dandov/* 3cc03adb90901d226e8b0252a187b19a68fabcc42dandov * Copyright 2014 Google Inc. 4cc03adb90901d226e8b0252a187b19a68fabcc42dandov * 5cc03adb90901d226e8b0252a187b19a68fabcc42dandov * Use of this source code is governed by a BSD-style license that can be 6cc03adb90901d226e8b0252a187b19a68fabcc42dandov * found in the LICENSE file. 7cc03adb90901d226e8b0252a187b19a68fabcc42dandov */ 8cc03adb90901d226e8b0252a187b19a68fabcc42dandov 9cc03adb90901d226e8b0252a187b19a68fabcc42dandov#include "gm.h" 10cc03adb90901d226e8b0252a187b19a68fabcc42dandov#include "SkPatchGrid.h" 11cc03adb90901d226e8b0252a187b19a68fabcc42dandov 12cc03adb90901d226e8b0252a187b19a68fabcc42dandovstatic void draw_control_points(SkCanvas* canvas, const SkPoint cubics[12]) { 13cc03adb90901d226e8b0252a187b19a68fabcc42dandov //draw control points 14cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkPaint paint; 15cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkPoint bottom[4]; 16cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkPatchUtils::getBottomCubic(cubics, bottom); 17cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkPoint top[4]; 18cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkPatchUtils::getTopCubic(cubics, top); 19cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkPoint left[4]; 20cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkPatchUtils::getLeftCubic(cubics, left); 21cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkPoint right[4]; 22cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkPatchUtils::getRightCubic(cubics, right); 23cc03adb90901d226e8b0252a187b19a68fabcc42dandov 24cc03adb90901d226e8b0252a187b19a68fabcc42dandov paint.setColor(SK_ColorBLACK); 25cc03adb90901d226e8b0252a187b19a68fabcc42dandov paint.setStrokeWidth(0.5); 26cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkPoint corners[4] = { bottom[0], bottom[3], top[0], top[3] }; 27cc03adb90901d226e8b0252a187b19a68fabcc42dandov canvas->drawPoints(SkCanvas::kLines_PointMode, 4, bottom, paint); 28cc03adb90901d226e8b0252a187b19a68fabcc42dandov canvas->drawPoints(SkCanvas::kLines_PointMode, 2, bottom+1, paint); 29cc03adb90901d226e8b0252a187b19a68fabcc42dandov canvas->drawPoints(SkCanvas::kLines_PointMode, 4, top, paint); 30cc03adb90901d226e8b0252a187b19a68fabcc42dandov canvas->drawPoints(SkCanvas::kLines_PointMode, 4, left, paint); 31cc03adb90901d226e8b0252a187b19a68fabcc42dandov canvas->drawPoints(SkCanvas::kLines_PointMode, 4, right, paint); 32cc03adb90901d226e8b0252a187b19a68fabcc42dandov 33cc03adb90901d226e8b0252a187b19a68fabcc42dandov canvas->drawPoints(SkCanvas::kLines_PointMode, 2, top+1, paint); 34cc03adb90901d226e8b0252a187b19a68fabcc42dandov canvas->drawPoints(SkCanvas::kLines_PointMode, 2, left+1, paint); 35cc03adb90901d226e8b0252a187b19a68fabcc42dandov canvas->drawPoints(SkCanvas::kLines_PointMode, 2, right+1, paint); 36cc03adb90901d226e8b0252a187b19a68fabcc42dandov 37cc03adb90901d226e8b0252a187b19a68fabcc42dandov paint.setStrokeWidth(2); 38cc03adb90901d226e8b0252a187b19a68fabcc42dandov 39cc03adb90901d226e8b0252a187b19a68fabcc42dandov paint.setColor(SK_ColorRED); 40cc03adb90901d226e8b0252a187b19a68fabcc42dandov canvas->drawPoints(SkCanvas::kPoints_PointMode, 4, corners, paint); 41cc03adb90901d226e8b0252a187b19a68fabcc42dandov 42cc03adb90901d226e8b0252a187b19a68fabcc42dandov paint.setColor(SK_ColorBLUE); 43cc03adb90901d226e8b0252a187b19a68fabcc42dandov canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, bottom+1, paint); 44cc03adb90901d226e8b0252a187b19a68fabcc42dandov 45cc03adb90901d226e8b0252a187b19a68fabcc42dandov paint.setColor(SK_ColorCYAN); 46cc03adb90901d226e8b0252a187b19a68fabcc42dandov canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, top+1, paint); 47cc03adb90901d226e8b0252a187b19a68fabcc42dandov 48cc03adb90901d226e8b0252a187b19a68fabcc42dandov paint.setColor(SK_ColorYELLOW); 49cc03adb90901d226e8b0252a187b19a68fabcc42dandov canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, left+1, paint); 50cc03adb90901d226e8b0252a187b19a68fabcc42dandov 51cc03adb90901d226e8b0252a187b19a68fabcc42dandov paint.setColor(SK_ColorGREEN); 52cc03adb90901d226e8b0252a187b19a68fabcc42dandov canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, right+1, paint); 53cc03adb90901d226e8b0252a187b19a68fabcc42dandov} 54cc03adb90901d226e8b0252a187b19a68fabcc42dandov 55cc03adb90901d226e8b0252a187b19a68fabcc42dandovnamespace skiagm { 56cc03adb90901d226e8b0252a187b19a68fabcc42dandov/** 57cc03adb90901d226e8b0252a187b19a68fabcc42dandov * This GM draws a grid of patches, it only uses colors so it could be considered a mesh gradient. 58cc03adb90901d226e8b0252a187b19a68fabcc42dandov */ 59cc03adb90901d226e8b0252a187b19a68fabcc42dandovclass SkPatchGridGM : public GM { 60cc03adb90901d226e8b0252a187b19a68fabcc42dandov 61cc03adb90901d226e8b0252a187b19a68fabcc42dandovpublic: 62cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkPatchGridGM() { 63cc03adb90901d226e8b0252a187b19a68fabcc42dandov this->setBGColor(0xFFFFFFFF); 64cc03adb90901d226e8b0252a187b19a68fabcc42dandov } 65cc03adb90901d226e8b0252a187b19a68fabcc42dandov 66cc03adb90901d226e8b0252a187b19a68fabcc42dandovprotected: 6736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkString onShortName() override { 68cc03adb90901d226e8b0252a187b19a68fabcc42dandov return SkString("patch_grid"); 69cc03adb90901d226e8b0252a187b19a68fabcc42dandov } 70cc03adb90901d226e8b0252a187b19a68fabcc42dandov 7136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkISize onISize() override { 72cc03adb90901d226e8b0252a187b19a68fabcc42dandov return SkISize::Make(800, 800); 73cc03adb90901d226e8b0252a187b19a68fabcc42dandov } 74cc03adb90901d226e8b0252a187b19a68fabcc42dandov 7536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(SkCanvas* canvas) override { 76cc03adb90901d226e8b0252a187b19a68fabcc42dandov 77cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkPaint paint; 78cc03adb90901d226e8b0252a187b19a68fabcc42dandov 79cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkPoint vertices[4][5] = { 80cc03adb90901d226e8b0252a187b19a68fabcc42dandov {{50,50}, {150,50}, {250,50},{350,50},{450,50}}, 81cc03adb90901d226e8b0252a187b19a68fabcc42dandov {{50,150}, {120,120}, {250,150},{350,150},{450,150}}, 82cc03adb90901d226e8b0252a187b19a68fabcc42dandov {{50,250}, {150,250}, {250,250},{350,250},{450,250}}, 83cc03adb90901d226e8b0252a187b19a68fabcc42dandov {{100,300}, {150,350}, {250,350},{350,350},{450,350}} 84cc03adb90901d226e8b0252a187b19a68fabcc42dandov }; 85cc03adb90901d226e8b0252a187b19a68fabcc42dandov 86cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkColor cornerColors[4][5] = { 87cc03adb90901d226e8b0252a187b19a68fabcc42dandov {SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE}, 88cc03adb90901d226e8b0252a187b19a68fabcc42dandov {SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED}, 89cc03adb90901d226e8b0252a187b19a68fabcc42dandov {SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE}, 90cc03adb90901d226e8b0252a187b19a68fabcc42dandov {SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED}, 91cc03adb90901d226e8b0252a187b19a68fabcc42dandov }; 92cc03adb90901d226e8b0252a187b19a68fabcc42dandov 93cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkPoint hrzCtrl[4][8] = { 94cc03adb90901d226e8b0252a187b19a68fabcc42dandov {{75,30},{125,45},{175,70},{225,20},{275,50},{325,50},{375,5},{425,90}}, 95cc03adb90901d226e8b0252a187b19a68fabcc42dandov {{75,150},{125,150},{175,150},{225,150},{275,150},{325,150},{375,150},{425,150}}, 96cc03adb90901d226e8b0252a187b19a68fabcc42dandov {{75,250},{125,250},{175,250},{225,250},{275,200},{325,150},{375,250},{425,250}}, 97cc03adb90901d226e8b0252a187b19a68fabcc42dandov {{75,350},{125,350},{175,350},{225,350},{275,350},{325,350},{375,350},{425,350}} 98cc03adb90901d226e8b0252a187b19a68fabcc42dandov }; 99cc03adb90901d226e8b0252a187b19a68fabcc42dandov 100cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkPoint vrtCtrl[6][5] = { 101cc03adb90901d226e8b0252a187b19a68fabcc42dandov {{50,75},{150,75},{250,75},{350,75},{450,75}}, 102cc03adb90901d226e8b0252a187b19a68fabcc42dandov {{50,125},{150,125},{250,125},{350,125},{450,125}}, 103cc03adb90901d226e8b0252a187b19a68fabcc42dandov {{50,175},{150,175},{220,225},{350,175},{470,225}}, 104cc03adb90901d226e8b0252a187b19a68fabcc42dandov {{50,225},{150,225},{220,175},{350,225},{470,155}}, 105cc03adb90901d226e8b0252a187b19a68fabcc42dandov {{50,275},{150,275},{250,275},{350,275},{400,305}}, 106cc03adb90901d226e8b0252a187b19a68fabcc42dandov {{50,325},{150,325},{250,325},{350,325},{450,325}} 107cc03adb90901d226e8b0252a187b19a68fabcc42dandov }; 108cc03adb90901d226e8b0252a187b19a68fabcc42dandov 109cc03adb90901d226e8b0252a187b19a68fabcc42dandov static const int kRows = 3; 110cc03adb90901d226e8b0252a187b19a68fabcc42dandov static const int kCols = 4; 111cc03adb90901d226e8b0252a187b19a68fabcc42dandov 112cc03adb90901d226e8b0252a187b19a68fabcc42dandov canvas->scale(3, 3); 113cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkPatchGrid grid(kRows, kCols, SkPatchGrid::kColors_VertexType, NULL); 114cc03adb90901d226e8b0252a187b19a68fabcc42dandov for (int i = 0; i < kRows; i++) { 115cc03adb90901d226e8b0252a187b19a68fabcc42dandov for (int j = 0; j < kCols; j++) { 116cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkPoint points[12]; 117cc03adb90901d226e8b0252a187b19a68fabcc42dandov 118cc03adb90901d226e8b0252a187b19a68fabcc42dandov //set corners 119cc03adb90901d226e8b0252a187b19a68fabcc42dandov points[SkPatchUtils::kTopP0_CubicCtrlPts] = vertices[i][j]; 120cc03adb90901d226e8b0252a187b19a68fabcc42dandov points[SkPatchUtils::kTopP3_CubicCtrlPts] = vertices[i][j + 1]; 121cc03adb90901d226e8b0252a187b19a68fabcc42dandov points[SkPatchUtils::kBottomP0_CubicCtrlPts] = vertices[i + 1][j]; 122cc03adb90901d226e8b0252a187b19a68fabcc42dandov points[SkPatchUtils::kBottomP3_CubicCtrlPts] = vertices[i + 1][j + 1]; 123cc03adb90901d226e8b0252a187b19a68fabcc42dandov 124cc03adb90901d226e8b0252a187b19a68fabcc42dandov points[SkPatchUtils::kTopP1_CubicCtrlPts] = hrzCtrl[i][j * 2]; 125cc03adb90901d226e8b0252a187b19a68fabcc42dandov points[SkPatchUtils::kTopP2_CubicCtrlPts] = hrzCtrl[i][j * 2 + 1]; 126cc03adb90901d226e8b0252a187b19a68fabcc42dandov points[SkPatchUtils::kBottomP1_CubicCtrlPts] = hrzCtrl[i + 1][j * 2]; 127cc03adb90901d226e8b0252a187b19a68fabcc42dandov points[SkPatchUtils::kBottomP2_CubicCtrlPts] = hrzCtrl[i + 1][j * 2 + 1]; 128cc03adb90901d226e8b0252a187b19a68fabcc42dandov 129cc03adb90901d226e8b0252a187b19a68fabcc42dandov points[SkPatchUtils::kLeftP1_CubicCtrlPts] = vrtCtrl[i * 2][j]; 130cc03adb90901d226e8b0252a187b19a68fabcc42dandov points[SkPatchUtils::kLeftP2_CubicCtrlPts] = vrtCtrl[i * 2 + 1][j]; 131cc03adb90901d226e8b0252a187b19a68fabcc42dandov points[SkPatchUtils::kRightP1_CubicCtrlPts] = vrtCtrl[i * 2][j + 1]; 132cc03adb90901d226e8b0252a187b19a68fabcc42dandov points[SkPatchUtils::kRightP2_CubicCtrlPts] = vrtCtrl[i * 2 + 1][j + 1]; 133cc03adb90901d226e8b0252a187b19a68fabcc42dandov 134cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkColor colors[4]; 135cc03adb90901d226e8b0252a187b19a68fabcc42dandov colors[0] = cornerColors[i][j]; 136cc03adb90901d226e8b0252a187b19a68fabcc42dandov colors[1] = cornerColors[i][j + 1]; 137cc03adb90901d226e8b0252a187b19a68fabcc42dandov colors[3] = cornerColors[i + 1][j]; 138cc03adb90901d226e8b0252a187b19a68fabcc42dandov colors[2] = cornerColors[i + 1][j + 1]; 139cc03adb90901d226e8b0252a187b19a68fabcc42dandov 140cc03adb90901d226e8b0252a187b19a68fabcc42dandov grid.setPatch(j, i, points, colors, NULL); 141cc03adb90901d226e8b0252a187b19a68fabcc42dandov } 142cc03adb90901d226e8b0252a187b19a68fabcc42dandov } 143cc03adb90901d226e8b0252a187b19a68fabcc42dandov 144cc03adb90901d226e8b0252a187b19a68fabcc42dandov grid.draw(canvas, paint); 145cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkISize dims = grid.getDimensions(); 146cc03adb90901d226e8b0252a187b19a68fabcc42dandov for (int y = 0; y < dims.height(); y++) { 147cc03adb90901d226e8b0252a187b19a68fabcc42dandov for (int x = 0; x < dims.width(); x++) { 148cc03adb90901d226e8b0252a187b19a68fabcc42dandov SkPoint cubics[12]; 149cc03adb90901d226e8b0252a187b19a68fabcc42dandov grid.getPatch(x, y, cubics, NULL, NULL); 150cc03adb90901d226e8b0252a187b19a68fabcc42dandov draw_control_points(canvas, cubics); 151cc03adb90901d226e8b0252a187b19a68fabcc42dandov } 152cc03adb90901d226e8b0252a187b19a68fabcc42dandov } 153cc03adb90901d226e8b0252a187b19a68fabcc42dandov } 154cc03adb90901d226e8b0252a187b19a68fabcc42dandov 155cc03adb90901d226e8b0252a187b19a68fabcc42dandovprivate: 156cc03adb90901d226e8b0252a187b19a68fabcc42dandov typedef GM INHERITED; 157cc03adb90901d226e8b0252a187b19a68fabcc42dandov}; 158cc03adb90901d226e8b0252a187b19a68fabcc42dandov 159cc03adb90901d226e8b0252a187b19a68fabcc42dandovDEF_GM(return SkNEW(SkPatchGridGM); ) 160cc03adb90901d226e8b0252a187b19a68fabcc42dandov 161cc03adb90901d226e8b0252a187b19a68fabcc42dandov} 162