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