SampleShaders.cpp revision da342a891779e0839a645d6634a2f0100bf2c0d6
1#include "SampleCode.h" 2#include "SkView.h" 3#include "SkCanvas.h" 4#include "SkGradientShader.h" 5#include "SkGraphics.h" 6#include "SkImageDecoder.h" 7#include "SkPath.h" 8#include "SkPorterDuff.h" 9#include "SkRegion.h" 10#include "SkShader.h" 11#include "SkUtils.h" 12#include "SkXfermode.h" 13#include "SkComposeShader.h" 14#include "SkColorPriv.h" 15#include "SkColorFilter.h" 16#include "SkTime.h" 17#include "SkTransparentShader.h" 18#include "SkTypeface.h" 19 20static SkShader* make_bitmapfade(const SkBitmap& bm) 21{ 22 SkPoint pts[2]; 23 SkColor colors[2]; 24 25 pts[0].set(0, 0); 26 pts[1].set(0, SkIntToScalar(bm.height())); 27 colors[0] = SK_ColorBLACK; 28 colors[1] = SkColorSetARGB(0, 0, 0, 0); 29 SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode); 30 31 SkShader* shaderB = SkShader::CreateBitmapShader(bm, 32 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode); 33 34 SkXfermode* mode = SkPorterDuff::CreateXfermode(SkPorterDuff::kDstIn_Mode); 35 36 SkShader* shader = new SkComposeShader(shaderB, shaderA, mode); 37 shaderA->unref(); 38 shaderB->unref(); 39 mode->unref(); 40 41 return shader; 42} 43 44class ShaderView : public SkView { 45public: 46 SkShader* fShader; 47 SkBitmap fBitmap; 48 49 ShaderView() 50 { 51 SkImageDecoder::DecodeFile("/cover.png", &fBitmap); 52 53 SkPoint pts[2]; 54 SkColor colors[2]; 55 56 pts[0].set(0, 0); 57 pts[1].set(SkIntToScalar(100), 0); 58 colors[0] = SK_ColorRED; 59 colors[1] = SK_ColorBLUE; 60 SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode); 61 62 pts[0].set(0, 0); 63 pts[1].set(0, SkIntToScalar(100)); 64 colors[0] = SK_ColorBLACK; 65 colors[1] = SkColorSetARGB(0x80, 0, 0, 0); 66 SkShader* shaderB = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode); 67 68 SkXfermode* mode = SkPorterDuff::CreateXfermode(SkPorterDuff::kDstIn_Mode); 69 70 fShader = new SkComposeShader(shaderA, shaderB, mode); 71 shaderA->unref(); 72 shaderB->unref(); 73 mode->unref(); 74 } 75 virtual ~ShaderView() 76 { 77 fShader->safeUnref(); 78 } 79 80protected: 81 // overrides from SkEventSink 82 virtual bool onQuery(SkEvent* evt) 83 { 84 if (SampleCode::TitleQ(*evt)) 85 { 86 SampleCode::TitleR(evt, "Shaders"); 87 return true; 88 } 89 return this->INHERITED::onQuery(evt); 90 } 91 92 void drawBG(SkCanvas* canvas) 93 { 94// canvas->drawColor(0xFFDDDDDD); 95 canvas->drawColor(SK_ColorWHITE); 96 } 97 98 virtual void onDraw(SkCanvas* canvas) 99 { 100 this->drawBG(canvas); 101 102 canvas->drawBitmap(fBitmap, 0, 0); 103 104 { 105 SkIRect src; 106 SkRect dst; 107 108 src.set(20, 50, 120, 70); 109 dst.set(src); 110 dst.offset(SkIntToScalar(300), 0); 111 112 canvas->drawBitmapRect(fBitmap, &src, dst); 113 } 114 115 canvas->translate(SkIntToScalar(80), SkIntToScalar(80)); 116 117 SkPaint paint; 118 SkRect r; 119 120 paint.setColor(SK_ColorGREEN); 121 canvas->drawRectCoords(0, 0, SkIntToScalar(100), SkIntToScalar(100), paint); 122 paint.setShader(fShader); 123 canvas->drawRectCoords(0, 0, SkIntToScalar(100), SkIntToScalar(100), paint); 124 125 canvas->translate(SkIntToScalar(110), 0); 126 127 r.set(0, 0, SkIntToScalar(fBitmap.width()), SkIntToScalar(fBitmap.height())); 128 129 paint.setShader(NULL); 130 canvas->drawRect(r, paint); 131 paint.setShader(make_bitmapfade(fBitmap))->unref(); 132 canvas->drawRect(r, paint); 133 134 paint.setShader(new SkTransparentShader)->unref(); 135 canvas->drawRect(r, paint); 136 } 137 138 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) 139 { 140 this->inval(NULL); 141 return this->INHERITED::onFindClickHandler(x, y); 142 } 143 144 virtual bool onClick(Click* click) 145 { 146 return this->INHERITED::onClick(click); 147 } 148 149private: 150 typedef SkView INHERITED; 151}; 152 153////////////////////////////////////////////////////////////////////////////// 154 155static SkView* MyFactory() { return new ShaderView; } 156static SkViewRegister reg(MyFactory); 157 158