tablecolorfilter.cpp revision dbfac8a72393eaf01670aeb3244de0e18d8faf98
1a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org/* 2a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org * Copyright 2011 Google Inc. 3a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org * 4a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org * Use of this source code is governed by a BSD-style license that can be 5a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org * found in the LICENSE file. 6a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org */ 7a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 8a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#include "gm.h" 9a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#include "SkCanvas.h" 10a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#include "SkGradientShader.h" 11a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#include "SkTableColorFilter.h" 12a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 13a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_bm0(SkBitmap* bm) { 14a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org int W = 120; 15a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org int H = 120; 16a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org bm->setConfig(SkBitmap::kARGB_8888_Config, W, H); 17a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org bm->allocPixels(); 18dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com bm->eraseColor(SK_ColorTRANSPARENT); 19d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 20a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkCanvas canvas(*bm); 21a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkPaint paint; 22cadbcb8e536f89babb4e165bfdca18384e97d582bsalomon@google.com SkPoint pts[] = { {0, 0}, {SkIntToScalar(W), SkIntToScalar(H)} }; 23a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkColor colors[] = { 24a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SK_ColorBLACK, SK_ColorGREEN, SK_ColorCYAN, 25a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SK_ColorRED, 0, SK_ColorBLUE, SK_ColorWHITE 26a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org }; 27a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL, SK_ARRAY_COUNT(colors), 28a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkShader::kClamp_TileMode); 29a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org paint.setShader(s)->unref(); 30a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org canvas.drawPaint(paint); 31a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org} 32a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_bm1(SkBitmap* bm) { 33a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org int W = 120; 34a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org int H = 120; 35a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org bm->setConfig(SkBitmap::kARGB_8888_Config, W, H); 36a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org bm->allocPixels(); 37dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com bm->eraseColor(SK_ColorTRANSPARENT); 38d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 39a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkCanvas canvas(*bm); 40a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkPaint paint; 41a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkScalar cx = SkIntToScalar(W)/2; 42a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkScalar cy = SkIntToScalar(H)/2; 43a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkColor colors[] = { 44a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, 45a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org }; 46a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkShader* s = SkGradientShader::CreateRadial(SkPoint::Make(SkIntToScalar(W)/2, 47a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkIntToScalar(H)/2), 48a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkIntToScalar(W)/2, colors, NULL, SK_ARRAY_COUNT(colors), 49a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkShader::kClamp_TileMode); 50a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org paint.setShader(s)->unref(); 51a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org paint.setAntiAlias(true); 52a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org canvas.drawCircle(cx, cy, cx, paint); 53a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org} 54a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 55a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_table0(uint8_t table[]) { 56a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org for (int i = 0; i < 256; ++i) { 57a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org int n = i >> 5; 58a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org table[i] = (n << 5) | (n << 2) | (n >> 1); 59a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 60a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org} 61a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_table1(uint8_t table[]) { 62a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org for (int i = 0; i < 256; ++i) { 63a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org table[i] = i * i / 255; 64a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 65a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org} 66a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_table2(uint8_t table[]) { 67a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org for (int i = 0; i < 256; ++i) { 68a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org float fi = i / 255.0f; 696853e808a464ca75ff1328338d1eb55ff27c4337robertphillips@google.com table[i] = static_cast<uint8_t>(sqrtf(fi) * 255); 70a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 71a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org} 72a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 73a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic SkColorFilter* make_cf0() { 74a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org uint8_t table[256]; make_table0(table); 75a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org return SkTableColorFilter::Create(table); 76a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org} 77a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic SkColorFilter* make_cf1() { 78a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org uint8_t table[256]; make_table1(table); 79a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org return SkTableColorFilter::Create(table); 80a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org} 81a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic SkColorFilter* make_cf2() { 82a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org uint8_t table[256]; make_table2(table); 83a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org return SkTableColorFilter::Create(table); 84a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org} 85a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic SkColorFilter* make_cf3() { 86a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org uint8_t table0[256]; make_table0(table0); 87a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org uint8_t table1[256]; make_table1(table1); 88a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org uint8_t table2[256]; make_table2(table2); 89a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org return SkTableColorFilter::CreateARGB(NULL, table0, table1, table2); 90a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org} 91a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 92a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgclass TableColorFilterGM : public skiagm::GM { 93a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgpublic: 94a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org TableColorFilterGM() {} 95d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 96a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgprotected: 97a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org virtual SkString onShortName() { 98a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org return SkString("tablecolorfilter"); 99a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 100d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 101a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org virtual SkISize onISize() { 1026b2f7ea7f470bd50dc69d331097a647ec03f8070reed@google.com return SkISize::Make(700, 300); 103a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 104d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 105a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org virtual void onDraw(SkCanvas* canvas) { 106a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org canvas->drawColor(0xFFDDDDDD); 107a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org canvas->translate(20, 20); 108d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 109a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkScalar x = 0, y = 0; 110d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 111a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org static void (*gMakers[])(SkBitmap*) = { make_bm0, make_bm1 }; 112a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org for (size_t maker = 0; maker < SK_ARRAY_COUNT(gMakers); ++maker) { 113a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkBitmap bm; 114a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org gMakers[maker](&bm); 115d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 116a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkPaint paint; 117a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org x = 0; 118a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org canvas->drawBitmap(bm, x, y, &paint); 119a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org paint.setColorFilter(make_cf0())->unref(); x += bm.width() * 9 / 8; 120a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org canvas->drawBitmap(bm, x, y, &paint); 121a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org paint.setColorFilter(make_cf1())->unref(); x += bm.width() * 9 / 8; 122a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org canvas->drawBitmap(bm, x, y, &paint); 123a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org paint.setColorFilter(make_cf2())->unref(); x += bm.width() * 9 / 8; 124a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org canvas->drawBitmap(bm, x, y, &paint); 125a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org paint.setColorFilter(make_cf3())->unref(); x += bm.width() * 9 / 8; 126a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org canvas->drawBitmap(bm, x, y, &paint); 127d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 128a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org y += bm.height() * 9 / 8; 129a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 130a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 131d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 132a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgprivate: 133a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org typedef GM INHERITED; 134a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}; 135a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 136a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org////////////////////////////////////////////////////////////////////////////// 137a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 138a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic skiagm::GM* MyFactory(void*) { return new TableColorFilterGM; } 139a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic skiagm::GMRegistry reg(MyFactory); 140