Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / gm / pictureshadertile.cpp
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); )