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