1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com#include "gm.h"
9dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com#include "SkBitmap.h"
10dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com#include "SkShader.h"
11dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com#include "SkXfermode.h"
12dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com
13dd0ac281e920b01a63789893cc3e7422789658ddreed@android.comnamespace skiagm {
14dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com
157542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.orgstatic void make_bitmaps(int w, int h, SkBitmap* src, SkBitmap* dst,
167542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org                         SkBitmap* transparent) {
17eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com    src->allocN32Pixels(w, h);
18dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com    src->eraseColor(SK_ColorTRANSPARENT);
19dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com
20dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com    SkPaint p;
213bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org    p.setAntiAlias(true);
223bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org
23dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com    SkRect r;
24dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com    SkScalar ww = SkIntToScalar(w);
25dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com    SkScalar hh = SkIntToScalar(h);
26dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com
273bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org    {
283bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org        SkCanvas c(*src);
293bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org        p.setColor(0xFFFFCC44);
303bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org        r.set(0, 0, ww*3/4, hh*3/4);
313bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org        c.drawOval(r, p);
323bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org    }
3386bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com
34dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org    dst->allocN32Pixels(w, h);
35dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com    dst->eraseColor(SK_ColorTRANSPARENT);
36dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com
373bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org    {
383bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org        SkCanvas c(*dst);
393bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org        p.setColor(0xFF66AAFF);
403bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org        r.set(ww/3, hh/3, ww*19/20, hh*19/20);
413bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org        c.drawRect(r, p);
423bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org    }
437542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org
44dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org    transparent->allocN32Pixels(w, h);
457542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org    transparent->eraseColor(SK_ColorTRANSPARENT);
46dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com}
47dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com
487312a183270db1dc4e23412465a41af47c45b95cscroggo@google.comstatic uint16_t gData[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF };
497312a183270db1dc4e23412465a41af47c45b95cscroggo@google.com
50dd0ac281e920b01a63789893cc3e7422789658ddreed@android.comclass XfermodesGM : public GM {
513b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org    enum SrcType {
523b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org     //! A WxH image with a rectangle in the lower right.
533b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org     kRectangleImage_SrcType               = 0x01,
543b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org     //! kRectangleImage_SrcType with an alpha of 34.5%.
553b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org     kRectangleImageWithAlpha_SrcType      = 0x02,
563b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org     //! kRectnagleImageWithAlpha_SrcType scaled down by half.
573b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org     kSmallRectangleImageWithAlpha_SrcType = 0x04,
583b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org     //! kRectangleImage_SrcType drawn directly instead in an image.
593b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org     kRectangle_SrcType                    = 0x08,
603b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org     //! Two rectangles, first on the right half, second on the bottom half.
613b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org     kQuarterClear_SrcType                 = 0x10,
623b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org     //! kQuarterClear_SrcType in a layer.
633b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org     kQuarterClearInLayer_SrcType          = 0x20,
647542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org     //! A W/2xH/2 transparent image.
657542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org     kSmallTransparentImage_SrcType        = 0x40,
664e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org     //! kRectangleImage_SrcType drawn directly with a mask.
674e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org     kRectangleWithMask_SrcType            = 0x80,
683b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org
694e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org     kAll_SrcType                          = 0xFF, //!< All the source types.
703b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org     kBasic_SrcType                        = 0x03, //!< Just basic source types.
713b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org    };
723b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org
73dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com    SkBitmap    fBG;
747542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org    SkBitmap    fSrcB, fDstB, fTransparent;
75dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com
763b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org    /* The srcType argument indicates what to draw for the source part. Skia
773b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org     * uses the implied shape of the drawing command and these modes
783b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org     * demonstrate that.
793b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org     */
803b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org    void draw_mode(SkCanvas* canvas, SkXfermode* mode, SrcType srcType,
81f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com                   SkScalar x, SkScalar y) {
82dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com        SkPaint p;
833b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org        SkMatrix m;
843b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org        bool restoreNeeded = false;
853b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org        m.setTranslate(x, y);
8686bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com
873b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org        canvas->drawBitmapMatrix(fSrcB, m, &p);
88dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com        p.setXfermode(mode);
893b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org        switch (srcType) {
907542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org            case kSmallTransparentImage_SrcType:
917542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org                m.postScale(SK_ScalarHalf, SK_ScalarHalf, x, y);
927542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org                canvas->drawBitmapMatrix(fTransparent, m, &p);
937542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org                break;
943b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            case kQuarterClearInLayer_SrcType: {
95f5747daed9e3392b0a8875a7dbedfcd652b6781avandebo@chromium.org                SkRect bounds = SkRect::MakeXYWH(x, y, SkIntToScalar(W),
96f5747daed9e3392b0a8875a7dbedfcd652b6781avandebo@chromium.org                                                 SkIntToScalar(H));
973b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                canvas->saveLayer(&bounds, &p);
983b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                restoreNeeded = true;
993b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                p.setXfermodeMode(SkXfermode::kSrcOver_Mode);
1003b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                // Fall through.
1013b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            }
1023b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            case kQuarterClear_SrcType: {
1033b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                SkScalar halfW = SkIntToScalar(W) / 2;
1043b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                SkScalar halfH = SkIntToScalar(H) / 2;
1053b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                p.setColor(0xFF66AAFF);
106f5747daed9e3392b0a8875a7dbedfcd652b6781avandebo@chromium.org                SkRect r = SkRect::MakeXYWH(x + halfW, y, halfW,
107f5747daed9e3392b0a8875a7dbedfcd652b6781avandebo@chromium.org                                            SkIntToScalar(H));
1083b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                canvas->drawRect(r, p);
1093b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                p.setColor(0xFFAA66FF);
110f5747daed9e3392b0a8875a7dbedfcd652b6781avandebo@chromium.org                r = SkRect::MakeXYWH(x, y + halfH, SkIntToScalar(W), halfH);
1113b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                canvas->drawRect(r, p);
1123b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                break;
1133b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            }
1144e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org            case kRectangleWithMask_SrcType: {
115091a594dbc4116ec2e54724432472bf37dae794acommit-bot@chromium.org                canvas->save();
1164e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org                restoreNeeded = true;
1174e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org                SkScalar w = SkIntToScalar(W);
1184e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org                SkScalar h = SkIntToScalar(H);
1194e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org                SkRect r = SkRect::MakeXYWH(x, y + h / 4, w, h * 23 / 60);
1204e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org                canvas->clipRect(r);
1214e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org                // Fall through.
1224e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org            }
1233b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            case kRectangle_SrcType: {
1243b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                SkScalar w = SkIntToScalar(W);
1253b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                SkScalar h = SkIntToScalar(H);
1263b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                SkRect r = SkRect::MakeXYWH(x + w / 3, y + h / 3,
1273b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                                            w * 37 / 60, h * 37 / 60);
1283b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                p.setColor(0xFF66AAFF);
1293b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                canvas->drawRect(r, p);
1303b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                break;
1313b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            }
1323b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            case kSmallRectangleImageWithAlpha_SrcType:
1333b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                m.postScale(SK_ScalarHalf, SK_ScalarHalf, x, y);
1343b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                // Fall through.
1353b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            case kRectangleImageWithAlpha_SrcType:
1363b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                p.setAlpha(0x88);
1373b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                // Fall through.
1383b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            case kRectangleImage_SrcType:
1393b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                canvas->drawBitmapMatrix(fDstB, m, &p);
1403b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                break;
1413b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            default:
1423b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                break;
1433b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org        }
1443b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org
1453b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org        if (restoreNeeded) {
1463b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            canvas->restore();
1473b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org        }
148dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com    }
14986bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com
1507312a183270db1dc4e23412465a41af47c45b95cscroggo@google.com    virtual void onOnceBeforeDraw() SK_OVERRIDE {
151dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org        fBG.installPixels(SkImageInfo::Make(2, 2, kARGB_4444_SkColorType,
152dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org                                            kOpaque_SkAlphaType),
153dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org                          gData, 4);
1547312a183270db1dc4e23412465a41af47c45b95cscroggo@google.com
1557542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org        make_bitmaps(W, H, &fSrcB, &fDstB, &fTransparent);
1565213c042169bd63ebb27c50772062154ec2f3a4freed@google.com    }
1575213c042169bd63ebb27c50772062154ec2f3a4freed@google.com
158dd0ac281e920b01a63789893cc3e7422789658ddreed@android.compublic:
159f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com    const static int W = 64;
160f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com    const static int H = 64;
1617312a183270db1dc4e23412465a41af47c45b95cscroggo@google.com    XfermodesGM() {}
16286bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com
163dd0ac281e920b01a63789893cc3e7422789658ddreed@android.comprotected:
164048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    virtual SkString onShortName() {
1658015dd83ae37147bb630d4751030868051ad0caereed@android.com        return SkString("xfermodes");
1668015dd83ae37147bb630d4751030868051ad0caereed@android.com    }
1678015dd83ae37147bb630d4751030868051ad0caereed@android.com
16886bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com    virtual SkISize onISize() {
169f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(1990, 640);
170048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    }
171dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com
172dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com    virtual void onDraw(SkCanvas* canvas) {
173f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com        canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
17486bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com
175dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com        const struct {
176f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com            SkXfermode::Mode  fMode;
1773b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            const char*       fLabel;
1783b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            int               fSourceTypeMask;  // The source types to use this
1793b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                                                // mode with. See draw_mode for
1803b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                                                // an explanation of each type.
1813b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                                                // PDF has to play some tricks
1823b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                                                // to support the base modes,
1833b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                                                // test those more extensively.
184dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com        } gModes[] = {
1853b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kClear_Mode,        "Clear",        kAll_SrcType   },
1863b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kSrc_Mode,          "Src",          kAll_SrcType   },
1873b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kDst_Mode,          "Dst",          kAll_SrcType   },
1883b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kSrcOver_Mode,      "SrcOver",      kAll_SrcType   },
1893b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kDstOver_Mode,      "DstOver",      kAll_SrcType   },
1903b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kSrcIn_Mode,        "SrcIn",        kAll_SrcType   },
1913b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kDstIn_Mode,        "DstIn",        kAll_SrcType   },
1923b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kSrcOut_Mode,       "SrcOut",       kAll_SrcType   },
1933b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kDstOut_Mode,       "DstOut",       kAll_SrcType   },
1943b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kSrcATop_Mode,      "SrcATop",      kAll_SrcType   },
1953b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kDstATop_Mode,      "DstATop",      kAll_SrcType   },
1963b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org
1973b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kXor_Mode,          "Xor",          kBasic_SrcType },
1983b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kPlus_Mode,         "Plus",         kBasic_SrcType },
1993b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kModulate_Mode,     "Modulate",     kAll_SrcType   },
2003b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kScreen_Mode,       "Screen",       kBasic_SrcType },
2013b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kOverlay_Mode,      "Overlay",      kBasic_SrcType },
2023b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kDarken_Mode,       "Darken",       kBasic_SrcType },
2033b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kLighten_Mode,      "Lighten",      kBasic_SrcType },
2043b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kColorDodge_Mode,   "ColorDodge",   kBasic_SrcType },
2053b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kColorBurn_Mode,    "ColorBurn",    kBasic_SrcType },
2063b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kHardLight_Mode,    "HardLight",    kBasic_SrcType },
2073b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kSoftLight_Mode,    "SoftLight",    kBasic_SrcType },
2083b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kDifference_Mode,   "Difference",   kBasic_SrcType },
2093b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kExclusion_Mode,    "Exclusion",    kBasic_SrcType },
2103b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kMultiply_Mode,     "Multiply",     kAll_SrcType   },
2113b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kHue_Mode,          "Hue",          kBasic_SrcType },
2123b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kSaturation_Mode,   "Saturation",   kBasic_SrcType },
2133b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kColor_Mode,        "Color",        kBasic_SrcType },
2143b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            { SkXfermode::kLuminosity_Mode,   "Luminosity",   kBasic_SrcType },
215dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com        };
21686bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com
217f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com        const SkScalar w = SkIntToScalar(W);
218f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com        const SkScalar h = SkIntToScalar(H);
219dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com        SkMatrix m;
220dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com        m.setScale(SkIntToScalar(6), SkIntToScalar(6));
2219c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org        SkShader* s = SkShader::CreateBitmapShader(fBG,
2229c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                                                   SkShader::kRepeat_TileMode,
2239c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                                                   SkShader::kRepeat_TileMode,
2249c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                                                   &m);
22586bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com
226dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com        SkPaint labelP;
227dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com        labelP.setAntiAlias(true);
228dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com        labelP.setTextAlign(SkPaint::kCenter_Align);
22986bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com
230c9c64229034f595a3dc9e193b2e531c809e1eaf7reed@android.com        const int W = 5;
23186bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com
232dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com        SkScalar x0 = 0;
2333b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org        SkScalar y0 = 0;
2343b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org        for (int sourceType = 1; sourceType & kAll_SrcType; sourceType <<= 1) {
2353b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            SkScalar x = x0, y = y0;
236dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com            for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) {
2373b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                if ((gModes[i].fSourceTypeMask & sourceType) == 0) {
2383b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                    continue;
2393b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                }
240c9c64229034f595a3dc9e193b2e531c809e1eaf7reed@android.com                SkXfermode* mode = SkXfermode::Create(gModes[i].fMode);
241f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com                SkAutoUnref aur(mode);
242dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com                SkRect r;
243dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com                r.set(x, y, x+w, y+h);
24486bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com
245f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com                SkPaint p;
246dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com                p.setStyle(SkPaint::kFill_Style);
247dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com                p.setShader(s);
248dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com                canvas->drawRect(r, p);
24986bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com
250091a594dbc4116ec2e54724432472bf37dae794acommit-bot@chromium.org                canvas->saveLayer(&r, NULL);
2513b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                draw_mode(canvas, mode, static_cast<SrcType>(sourceType),
2523b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                          r.fLeft, r.fTop);
253f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com                canvas->restore();
25486bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com
255f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com                r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
256f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com                p.setStyle(SkPaint::kStroke_Style);
257f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com                p.setShader(NULL);
258f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com                canvas->drawRect(r, p);
25986bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com
260f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com#if 1
261dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com                canvas->drawText(gModes[i].fLabel, strlen(gModes[i].fLabel),
262dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com                                 x + w/2, y - labelP.getTextSize()/2, labelP);
263f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com#endif
264dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com                x += w + SkIntToScalar(10);
265c9c64229034f595a3dc9e193b2e531c809e1eaf7reed@android.com                if ((i % W) == W - 1) {
266dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com                    x = x0;
267dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com                    y += h + SkIntToScalar(30);
268dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com                }
269dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com            }
2703b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            if (y < 320) {
2713b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                if (x > x0) {
2723b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                    y += h + SkIntToScalar(30);
2733b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                }
2743b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                y0 = y;
2753b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            } else {
2763b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                x0 += SkIntToScalar(400);
2773b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org                y0 = 0;
2783b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org            }
279dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com        }
280dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com        s->unref();
281dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com    }
282dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com
283dd0ac281e920b01a63789893cc3e7422789658ddreed@android.comprivate:
284dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com    typedef GM INHERITED;
285dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com};
286dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com
287dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com//////////////////////////////////////////////////////////////////////////////
288dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com
289dd0ac281e920b01a63789893cc3e7422789658ddreed@android.comstatic GM* MyFactory(void*) { return new XfermodesGM; }
290dd0ac281e920b01a63789893cc3e7422789658ddreed@android.comstatic GMRegistry reg(MyFactory);
291dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com
292dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com}
293