Home | History | Annotate | Download | only in gm
      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 
     10 #include "SkPaint.h"
     11 #include "SkPicture.h"
     12 #include "SkPictureRecorder.h"
     13 #include "SkShader.h"
     14 
     15 static const SkScalar kPictureSize = SK_Scalar1;
     16 static const SkScalar kFillSize = 100;
     17 static const unsigned kRowSize = 6;
     18 
     19 static const struct {
     20     SkScalar x, y, w, h;
     21     SkScalar offsetX, offsetY;
     22 } tiles[] = {
     23     {      0,      0,    1,    1,      0,    0 },
     24     {   0.5f,   0.5f,    1,    1,      0,    0 },
     25     {  -0.5f,  -0.5f,    1,    1,      0,    0 },
     26 
     27     {      0,      0, 1.5f, 1.5f,      0,    0 },
     28     {   0.5f,   0.5f, 1.5f, 1.5f,      0,    0 },
     29     {  -0.5f,  -0.5f, 1.5f, 1.5f,      0,    0 },
     30 
     31     {      0,      0, 0.5f, 0.5f,      0,    0 },
     32     { -0.25f, -0.25f, 0.5f, 0.5f,      0,    0 },
     33     {  0.25f,  0.25f, 0.5f, 0.5f,      0,    0 },
     34 
     35     {      0,      0,    1,    1,   0.5f, 0.5f },
     36     {   0.5f,   0.5f,    1,    1,   0.5f, 0.5f },
     37     {  -0.5f,  -0.5f,    1,    1,   0.5f, 0.5f },
     38 
     39     {      0,      0, 1.5f, 1.5f,   0.5f, 0.5f },
     40     {   0.5f,   0.5f, 1.5f, 1.5f,   0.5f, 0.5f },
     41     {  -0.5f,  -0.5f, 1.5f, 1.5f,   0.5f, 0.5f },
     42 
     43     {      0,      0, 1.5f,    1,      0,    0 },
     44     {   0.5f,   0.5f, 1.5f,    1,      0,    0 },
     45     {  -0.5f,  -0.5f, 1.5f,    1,      0,    0 },
     46 
     47     {      0,      0, 0.5f,    1,      0,    0 },
     48     { -0.25f, -0.25f, 0.5f,    1,      0,    0 },
     49     {  0.25f,  0.25f, 0.5f,    1,      0,    0 },
     50 
     51     {      0,      0,    1, 1.5f,      0,    0 },
     52     {   0.5f,   0.5f,    1, 1.5f,      0,    0 },
     53     {  -0.5f,  -0.5f,    1, 1.5f,      0,    0 },
     54 
     55     {      0,      0,    1, 0.5f,      0,    0 },
     56     { -0.25f, -0.25f,    1, 0.5f,      0,    0 },
     57     {  0.25f,  0.25f,    1, 0.5f,      0,    0 },
     58 };
     59 
     60 class PictureShaderTileGM : public skiagm::GM {
     61 public:
     62     PictureShaderTileGM() {
     63         SkPictureRecorder recorder;
     64         SkCanvas* pictureCanvas = recorder.beginRecording(kPictureSize, kPictureSize, NULL, 0);
     65         drawScene(pictureCanvas, kPictureSize);
     66         SkAutoTUnref<SkPicture> picture(recorder.endRecording());
     67 
     68         for (unsigned i = 0; i < SK_ARRAY_COUNT(tiles); ++i) {
     69             SkRect tile = SkRect::MakeXYWH(tiles[i].x * kPictureSize,
     70                                            tiles[i].y * kPictureSize,
     71                                            tiles[i].w * kPictureSize,
     72                                            tiles[i].h * kPictureSize);
     73             SkMatrix localMatrix;
     74             localMatrix.setTranslate(tiles[i].offsetX * kPictureSize,
     75                                      tiles[i].offsetY * kPictureSize);
     76             localMatrix.postScale(kFillSize / (2 * kPictureSize),
     77                                   kFillSize / (2 * kPictureSize));
     78             fShaders[i].reset(SkShader::CreatePictureShader(picture,
     79                               SkShader::kRepeat_TileMode,
     80                               SkShader::kRepeat_TileMode,
     81                               &localMatrix,
     82                               &tile));
     83         }
     84     }
     85 
     86 protected:
     87     virtual uint32_t onGetFlags() const SK_OVERRIDE {
     88         return kSkipTiled_Flag;
     89     }
     90 
     91     virtual SkString onShortName() SK_OVERRIDE {
     92         return SkString("pictureshadertile");
     93     }
     94 
     95     virtual SkISize onISize() SK_OVERRIDE {
     96         return SkISize::Make(800, 600);
     97     }
     98 
     99     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
    100         canvas->clear(SK_ColorBLACK);
    101 
    102         SkPaint paint;
    103         paint.setStyle(SkPaint::kFill_Style);
    104 
    105         for (unsigned i = 0; i < SK_ARRAY_COUNT(fShaders); ++i) {
    106             paint.setShader(fShaders[i]);
    107 
    108             canvas->save();
    109             canvas->translate((i % kRowSize) * kFillSize * 1.1f,
    110                               (i / kRowSize) * kFillSize * 1.1f);
    111             canvas->drawRect(SkRect::MakeWH(kFillSize, kFillSize), paint);
    112             canvas->restore();
    113         }
    114     }
    115 
    116 private:
    117     void drawScene(SkCanvas* canvas, SkScalar pictureSize) {
    118         canvas->clear(SK_ColorWHITE);
    119 
    120         SkPaint paint;
    121         paint.setColor(SK_ColorGREEN);
    122         paint.setStyle(SkPaint::kFill_Style);
    123         paint.setAntiAlias(true);
    124 
    125         canvas->drawCircle(pictureSize / 4, pictureSize / 4, pictureSize / 4, paint);
    126         canvas->drawRect(SkRect::MakeXYWH(pictureSize / 2, pictureSize / 2,
    127                                           pictureSize / 2, pictureSize / 2), paint);
    128 
    129         paint.setColor(SK_ColorRED);
    130         canvas->drawLine(pictureSize / 2, pictureSize * 1 / 3,
    131                          pictureSize / 2, pictureSize * 2 / 3, paint);
    132         canvas->drawLine(pictureSize * 1 / 3, pictureSize / 2,
    133                          pictureSize * 2 / 3, pictureSize / 2, paint);
    134 
    135         paint.setColor(SK_ColorBLACK);
    136         paint.setStyle(SkPaint::kStroke_Style);
    137         canvas->drawRect(SkRect::MakeWH(pictureSize, pictureSize), paint);
    138     }
    139 
    140     SkAutoTUnref<SkShader> fShaders[SK_ARRAY_COUNT(tiles)];
    141 
    142     typedef GM INHERITED;
    143 };
    144 
    145 DEF_GM( return SkNEW(PictureShaderTileGM); )
    146