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 } 120