1 #include "gm.h" 2 3 namespace skiagm { 4 5 static void make_bm(SkBitmap* bm) { 6 const SkColor colors[4] = { 7 SK_ColorRED, SK_ColorGREEN, 8 SK_ColorBLUE, SK_ColorWHITE 9 }; 10 SkPMColor colorsPM[4]; 11 for (size_t i = 0; i < SK_ARRAY_COUNT(colors); ++i) { 12 colorsPM[i] = SkPreMultiplyColor(colors[i]); 13 } 14 SkColorTable* ctable = new SkColorTable(colorsPM, 4); 15 16 bm->setConfig(SkBitmap::kIndex8_Config, 2, 2); 17 bm->allocPixels(ctable); 18 ctable->unref(); 19 20 *bm->getAddr8(0, 0) = 0; 21 *bm->getAddr8(1, 0) = 1; 22 *bm->getAddr8(0, 1) = 2; 23 *bm->getAddr8(1, 1) = 3; 24 } 25 26 static SkScalar draw_bm(SkCanvas* canvas, const SkBitmap& bm, 27 SkScalar x, SkScalar y, SkPaint* paint) { 28 canvas->drawBitmap(bm, x, y, paint); 29 return SkIntToScalar(bm.width()) * 5/4; 30 } 31 32 static SkScalar draw_set(SkCanvas* c, const SkBitmap& bm, SkScalar x, 33 SkPaint* p) { 34 x += draw_bm(c, bm, x, 0, p); 35 p->setFilterBitmap(true); 36 x += draw_bm(c, bm, x, 0, p); 37 p->setDither(true); 38 return x + draw_bm(c, bm, x, 0, p); 39 } 40 41 static const char* gConfigNames[] = { 42 "unknown config", 43 "A1", 44 "A8", 45 "Index8", 46 "565", 47 "4444", 48 "8888" 49 }; 50 51 static SkScalar draw_row(SkCanvas* canvas, const SkBitmap& bm) { 52 SkAutoCanvasRestore acr(canvas, true); 53 54 SkPaint paint; 55 SkScalar x = 0; 56 const int scale = 32; 57 58 paint.setAntiAlias(true); 59 const char* name = gConfigNames[bm.config()]; 60 canvas->drawText(name, strlen(name), x, SkIntToScalar(bm.height())*scale*5/8, 61 paint); 62 canvas->translate(SkIntToScalar(48), 0); 63 64 canvas->scale(SkIntToScalar(scale), SkIntToScalar(scale)); 65 66 x += draw_set(canvas, bm, 0, &paint); 67 paint.reset(); 68 paint.setAlpha(0x80); 69 draw_set(canvas, bm, x, &paint); 70 return x * scale / 3; 71 } 72 73 class FilterGM : public GM { 74 public: 75 SkBitmap fBM8, fBM4444, fBM16, fBM32; 76 77 FilterGM() { 78 make_bm(&fBM8); 79 fBM8.copyTo(&fBM4444, SkBitmap::kARGB_4444_Config); 80 fBM8.copyTo(&fBM16, SkBitmap::kRGB_565_Config); 81 fBM8.copyTo(&fBM32, SkBitmap::kARGB_8888_Config); 82 } 83 84 protected: 85 virtual SkString onShortName() { 86 return SkString("bitmapfilters"); 87 } 88 89 virtual SkISize onISize() { 90 return make_isize(540, 330); 91 } 92 93 virtual void onDraw(SkCanvas* canvas) { 94 canvas->drawColor(0xFFDDDDDD); 95 96 SkScalar x = SkIntToScalar(10); 97 SkScalar y = SkIntToScalar(10); 98 99 canvas->translate(x, y); 100 y = draw_row(canvas, fBM8); 101 canvas->translate(0, y); 102 y = draw_row(canvas, fBM4444); 103 canvas->translate(0, y); 104 y = draw_row(canvas, fBM16); 105 canvas->translate(0, y); 106 draw_row(canvas, fBM32); 107 } 108 109 private: 110 typedef GM INHERITED; 111 }; 112 113 ////////////////////////////////////////////////////////////////////////////// 114 115 static GM* MyFactory(void*) { return new FilterGM; } 116 static GMRegistry reg(MyFactory); 117 118 } 119 120 121 122