Home | History | Annotate | Download | only in gm
      1 
      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 #include "gm.h"
     10 #include "SkGradientShader.h"
     11 #include "SkPatchUtils.h"
     12 
     13 static SkShader* make_shader() {
     14     const SkColor colors[] = {
     15         SK_ColorRED, SK_ColorCYAN, SK_ColorGREEN, SK_ColorWHITE, SK_ColorMAGENTA, SK_ColorBLUE,
     16         SK_ColorYELLOW,
     17     };
     18     const SkPoint pts[] = { { 100.f / 4.f, 0.f }, { 3.f * 100.f / 4.f, 100.f } };
     19 
     20     return SkGradientShader::CreateLinear(pts, colors, NULL, SK_ARRAY_COUNT(colors),
     21                                           SkShader::kMirror_TileMode);
     22 }
     23 
     24 static void draw_control_points(SkCanvas* canvas, const SkPoint cubics[12]) {
     25     //draw control points
     26     SkPaint paint;
     27     SkPoint bottom[SkPatchUtils::kNumPtsCubic];
     28     SkPatchUtils::getBottomCubic(cubics, bottom);
     29     SkPoint top[SkPatchUtils::kNumPtsCubic];
     30     SkPatchUtils::getTopCubic(cubics, top);
     31     SkPoint left[SkPatchUtils::kNumPtsCubic];
     32     SkPatchUtils::getLeftCubic(cubics, left);
     33     SkPoint right[SkPatchUtils::kNumPtsCubic];
     34     SkPatchUtils::getRightCubic(cubics, right);
     35 
     36     paint.setColor(SK_ColorBLACK);
     37     paint.setStrokeWidth(0.5f);
     38     SkPoint corners[4] = { bottom[0], bottom[3], top[0], top[3] };
     39     canvas->drawPoints(SkCanvas::kLines_PointMode, 4, bottom, paint);
     40     canvas->drawPoints(SkCanvas::kLines_PointMode, 2, bottom + 1, paint);
     41     canvas->drawPoints(SkCanvas::kLines_PointMode, 4, top, paint);
     42     canvas->drawPoints(SkCanvas::kLines_PointMode, 4, left, paint);
     43     canvas->drawPoints(SkCanvas::kLines_PointMode, 4, right, paint);
     44 
     45     canvas->drawPoints(SkCanvas::kLines_PointMode, 2, top + 1, paint);
     46     canvas->drawPoints(SkCanvas::kLines_PointMode, 2, left + 1, paint);
     47     canvas->drawPoints(SkCanvas::kLines_PointMode, 2, right + 1, paint);
     48 
     49     paint.setStrokeWidth(2);
     50 
     51     paint.setColor(SK_ColorRED);
     52     canvas->drawPoints(SkCanvas::kPoints_PointMode, 4, corners, paint);
     53 
     54     paint.setColor(SK_ColorBLUE);
     55     canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, bottom + 1, paint);
     56 
     57     paint.setColor(SK_ColorCYAN);
     58     canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, top + 1, paint);
     59 
     60     paint.setColor(SK_ColorYELLOW);
     61     canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, left + 1, paint);
     62 
     63     paint.setColor(SK_ColorGREEN);
     64     canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, right + 1, paint);
     65 }
     66 
     67 namespace skiagm {
     68 /**
     69  * This GM draws a cubics coons patch using the specialized call SkCanvas::drawPatch.
     70  */
     71 class SkPatchGM : public GM {
     72 
     73 public:
     74     SkPatchGM() {
     75         this->setBGColor(0xFFFFFFFF);
     76     }
     77 
     78 protected:
     79     virtual SkString onShortName() SK_OVERRIDE {
     80         return SkString("patch_primitive");
     81     }
     82 
     83     virtual SkISize onISize() SK_OVERRIDE {
     84         return SkISize::Make(800, 800);
     85     }
     86 
     87     virtual uint32_t onGetFlags() const SK_OVERRIDE {
     88         return kSkipTiled_Flag;
     89     }
     90 
     91     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
     92 
     93         SkPaint paint;
     94 
     95         // The order of the colors and points is clockwise starting at upper-left corner.
     96         const SkPoint cubics[SkPatchUtils::kNumCtrlPts] = {
     97             //top points
     98             {100,100},{150,50},{250,150}, {300,100},
     99             //right points
    100             {250, 150},{350,250},
    101             //bottom points
    102             {300,300},{250,250},{150,350},{100,300},
    103             //left points
    104             {50,250},{150,150}
    105         };
    106 
    107         const SkColor colors[SkPatchUtils::kNumCorners] = {
    108             SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorCYAN
    109         };
    110         const SkPoint texCoords[SkPatchUtils::kNumCorners] = {
    111             {0.0f, 0.0f}, {100.0f, 0.0f}, {100.0f,100.0f}, {0.0f, 100.0f}}
    112         ;
    113 
    114         const SkXfermode::Mode modes[] = {
    115             SkXfermode::kSrc_Mode,
    116             SkXfermode::kDst_Mode,
    117             SkXfermode::kModulate_Mode,
    118         };
    119 
    120         SkAutoTUnref<SkShader> shader(make_shader());
    121 
    122         canvas->save();
    123         for (int y = 0; y < 3; y++) {
    124             SkAutoTUnref<SkXfermode> xfer(SkXfermode::Create(modes[y]));
    125 
    126             for (int x = 0; x < 4; x++) {
    127                 canvas->save();
    128                 canvas->translate(x * 350.0f, y * 350.0f);
    129                 switch (x) {
    130                     case 0:
    131                         canvas->drawPatch(cubics, NULL, NULL, xfer, paint);
    132                         break;
    133                     case 1:
    134                         canvas->drawPatch(cubics, colors, NULL, xfer, paint);
    135                         break;
    136                     case 2:
    137                         paint.setShader(shader);
    138                         canvas->drawPatch(cubics, NULL, texCoords, xfer, paint);
    139                         paint.setShader(NULL);
    140                         break;
    141                     case 3:
    142                         paint.setShader(shader);
    143                         canvas->drawPatch(cubics, colors, texCoords, xfer, paint);
    144                         paint.setShader(NULL);
    145                         break;
    146                     default:
    147                         break;
    148                 }
    149 
    150                 draw_control_points(canvas, cubics);
    151                 canvas->restore();
    152             }
    153         }
    154         canvas->restore();
    155     }
    156 
    157 private:
    158     typedef GM INHERITED;
    159 };
    160 
    161 DEF_GM(return SkNEW(SkPatchGM); )
    162 
    163 }
    164