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