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