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