SampleShaders.cpp revision 44a6312cf6a6e8c7c58065f7f8b8d06decc5fd47
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SampleCode.h" 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkView.h" 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkCanvas.h" 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkGradientShader.h" 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkGraphics.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkImageDecoder.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkPath.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkPorterDuff.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkRegion.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkShader.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkUtils.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkXfermode.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkComposeShader.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkColorPriv.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkColorFilter.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkTime.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkTransparentShader.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkTypeface.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static SkShader* make_bitmapfade(const SkBitmap& bm) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkPoint pts[2]; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor colors[2]; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pts[0].set(0, 0); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pts[1].set(0, SkIntToScalar(bm.height())); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colors[0] = SK_ColorBLACK; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colors[1] = SkColorSetARGB(0, 0, 0, 0); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkShader* shaderB = SkShader::CreateBitmapShader(bm, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkShader::kClamp_TileMode, SkShader::kClamp_TileMode); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkXfermode* mode = SkPorterDuff::CreateXfermode(SkPorterDuff::kDstIn_Mode); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkShader* shader = new SkComposeShader(shaderB, shaderA, mode); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shaderA->unref(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shaderB->unref(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mode->unref(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return shader; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShaderView : public SkView { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkShader* fShader; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap fBitmap; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ShaderView() 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkImageDecoder::DecodeFile("/skimages/logo.gif", &fBitmap); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkPoint pts[2]; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor colors[2]; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pts[0].set(0, 0); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pts[1].set(SkIntToScalar(100), 0); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colors[0] = SK_ColorRED; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colors[1] = SK_ColorBLUE; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pts[0].set(0, 0); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pts[1].set(0, SkIntToScalar(100)); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colors[0] = SK_ColorBLACK; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colors[1] = SkColorSetARGB(0x80, 0, 0, 0); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkShader* shaderB = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkXfermode* mode = SkPorterDuff::CreateXfermode(SkPorterDuff::kDstIn_Mode); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fShader = new SkComposeShader(shaderA, shaderB, mode); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shaderA->unref(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shaderB->unref(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mode->unref(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ShaderView() 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fShader->safeUnref(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected: 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // overrides from SkEventSink 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual bool onQuery(SkEvent* evt) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (SampleCode::TitleQ(*evt)) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SampleCode::TitleR(evt, "Shaders"); 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this->INHERITED::onQuery(evt); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void drawBG(SkCanvas* canvas) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// canvas->drawColor(0xFFDDDDDD); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->drawColor(SK_ColorWHITE); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void onDraw(SkCanvas* canvas) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this->drawBG(canvas); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->drawBitmap(fBitmap, 0, 0); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->translate(SkIntToScalar(20), SkIntToScalar(120)); 103 104 SkPaint paint; 105 SkRect r; 106 107 paint.setColor(SK_ColorGREEN); 108 canvas->drawRectCoords(0, 0, SkIntToScalar(100), SkIntToScalar(100), paint); 109 paint.setShader(fShader); 110 canvas->drawRectCoords(0, 0, SkIntToScalar(100), SkIntToScalar(100), paint); 111 112 canvas->translate(SkIntToScalar(110), 0); 113 114 int w = fBitmap.width(); 115 int h = fBitmap.height(); 116 w = 120; 117 h = 80; 118 r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h)); 119 120 paint.setShader(NULL); 121 canvas->drawRect(r, paint); 122 paint.setShader(make_bitmapfade(fBitmap))->unref(); 123 canvas->drawRect(r, paint); 124 125 paint.setShader(new SkTransparentShader)->unref(); 126 canvas->drawRect(r, paint); 127 } 128 129 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) 130 { 131 this->inval(NULL); 132 return this->INHERITED::onFindClickHandler(x, y); 133 } 134 135 virtual bool onClick(Click* click) 136 { 137 return this->INHERITED::onClick(click); 138 } 139 140private: 141 typedef SkView INHERITED; 142}; 143 144////////////////////////////////////////////////////////////////////////////// 145 146static SkView* MyFactory() { return new ShaderView; } 147static SkViewRegister reg(MyFactory); 148 149