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 uint32_t onGetFlags() const SK_OVERRIDE { 54 return kSkipTiled_Flag; 55 } 56 57 virtual SkString onShortName() { 58 return SkString("bitmapshaders"); 59 } 60 61 virtual SkISize onISize() { 62 return SkISize::Make(150, 100); 63 } 64 65 virtual void onDraw(SkCanvas* canvas) { 66 SkPaint paint; 67 68 for (int i = 0; i < 2; i++) { 69 SkMatrix s; 70 s.reset(); 71 if (1 == i) { 72 s.setScale(1.5f, 1.5f); 73 s.postTranslate(2, 2); 74 } 75 76 canvas->save(); 77 adopt_shader(&paint, SkShader::CreateBitmapShader(fBitmap, SkShader::kClamp_TileMode, 78 SkShader::kClamp_TileMode, &s)); 79 80 // draw the shader with a bitmap mask 81 canvas->drawBitmap(fMask, 0, 0, &paint); 82 canvas->drawBitmap(fMask, 30, 0, &paint); 83 84 canvas->translate(0, 25); 85 86 canvas->drawCircle(10, 10, 10, paint); 87 canvas->drawCircle(40, 10, 10, paint); // no blue circle expected 88 89 canvas->translate(0, 25); 90 91 // clear the shader, colorized by a solid color with a bitmap mask 92 paint.setShader(NULL); 93 paint.setColor(SK_ColorGREEN); 94 canvas->drawBitmap(fMask, 0, 0, &paint); 95 canvas->drawBitmap(fMask, 30, 0, &paint); 96 97 canvas->translate(0, 25); 98 99 adopt_shader(&paint, SkShader::CreateBitmapShader(fMask, SkShader::kRepeat_TileMode, 100 SkShader::kRepeat_TileMode, &s)); 101 paint.setColor(SK_ColorRED); 102 103 // draw the mask using the shader and a color 104 canvas->drawRect(SkRect::MakeXYWH(0, 0, 20, 20), paint); 105 canvas->drawRect(SkRect::MakeXYWH(30, 0, 20, 20), paint); 106 canvas->restore(); 107 canvas->translate(60, 0); 108 } 109 } 110 111 private: 112 SkBitmap fBitmap; 113 SkBitmap fMask; 114 115 typedef GM INHERITED; 116 }; 117 118 ////////////////////////////////////////////////////////////////////////////// 119 120 static GM* MyFactory(void*) { return new BitmapShaderGM; } 121 static GMRegistry reg(MyFactory); 122 123 } 124