11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "gm.h" 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkCanvas.h" 101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkGradientShader.h" 111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkTableColorFilter.h" 121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic void make_bm0(SkBitmap* bm) { 141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int W = 120; 151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int H = 120; 161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bm->setConfig(SkBitmap::kARGB_8888_Config, W, H); 171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bm->allocPixels(); 181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bm->eraseColor(0); 191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkCanvas canvas(*bm); 211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint paint; 221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPoint pts[] = { {0, 0}, {SkIntToScalar(W), SkIntToScalar(H)} }; 231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkColor colors[] = { 241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SK_ColorBLACK, SK_ColorGREEN, SK_ColorCYAN, 251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SK_ColorRED, 0, SK_ColorBLUE, SK_ColorWHITE 261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger }; 271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL, SK_ARRAY_COUNT(colors), 281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkShader::kClamp_TileMode); 291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setShader(s)->unref(); 301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas.drawPaint(paint); 311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic void make_bm1(SkBitmap* bm) { 331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int W = 120; 341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int H = 120; 351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bm->setConfig(SkBitmap::kARGB_8888_Config, W, H); 361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bm->allocPixels(); 371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bm->eraseColor(0); 381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkCanvas canvas(*bm); 401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint paint; 411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar cx = SkIntToScalar(W)/2; 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar cy = SkIntToScalar(H)/2; 431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkColor colors[] = { 441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, 451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger }; 461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkShader* s = SkGradientShader::CreateRadial(SkPoint::Make(SkIntToScalar(W)/2, 471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkIntToScalar(H)/2), 481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkIntToScalar(W)/2, colors, NULL, SK_ARRAY_COUNT(colors), 491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkShader::kClamp_TileMode); 501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setShader(s)->unref(); 511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setAntiAlias(true); 521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas.drawCircle(cx, cy, cx, paint); 531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic void make_table0(uint8_t table[]) { 561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger for (int i = 0; i < 256; ++i) { 571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int n = i >> 5; 581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger table[i] = (n << 5) | (n << 2) | (n >> 1); 591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic void make_table1(uint8_t table[]) { 621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger for (int i = 0; i < 256; ++i) { 631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger table[i] = i * i / 255; 641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic void make_table2(uint8_t table[]) { 671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger for (int i = 0; i < 256; ++i) { 681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger float fi = i / 255.0f; 691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger table[i] = sqrtf(fi) * 255; 701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkColorFilter* make_cf0() { 741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger uint8_t table[256]; make_table0(table); 751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return SkTableColorFilter::Create(table); 761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkColorFilter* make_cf1() { 781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger uint8_t table[256]; make_table1(table); 791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return SkTableColorFilter::Create(table); 801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkColorFilter* make_cf2() { 821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger uint8_t table[256]; make_table2(table); 831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return SkTableColorFilter::Create(table); 841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkColorFilter* make_cf3() { 861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger uint8_t table0[256]; make_table0(table0); 871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger uint8_t table1[256]; make_table1(table1); 881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger uint8_t table2[256]; make_table2(table2); 891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return SkTableColorFilter::CreateARGB(NULL, table0, table1, table2); 901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass TableColorFilterGM : public skiagm::GM { 931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic: 941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger TableColorFilterGM() {} 951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected: 971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual SkString onShortName() { 981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return SkString("tablecolorfilter"); 991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual SkISize onISize() { 1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return SkISize::Make(640, 480); 1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void onDraw(SkCanvas* canvas) { 1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawColor(0xFFDDDDDD); 1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(20, 20); 1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar x = 0, y = 0; 1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger static void (*gMakers[])(SkBitmap*) = { make_bm0, make_bm1 }; 1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger for (size_t maker = 0; maker < SK_ARRAY_COUNT(gMakers); ++maker) { 1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkBitmap bm; 1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger gMakers[maker](&bm); 1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint paint; 1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger x = 0; 1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawBitmap(bm, x, y, &paint); 1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setColorFilter(make_cf0())->unref(); x += bm.width() * 9 / 8; 1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawBitmap(bm, x, y, &paint); 1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setColorFilter(make_cf1())->unref(); x += bm.width() * 9 / 8; 1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawBitmap(bm, x, y, &paint); 1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setColorFilter(make_cf2())->unref(); x += bm.width() * 9 / 8; 1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawBitmap(bm, x, y, &paint); 1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setColorFilter(make_cf3())->unref(); x += bm.width() * 9 / 8; 1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawBitmap(bm, x, y, &paint); 1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger y += bm.height() * 9 / 8; 1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate: 1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger typedef GM INHERITED; 1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}; 1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger////////////////////////////////////////////////////////////////////////////// 1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic skiagm::GM* MyFactory(void*) { return new TableColorFilterGM; } 1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic skiagm::GMRegistry reg(MyFactory); 140