SampleFilter.cpp revision 03202c9c3dfbf8c4feb0a1ee9b3680817e633f58
1#include "SampleCode.h"
2#include "SkView.h"
3#include "SkCanvas.h"
4#include "SkGradientShader.h"
5#include "SkPath.h"
6#include "SkRegion.h"
7#include "SkShader.h"
8#include "SkUtils.h"
9#include "Sk1DPathEffect.h"
10#include "SkCornerPathEffect.h"
11#include "SkPathMeasure.h"
12#include "SkRandom.h"
13#include "SkColorPriv.h"
14#include "SkColorFilter.h"
15#include "SkDither.h"
16
17static void make_bm(SkBitmap* bm)
18{
19    const SkColor colors[] = {
20        SK_ColorRED, SK_ColorGREEN,
21        SK_ColorBLUE, SK_ColorWHITE
22    };
23    SkColorTable* ctable = new SkColorTable(colors, 4);
24    bm->setConfig(SkBitmap::kIndex8_Config, 2, 2);
25    bm->allocPixels(ctable);
26    ctable->unref();
27
28    *bm->getAddr8(0, 0) = 0;
29    *bm->getAddr8(1, 0) = 1;
30    *bm->getAddr8(0, 1) = 2;
31    *bm->getAddr8(1, 1) = 3;
32}
33
34static SkScalar draw_bm(SkCanvas* canvas, const SkBitmap& bm,
35                        SkScalar x, SkScalar y, SkPaint* paint)
36{
37#if 1
38    canvas->drawBitmap(bm, x, y, paint);
39    return SkIntToScalar(bm.width()) * 5/4;
40#else
41    SkRect r;
42
43    r.set(x, y,
44          x + SkIntToScalar(bm.width() * 2),
45          y + SkIntToScalar(bm.height() * 2));
46    SkShader* s = SkShader::CreateBitmapShader(bm, SkShader::kRepeat_TileMode,
47                                               SkShader::kRepeat_TileMode);
48    paint->setShader(s)->unref();
49    canvas->drawRect(r, *paint);
50    paint->setShader(NULL);
51    return r.width() * 5/4;
52#endif
53}
54
55static SkScalar draw_set(SkCanvas* c, const SkBitmap& bm, SkScalar x, SkPaint* p)
56{
57    x += draw_bm(c, bm, x, 0, p);
58    p->setFilterBitmap(true);
59    x += draw_bm(c, bm, x, 0, p);
60    p->setDither(true);
61    return x + draw_bm(c, bm, x, 0, p);
62}
63
64static const char* gConfigNames[] = {
65    "unknown config",
66    "A1",
67    "A8",
68    "Index8",
69    "565",
70    "4444",
71    "8888"
72};
73
74static SkScalar draw_row(SkCanvas* canvas, const SkBitmap& bm)
75{
76    SkAutoCanvasRestore acr(canvas, true);
77
78    SkPaint paint;
79    SkScalar x = 0;
80    const int scale = 32;
81
82    paint.setAntiAlias(true);
83    const char* name = gConfigNames[bm.config()];
84    canvas->drawText(name, strlen(name), x, SkIntToScalar(bm.height())*scale*5/8,
85                     paint);
86    canvas->translate(SkIntToScalar(48), 0);
87
88    canvas->scale(SkIntToScalar(scale), SkIntToScalar(scale));
89
90    x += draw_set(canvas, bm, 0, &paint);
91    paint.reset();
92    paint.setAlpha(0x80);
93    draw_set(canvas, bm, x, &paint);
94    return x * scale / 3;
95}
96
97class FilterView : public SkView {
98public:
99    SkBitmap    fBM8, fBM4444, fBM16, fBM32;
100
101	FilterView()
102    {
103        make_bm(&fBM8);
104        fBM8.copyTo(&fBM4444, SkBitmap::kARGB_4444_Config);
105        fBM8.copyTo(&fBM16, SkBitmap::kRGB_565_Config);
106        fBM8.copyTo(&fBM32, SkBitmap::kARGB_8888_Config);
107    }
108
109protected:
110    // overrides from SkEventSink
111    virtual bool onQuery(SkEvent* evt)
112    {
113        if (SampleCode::TitleQ(*evt))
114        {
115            SampleCode::TitleR(evt, "Filter");
116            return true;
117        }
118        return this->INHERITED::onQuery(evt);
119    }
120
121    void drawBG(SkCanvas* canvas)
122    {
123        canvas->drawColor(0xFFDDDDDD);
124    }
125
126    virtual void onDraw(SkCanvas* canvas)
127    {
128        this->drawBG(canvas);
129
130        SkScalar x = SkIntToScalar(10);
131        SkScalar y = SkIntToScalar(10);
132
133        canvas->translate(x, y);
134        y = draw_row(canvas, fBM8);
135        canvas->translate(0, y);
136        y = draw_row(canvas, fBM4444);
137        canvas->translate(0, y);
138        y = draw_row(canvas, fBM16);
139        canvas->translate(0, y);
140        draw_row(canvas, fBM32);
141    }
142
143    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y)
144    {
145     //   fSweep += SK_Scalar1;
146        this->inval(NULL);
147        return this->INHERITED::onFindClickHandler(x, y);
148    }
149
150    virtual bool onClick(Click* click)
151    {
152        return this->INHERITED::onClick(click);
153    }
154
155private:
156    typedef SkView INHERITED;
157};
158
159//////////////////////////////////////////////////////////////////////////////
160
161static SkView* MyFactory() { return new FilterView; }
162static SkViewRegister reg(MyFactory);
163
164