Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / gm / bitmapshader.cpp
1
2 /*
3  * Copyright 2013 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 #include "gm.h"
9
10 #include "SkBitmap.h"
11 #include "SkPaint.h"
12 #include "SkShader.h"
13
14 namespace skiagm {
15
16 static void draw_bm(SkBitmap* bm) {
17     SkPaint bluePaint;
18     bluePaint.setColor(SK_ColorBLUE);
19
20     bm->allocN32Pixels(20, 20);
21     bm->eraseColor(SK_ColorRED);
22
23     SkCanvas canvas(*bm);
24     canvas.drawCircle(10, 10, 5, bluePaint);
25 }
26
27 static void draw_mask(SkBitmap* bm) {
28     SkPaint circlePaint;
29     circlePaint.setColor(SK_ColorBLACK);
30
31     bm->allocPixels(SkImageInfo::MakeA8(20, 20));
32     bm->eraseColor(SK_ColorTRANSPARENT);
33
34     SkCanvas canvas(*bm);
35     canvas.drawCircle(10, 10, 10, circlePaint);
36 }
37
38 static void adopt_shader(SkPaint* paint, SkShader* shader) {
39     paint->setShader(shader);
40     SkSafeUnref(shader);
41 }
42
43 class BitmapShaderGM : public GM {
44 public:
45
46     BitmapShaderGM() {
47         this->setBGColor(SK_ColorGRAY);
48         draw_bm(&fBitmap);
49         draw_mask(&fMask);
50     }
51
52 protected:
53     virtual SkString onShortName() {
54         return SkString("bitmapshaders");
55     }
56
57     virtual SkISize onISize() {
58         return SkISize::Make(150, 100);
59     }
60
61     virtual void onDraw(SkCanvas* canvas) {
62         SkPaint paint;
63
64         for (int i = 0; i < 2; i++) {
65             SkMatrix s;
66             s.reset();
67             if (1 == i) {
68                 s.setScale(1.5f, 1.5f);
69                 s.postTranslate(2, 2);
70             }
71
72             canvas->save();
73             adopt_shader(&paint, SkShader::CreateBitmapShader(fBitmap, SkShader::kClamp_TileMode,
74                                                               SkShader::kClamp_TileMode, &s));
75
76             // draw the shader with a bitmap mask
77             canvas->drawBitmap(fMask, 0, 0, &paint);
78             canvas->drawBitmap(fMask, 30, 0, &paint);
79
80             canvas->translate(0, 25);
81
82             canvas->drawCircle(10, 10, 10, paint);
83             canvas->drawCircle(40, 10, 10, paint); // no blue circle expected
84
85             canvas->translate(0, 25);
86
87             // clear the shader, colorized by a solid color with a bitmap mask
88             paint.setShader(NULL);
89             paint.setColor(SK_ColorGREEN);
90             canvas->drawBitmap(fMask, 0, 0, &paint);
91             canvas->drawBitmap(fMask, 30, 0, &paint);
92
93             canvas->translate(0, 25);
94
95             adopt_shader(&paint, SkShader::CreateBitmapShader(fMask, SkShader::kRepeat_TileMode,
96                                                               SkShader::kRepeat_TileMode, &s));
97             paint.setColor(SK_ColorRED);
98
99             // draw the mask using the shader and a color
100             canvas->drawRect(SkRect::MakeXYWH(0, 0, 20, 20), paint);
101             canvas->drawRect(SkRect::MakeXYWH(30, 0, 20, 20), paint);
102             canvas->restore();
103             canvas->translate(60, 0);
104         }
105     }
106
107 private:
108     SkBitmap fBitmap;
109     SkBitmap fMask;
110
111     typedef GM INHERITED;
112 };
113
114 //////////////////////////////////////////////////////////////////////////////
115
116 static GM* MyFactory(void*) { return new BitmapShaderGM; }
117 static GMRegistry reg(MyFactory);
118
119 }