186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org/*
286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org * Copyright 2013 Google Inc.
386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org *
486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org * found in the LICENSE file.
686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org */
786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#include "gm.h"
9b0cce2c1d37d4bf5b89da6c70062209ac4e0e643halcanary#include "sk_tool_utils.h"
1086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#include "SkArithmeticMode.h"
117b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org#include "SkOffsetImageFilter.h"
1286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#include "SkXfermodeImageFilter.h"
1386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#include "SkBitmapSource.h"
1486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
1586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#define WIDTH 600
1686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#define HEIGHT 600
1786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#define MARGIN 12
1886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
1986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.orgnamespace skiagm {
2086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
2186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.orgclass XfermodeImageFilterGM : public GM {
2286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.orgpublic:
23e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org    XfermodeImageFilterGM(){
2486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        this->setBGColor(0xFF000000);
2586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    }
2686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
2786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.orgprotected:
2836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
2986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        return SkString("xfermodeimagefilter");
3086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    }
3186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
3286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    void make_bitmap() {
33eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com        fBitmap.allocN32Pixels(80, 80);
34c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org        SkCanvas canvas(fBitmap);
3586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        canvas.clear(0x00000000);
3686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        SkPaint paint;
3786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        paint.setAntiAlias(true);
38992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        sk_tool_utils::set_portable_typeface(&paint);
3986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        paint.setColor(0xD000D000);
4086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        paint.setTextSize(SkIntToScalar(96));
4186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        const char* str = "e";
4286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        canvas.drawText(str, strlen(str), SkIntToScalar(15), SkIntToScalar(65), paint);
4386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    }
4486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
4536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override {
46f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(WIDTH, HEIGHT);
4786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    }
4886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
49e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org    static void drawClippedBitmap(SkCanvas* canvas, const SkBitmap& bitmap, const SkPaint& paint,
50e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org                           int x, int y) {
5186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        canvas->save();
52e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
53e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        canvas->clipRect(SkRect::MakeWH(
5486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.height())));
55e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        canvas->drawBitmap(bitmap, 0, 0, &paint);
5686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        canvas->restore();
5786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    }
5886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
59e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org    static void drawClippedPaint(SkCanvas* canvas, const SkRect& rect, const SkPaint& paint,
60e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org                          int x, int y) {
61e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        canvas->save();
62e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
63e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        canvas->clipRect(rect);
64e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        canvas->drawPaint(paint);
65e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        canvas->restore();
66e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org    }
67e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org
6836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onOnceBeforeDraw() override {
69e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        make_bitmap();
70878fa0204bc246ec5fbaca4aa3c81aaefccc30a1halcanary
71878fa0204bc246ec5fbaca4aa3c81aaefccc30a1halcanary        fCheckerboard.allocN32Pixels(80, 80);
72878fa0204bc246ec5fbaca4aa3c81aaefccc30a1halcanary        SkCanvas checkerboardCanvas(fCheckerboard);
73b0cce2c1d37d4bf5b89da6c70062209ac4e0e643halcanary        sk_tool_utils::draw_checkerboard(&checkerboardCanvas, 0xFFA0A0A0, 0xFF404040, 8);
74e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org    }
75e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org
7636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
7716b254a200f63e85041cac9a283ff0ff14d94ba1senorblanco        canvas->clear(SK_ColorBLACK);
7886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        SkPaint paint;
7986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
8086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        const struct {
8186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            SkXfermode::Mode  fMode;
8286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            const char*         fLabel;
8386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        } gModes[] = {
8486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kClear_Mode,    "Clear"     },
8586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kSrc_Mode,      "Src"       },
8686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kDst_Mode,      "Dst"       },
8786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kSrcOver_Mode,  "SrcOver"   },
8886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kDstOver_Mode,  "DstOver"   },
8986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kSrcIn_Mode,    "SrcIn"     },
9086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kDstIn_Mode,    "DstIn"     },
9186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kSrcOut_Mode,   "SrcOut"    },
9286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kDstOut_Mode,   "DstOut"    },
9386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kSrcATop_Mode,  "SrcATop"   },
9486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kDstATop_Mode,  "DstATop"   },
9586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kXor_Mode,      "Xor"       },
9686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
9786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kPlus_Mode,         "Plus"          },
9886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kModulate_Mode,     "Modulate"      },
9986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kScreen_Mode,       "Screen"        },
10086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kOverlay_Mode,      "Overlay"       },
10186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kDarken_Mode,       "Darken"        },
10286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kLighten_Mode,      "Lighten"       },
10386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kColorDodge_Mode,   "ColorDodge"    },
10486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kColorBurn_Mode,    "ColorBurn"     },
10586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kHardLight_Mode,    "HardLight"     },
10686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kSoftLight_Mode,    "SoftLight"     },
10786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kDifference_Mode,   "Difference"    },
10886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kExclusion_Mode,    "Exclusion"     },
10986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kMultiply_Mode,     "Multiply"      },
11086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kHue_Mode,          "Hue"           },
11186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kSaturation_Mode,   "Saturation"    },
11286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kColor_Mode,        "Color"         },
11386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kLuminosity_Mode,   "Luminosity"    },
11486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        };
11586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
11686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        int x = 0, y = 0;
117cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        SkAutoTUnref<SkImageFilter> background(SkBitmapSource::Create(fCheckerboard));
11886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) {
11986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            SkAutoTUnref<SkXfermode> mode(SkXfermode::Create(gModes[i].fMode));
120cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkAutoTUnref<SkImageFilter> filter(SkXfermodeImageFilter::Create(mode, background));
12186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            paint.setImageFilter(filter);
122e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org            drawClippedBitmap(canvas, fBitmap, paint, x, y);
12386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            x += fBitmap.width() + MARGIN;
12486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            if (x + fBitmap.width() > WIDTH) {
12586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org                x = 0;
12686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org                y += fBitmap.height() + MARGIN;
12786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            }
12886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        }
12986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        // Test arithmetic mode as image filter
13086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        SkAutoTUnref<SkXfermode> mode(SkArithmeticMode::Create(0, SK_Scalar1, SK_Scalar1, 0));
131cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        SkAutoTUnref<SkImageFilter> filter(SkXfermodeImageFilter::Create(mode, background));
13286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        paint.setImageFilter(filter);
133e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        drawClippedBitmap(canvas, fBitmap, paint, x, y);
13486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        x += fBitmap.width() + MARGIN;
13586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        if (x + fBitmap.width() > WIDTH) {
13686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            x = 0;
13786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            y += fBitmap.height() + MARGIN;
13886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        }
13986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        // Test NULL mode
140cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        filter.reset(SkXfermodeImageFilter::Create(NULL, background));
14186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        paint.setImageFilter(filter);
142e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        drawClippedBitmap(canvas, fBitmap, paint, x, y);
1437b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        x += fBitmap.width() + MARGIN;
1447b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        if (x + fBitmap.width() > WIDTH) {
1457b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org            x = 0;
1467b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org            y += fBitmap.height() + MARGIN;
1477b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        }
148e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        SkRect clipRect = SkRect::MakeWH(SkIntToScalar(fBitmap.width() + 4),
149e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org                                         SkIntToScalar(fBitmap.height() + 4));
1507b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        // Test offsets on SrcMode (uses fixed-function blend)
151cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        SkAutoTUnref<SkImageFilter> foreground(SkBitmapSource::Create(fBitmap));
152cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        SkAutoTUnref<SkImageFilter> offsetForeground(SkOffsetImageFilter::Create(
153cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkIntToScalar(4), SkIntToScalar(-4), foreground));
154cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        SkAutoTUnref<SkImageFilter> offsetBackground(SkOffsetImageFilter::Create(
155cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkIntToScalar(4), SkIntToScalar(4), background));
1567b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        mode.reset(SkXfermode::Create(SkXfermode::kSrcOver_Mode));
157cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        filter.reset(SkXfermodeImageFilter::Create(mode, offsetBackground, offsetForeground));
1587b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        paint.setImageFilter(filter);
159e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        drawClippedPaint(canvas, clipRect, paint, x, y);
1607b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        x += fBitmap.width() + MARGIN;
1617b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        if (x + fBitmap.width() > WIDTH) {
1627b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org            x = 0;
1637b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org            y += fBitmap.height() + MARGIN;
1647b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        }
1657b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        // Test offsets on Darken (uses shader blend)
1667b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        mode.reset(SkXfermode::Create(SkXfermode::kDarken_Mode));
167cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        filter.reset(SkXfermodeImageFilter::Create(mode, offsetBackground, offsetForeground));
1687b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        paint.setImageFilter(filter);
169e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        drawClippedPaint(canvas, clipRect, paint, x, y);
1701a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        x += fBitmap.width() + MARGIN;
1711a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        if (x + fBitmap.width() > WIDTH) {
1721a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            x = 0;
1731a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            y += fBitmap.height() + MARGIN;
1741a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        }
1751a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        // Test cropping
1761a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        static const size_t nbSamples = 3;
1771a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        SkXfermode::Mode sampledModes[nbSamples] = {SkXfermode::kOverlay_Mode,
1781a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org                                                    SkXfermode::kSrcOver_Mode,
1791a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org                                                    SkXfermode::kPlus_Mode};
1801a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        int offsets[nbSamples][4] = {{ 10,  10, -16, -16},
1811a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org                                     { 10,  10,  10,  10},
1821a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org                                     {-10, -10,  -6,  -6}};
1831a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        for (size_t i = 0; i < nbSamples; ++i) {
184e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org            SkIRect cropRect = SkIRect::MakeXYWH(offsets[i][0],
185e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org                                                 offsets[i][1],
1861a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org                                                 fBitmap.width()  + offsets[i][2],
1871a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org                                                 fBitmap.height() + offsets[i][3]);
188b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org            SkImageFilter::CropRect rect(SkRect::Make(cropRect));
1891a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            mode.reset(SkXfermode::Create(sampledModes[i]));
190cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            filter.reset(SkXfermodeImageFilter::Create(
191cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                    mode, offsetBackground, offsetForeground, &rect));
1921a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            paint.setImageFilter(filter);
193e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org            drawClippedPaint(canvas, clipRect, paint, x, y);
1941a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            x += fBitmap.width() + MARGIN;
1951a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            if (x + fBitmap.width() > WIDTH) {
1961a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org                x = 0;
1971a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org                y += fBitmap.height() + MARGIN;
1981a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            }
1991a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        }
20086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    }
20186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.orgprivate:
20286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    SkBitmap fBitmap, fCheckerboard;
203e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org    typedef GM INHERITED;
20486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org};
20586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
20686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org//////////////////////////////////////////////////////////////////////////////
20786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
208e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.orgDEF_GM( return new XfermodeImageFilterGM; );
20986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
21086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org}
211