bitmapshader.cpp revision e5957f67d00c04c0fbf88809df510426e74fe40a
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 14namespace skiagm { 15 16static 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 27static 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 38static void adopt_shader(SkPaint* paint, SkShader* shader) { 39 paint->setShader(shader); 40 SkSafeUnref(shader); 41} 42 43class BitmapShaderGM : public GM { 44public: 45 46 BitmapShaderGM() { 47 this->setBGColor(SK_ColorGRAY); 48 draw_bm(&fBitmap); 49 draw_mask(&fMask); 50 } 51 52protected: 53 virtual SkString onShortName() { 54 return SkString("bitmapshaders"); 55 } 56 57 virtual SkISize onISize() { 58 return SkISize::Make(75, 100); 59 } 60 61 virtual void onDraw(SkCanvas* canvas) { 62 SkPaint paint; 63 64 adopt_shader(&paint, SkShader::CreateBitmapShader(fBitmap, SkShader::kClamp_TileMode, 65 SkShader::kClamp_TileMode)); 66 67 // draw the shader with a bitmap mask 68 canvas->drawBitmap(fMask, 0, 0, &paint); 69 canvas->drawBitmap(fMask, 30, 0, &paint); 70 71 canvas->translate(0, 25); 72 73 canvas->drawCircle(10, 10, 10, paint); 74 canvas->drawCircle(40, 10, 10, paint); // no blue circle expected 75 76 canvas->translate(0, 25); 77 78 adopt_shader(&paint, SkShader::CreateBitmapShader(fMask, SkShader::kRepeat_TileMode, 79 SkShader::kRepeat_TileMode)); 80 paint.setColor(SK_ColorRED); 81 82 // draw the mask using the shader and a color 83 canvas->drawRect(SkRect::MakeXYWH(0, 0, 20, 20), paint); 84 canvas->drawRect(SkRect::MakeXYWH(30, 0, 20, 20), paint); 85 } 86 87private: 88 SkBitmap fBitmap; 89 SkBitmap fMask; 90 91 typedef GM INHERITED; 92}; 93 94////////////////////////////////////////////////////////////////////////////// 95 96static GM* MyFactory(void*) { return new BitmapShaderGM; } 97static GMRegistry reg(MyFactory); 98 99} 100