1e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org/*
2e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org * Copyright 2011 Google Inc.
3e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org *
4e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
5e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org * found in the LICENSE file.
6e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org */
7e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org
8e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org#include "gm.h"
9e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org#include "SkColorMatrixFilter.h"
101282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com#include "SkGradientShader.h"
11e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org
12e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org#define WIDTH 500
13e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org#define HEIGHT 500
14e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org
152ab1ba055536825552d6b49f0210c4e1531f02f0commit-bot@chromium.orgclass SkDoOnce {
169afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.compublic:
172ab1ba055536825552d6b49f0210c4e1531f02f0commit-bot@chromium.org    SkDoOnce() : fOnce(false) {};
189afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.com
199afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.com    bool once() const {
209afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.com        if (fOnce) {
219afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.com            return false;
229afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.com        }
239afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.com        fOnce = true;
249afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.com        return true;
259afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.com    }
26d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
279afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.comprivate:
289afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.com    mutable bool fOnce;
299afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.com};
309afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.com
317b6c19392cd980462908764b5ea17c4796610427reed@google.comstatic void setColorMatrix(SkPaint* paint, const SkColorMatrix& matrix) {
32727a352f7412753d2a3e4d30eab6500a1a4de135commit-bot@chromium.org    paint->setColorFilter(SkColorMatrixFilter::Create(matrix))->unref();
337b6c19392cd980462908764b5ea17c4796610427reed@google.com}
347b6c19392cd980462908764b5ea17c4796610427reed@google.com
357b6c19392cd980462908764b5ea17c4796610427reed@google.comstatic void setArray(SkPaint* paint, const SkScalar array[]) {
36727a352f7412753d2a3e4d30eab6500a1a4de135commit-bot@chromium.org    paint->setColorFilter(SkColorMatrixFilter::Create(array))->unref();
377b6c19392cd980462908764b5ea17c4796610427reed@google.com}
387b6c19392cd980462908764b5ea17c4796610427reed@google.com
39e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.orgnamespace skiagm {
40e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org
41e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.orgclass ColorMatrixGM : public GM {
422ab1ba055536825552d6b49f0210c4e1531f02f0commit-bot@chromium.org    SkDoOnce fOnce;
439afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.com    void init() {
449afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.com        if (fOnce.once()) {
451282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            fSolidBitmap = this->createSolidBitmap(64, 64);
461282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            fTransparentBitmap = this->createTransparentBitmap(64, 64);
479afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.com        }
489afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.com    }
499afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.com
50e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.orgpublic:
51e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org    ColorMatrixGM() {
52e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org        this->setBGColor(0xFF808080);
53e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org    }
54d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
55e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.orgprotected:
56e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org    virtual SkString onShortName() {
57e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org        return SkString("colormatrix");
58e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org    }
59e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org
60e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org    virtual SkISize onISize() {
61f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(WIDTH, HEIGHT);
62e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org    }
63e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org
641282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com    SkBitmap createSolidBitmap(int width, int height) {
65e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org        SkBitmap bm;
66eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com        bm.allocN32Pixels(width, height);
67e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org        SkCanvas canvas(bm);
6850bdad85db2fe6be4d0bf0c5b6473f712b1bdd32senorblanco@chromium.org        canvas.clear(0x0);
69e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org        for (int y = 0; y < height; ++y) {
70e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org            for (int x = 0; x < width; ++x) {
71e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org                SkPaint paint;
72e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org                paint.setColor(SkColorSetARGB(255, x * 255 / width, y * 255 / height, 0));
7375589257c6ac7fc55a66502b74b8bc09c0212featomhudson@google.com                canvas.drawRect(SkRect::MakeXYWH(SkIntToScalar(x),
7475589257c6ac7fc55a66502b74b8bc09c0212featomhudson@google.com                    SkIntToScalar(y), SK_Scalar1, SK_Scalar1), paint);
75e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org            }
76e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org        }
77e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org        return bm;
78e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org    }
791282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com
801282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com    // creates a bitmap with shades of transparent gray.
811282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com    SkBitmap createTransparentBitmap(int width, int height) {
821282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com        SkBitmap bm;
83eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com        bm.allocN32Pixels(width, height);
841282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com        SkCanvas canvas(bm);
851282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com        canvas.clear(0x0);
861282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com
871282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com        SkPoint pts[] = {{0, 0}, {SkIntToScalar(width), SkIntToScalar(height)}};
881282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com        SkColor colors[] = {0x00000000, 0xFFFFFFFF};
891282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com        SkPaint paint;
901282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com        paint.setShader(SkGradientShader::CreateLinear(pts, colors, NULL, 2,
911282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com                                                       SkShader::kClamp_TileMode))->unref();
921282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com        canvas.drawRect(SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)), paint);
931282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com        return bm;
941282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com    }
951282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com
96e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org    virtual void onDraw(SkCanvas* canvas) {
979afc656df6e81a17ab591b607a92755a5a2e06ccreed@google.com        this->init();
98e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org
99e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org        SkPaint paint;
100e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org        SkColorMatrix matrix;
101e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org
1021282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com        paint.setXfermodeMode(SkXfermode::kSrc_Mode);
1031282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com        const SkBitmap bmps[] = { fSolidBitmap, fTransparentBitmap };
1041282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com
1051282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com        for (size_t i = 0; i < SK_ARRAY_COUNT(bmps); ++i) {
1061282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com
1071282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            matrix.setIdentity();
1081282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            setColorMatrix(&paint, matrix);
1091282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            canvas->drawBitmap(bmps[i], 0, 0, &paint);
1101282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com
1111282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            matrix.setRotate(SkColorMatrix::kR_Axis, 90);
1121282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            setColorMatrix(&paint, matrix);
1131282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            canvas->drawBitmap(bmps[i], 80, 0, &paint);
1141282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com
1151282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            matrix.setRotate(SkColorMatrix::kG_Axis, 90);
1161282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            setColorMatrix(&paint, matrix);
1171282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            canvas->drawBitmap(bmps[i], 160, 0, &paint);
1181282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com
1191282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            matrix.setRotate(SkColorMatrix::kB_Axis, 90);
1201282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            setColorMatrix(&paint, matrix);
1211282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            canvas->drawBitmap(bmps[i], 240, 0, &paint);
1221282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com
1234b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org            matrix.setSaturation(0.0f);
1241282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            setColorMatrix(&paint, matrix);
1251282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            canvas->drawBitmap(bmps[i], 0, 80, &paint);
1261282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com
1274b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org            matrix.setSaturation(0.5f);
1281282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            setColorMatrix(&paint, matrix);
1291282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            canvas->drawBitmap(bmps[i], 80, 80, &paint);
1301282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com
1314b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org            matrix.setSaturation(1.0f);
1321282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            setColorMatrix(&paint, matrix);
1331282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            canvas->drawBitmap(bmps[i], 160, 80, &paint);
1341282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com
1354b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org            matrix.setSaturation(2.0f);
1361282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            setColorMatrix(&paint, matrix);
1371282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            canvas->drawBitmap(bmps[i], 240, 80, &paint);
1381282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com
1391282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            matrix.setRGB2YUV();
1401282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            setColorMatrix(&paint, matrix);
1411282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            canvas->drawBitmap(bmps[i], 0, 160, &paint);
1421282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com
1431282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            matrix.setYUV2RGB();
1441282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            setColorMatrix(&paint, matrix);
1451282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            canvas->drawBitmap(bmps[i], 80, 160, &paint);
1461282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com
1471282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            SkScalar s1 = SK_Scalar1;
1481282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            SkScalar s255 = SkIntToScalar(255);
1491282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            // Move red into alpha, set color to white
1501282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            SkScalar data[20] = {
1511282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com                0,  0, 0, 0, s255,
1521282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com                0,  0, 0, 0, s255,
1531282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com                0,  0, 0, 0, s255,
1541282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com                s1, 0, 0, 0, 0,
1551282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            };
1561282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com
1571282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            setArray(&paint, data);
1581282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            canvas->drawBitmap(bmps[i], 160, 160, &paint);
1591282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com
1601282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com            canvas->translate(0, 240);
1611282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com        }
162e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org    }
163d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
164e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.orgprivate:
1651282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com    SkBitmap fSolidBitmap;
1661282009256618521f8dd10dd7343df31d336b7c3bsalomon@google.com    SkBitmap fTransparentBitmap;
167e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org    typedef GM INHERITED;
168e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org};
169e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org
170e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org//////////////////////////////////////////////////////////////////////////////
171e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org
172e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.orgstatic GM* MyFactory(void*) { return new ColorMatrixGM; }
173e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.orgstatic GMRegistry reg(MyFactory);
174e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org
175e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org}
176