1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 7c3b3266b7db2f1a41d41ecac010c766b7ad8eebcreed 8048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com#include "gm.h" 9c3b3266b7db2f1a41d41ecac010c766b7ad8eebcreed#include "sk_tool_utils.h" 10048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com 11048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comnamespace skiagm { 12048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com 13048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comstatic void make_bm(SkBitmap* bm) { 142ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com const SkColor colors[4] = { 15048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com SK_ColorRED, SK_ColorGREEN, 16048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com SK_ColorBLUE, SK_ColorWHITE 17048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com }; 182ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com SkPMColor colorsPM[4]; 192ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(colors); ++i) { 202ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com colorsPM[i] = SkPreMultiplyColor(colors[i]); 212ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com } 222ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com SkColorTable* ctable = new SkColorTable(colorsPM, 4); 232ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com 24dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org bm->allocPixels(SkImageInfo::Make(2, 2, kIndex_8_SkColorType, 25dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org kPremul_SkAlphaType), 26dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org NULL, ctable); 27048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com ctable->unref(); 282ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com 29048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com *bm->getAddr8(0, 0) = 0; 30048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com *bm->getAddr8(1, 0) = 1; 31048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com *bm->getAddr8(0, 1) = 2; 32048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com *bm->getAddr8(1, 1) = 3; 33048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com} 34048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com 35048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comstatic SkScalar draw_bm(SkCanvas* canvas, const SkBitmap& bm, 36048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com SkScalar x, SkScalar y, SkPaint* paint) { 37048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com canvas->drawBitmap(bm, x, y, paint); 38048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com return SkIntToScalar(bm.width()) * 5/4; 39048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com} 40048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com 41048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comstatic SkScalar draw_set(SkCanvas* c, const SkBitmap& bm, SkScalar x, 42048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com SkPaint* p) { 43048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com x += draw_bm(c, bm, x, 0, p); 444469938e92d779dff05e745559e67907bbf21e78reed@google.com p->setFilterLevel(SkPaint::kLow_FilterLevel); 45048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com x += draw_bm(c, bm, x, 0, p); 46048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com p->setDither(true); 47048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com return x + draw_bm(c, bm, x, 0, p); 48048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com} 49048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com 50048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comstatic SkScalar draw_row(SkCanvas* canvas, const SkBitmap& bm) { 51048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com SkAutoCanvasRestore acr(canvas, true); 52048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com 53048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com SkPaint paint; 54048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com SkScalar x = 0; 55048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com const int scale = 32; 56048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com 57048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com paint.setAntiAlias(true); 585fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark sk_tool_utils::set_portable_typeface(&paint); 59c3b3266b7db2f1a41d41ecac010c766b7ad8eebcreed const char* name = sk_tool_utils::colortype_name(bm.colorType()); 60048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com canvas->drawText(name, strlen(name), x, SkIntToScalar(bm.height())*scale*5/8, 61048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com paint); 62048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com canvas->translate(SkIntToScalar(48), 0); 63048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com 64048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com canvas->scale(SkIntToScalar(scale), SkIntToScalar(scale)); 652ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com 66048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com x += draw_set(canvas, bm, 0, &paint); 67048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com paint.reset(); 68048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com paint.setAlpha(0x80); 69048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com draw_set(canvas, bm, x, &paint); 70048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com return x * scale / 3; 71048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com} 72048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com 73048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comclass FilterGM : public GM { 7426b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com bool fOnce; 7526b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com void init() { 7626b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com if (fOnce) { 7726b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com return; 7826b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com } 7926b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com fOnce = true; 80048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com make_bm(&fBM8); 818a2ad3cae710f05cca57e48dd1732d575dba2dc7commit-bot@chromium.org fBM8.copyTo(&fBM4444, kARGB_4444_SkColorType); 828a2ad3cae710f05cca57e48dd1732d575dba2dc7commit-bot@chromium.org fBM8.copyTo(&fBM16, kRGB_565_SkColorType); 8328fcae2ec77eb16a79e155f8d788b20457f1c951commit-bot@chromium.org fBM8.copyTo(&fBM32, kN32_SkColorType); 8426b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com } 8526b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.compublic: 8626b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com SkBitmap fBM8, fBM4444, fBM16, fBM32; 8726b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com 88d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com FilterGM() : fOnce(false) { 8948dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com this->setBGColor(0xFFDDDDDD); 90048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com } 91048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com 92048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comprotected: 93048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com virtual SkString onShortName() { 94048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com return SkString("bitmapfilters"); 95048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com } 96048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com 97d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com virtual SkISize onISize() { 98f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina return SkISize::Make(540, 330); 99048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com } 100048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com 101048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com virtual void onDraw(SkCanvas* canvas) { 10226b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com this->init(); 103048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com 104048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com SkScalar x = SkIntToScalar(10); 105048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com SkScalar y = SkIntToScalar(10); 1062ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com 107048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com canvas->translate(x, y); 108048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com y = draw_row(canvas, fBM8); 109048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com canvas->translate(0, y); 110048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com y = draw_row(canvas, fBM4444); 111048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com canvas->translate(0, y); 112048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com y = draw_row(canvas, fBM16); 113048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com canvas->translate(0, y); 114048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com draw_row(canvas, fBM32); 115048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com } 1162ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com 117048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comprivate: 118048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com typedef GM INHERITED; 119048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com}; 120048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com 121048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com////////////////////////////////////////////////////////////////////////////// 122048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com 123048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comstatic GM* MyFactory(void*) { return new FilterGM; } 124048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comstatic GMRegistry reg(MyFactory); 125048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com 126048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com} 127