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