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