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"
986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#include "SkArithmeticMode.h"
107b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org#include "SkOffsetImageFilter.h"
1186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#include "SkXfermodeImageFilter.h"
1286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#include "SkBitmapSource.h"
1386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
1486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#define WIDTH 600
1586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#define HEIGHT 600
1686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#define MARGIN 12
1786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
1886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.orgnamespace skiagm {
1986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
2086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.orgclass XfermodeImageFilterGM : public GM {
2186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.orgpublic:
22e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org    XfermodeImageFilterGM(){
2386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        this->setBGColor(0xFF000000);
2486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    }
2586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
2686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.orgprotected:
27e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org    virtual SkString onShortName() SK_OVERRIDE {
2886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        return SkString("xfermodeimagefilter");
2986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    }
3086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
3186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    void make_bitmap() {
32eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com        fBitmap.allocN32Pixels(80, 80);
33c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org        SkCanvas canvas(fBitmap);
3486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        canvas.clear(0x00000000);
3586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        SkPaint paint;
3686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        paint.setAntiAlias(true);
3786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        paint.setColor(0xD000D000);
3886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        paint.setTextSize(SkIntToScalar(96));
3986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        const char* str = "e";
4086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        canvas.drawText(str, strlen(str), SkIntToScalar(15), SkIntToScalar(65), paint);
4186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    }
4286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
4386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    void make_checkerboard() {
44eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com        fCheckerboard.allocN32Pixels(80, 80);
45c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org        SkCanvas canvas(fCheckerboard);
4686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        canvas.clear(0x00000000);
4786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        SkPaint darkPaint;
4886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        darkPaint.setColor(0xFF404040);
4986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        SkPaint lightPaint;
5086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        lightPaint.setColor(0xFFA0A0A0);
5186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        for (int y = 0; y < 80; y += 16) {
5286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org          for (int x = 0; x < 80; x += 16) {
5386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            canvas.save();
5486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
5586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
5686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
5786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
5886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
5986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            canvas.restore();
6086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org          }
6186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        }
6286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    }
6386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
64e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org    virtual SkISize onISize() SK_OVERRIDE {
65f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(WIDTH, HEIGHT);
6686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    }
6786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
68e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org    static void drawClippedBitmap(SkCanvas* canvas, const SkBitmap& bitmap, const SkPaint& paint,
69e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org                           int x, int y) {
7086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        canvas->save();
71e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
72e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        canvas->clipRect(SkRect::MakeWH(
7386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.height())));
74e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        canvas->drawBitmap(bitmap, 0, 0, &paint);
7586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        canvas->restore();
7686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    }
7786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
78e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org    static void drawClippedPaint(SkCanvas* canvas, const SkRect& rect, const SkPaint& paint,
79e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org                          int x, int y) {
80e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        canvas->save();
81e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
82e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        canvas->clipRect(rect);
83e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        canvas->drawPaint(paint);
84e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        canvas->restore();
85e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org    }
86e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org
87e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org    virtual void onOnceBeforeDraw() SK_OVERRIDE {
88e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        make_bitmap();
89e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        make_checkerboard();
90e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org    }
91e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org
92e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
9386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        canvas->clear(0x00000000);
9486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        SkPaint paint;
9586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
9686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        const struct {
9786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            SkXfermode::Mode  fMode;
9886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            const char*         fLabel;
9986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        } gModes[] = {
10086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kClear_Mode,    "Clear"     },
10186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kSrc_Mode,      "Src"       },
10286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kDst_Mode,      "Dst"       },
10386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kSrcOver_Mode,  "SrcOver"   },
10486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kDstOver_Mode,  "DstOver"   },
10586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kSrcIn_Mode,    "SrcIn"     },
10686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kDstIn_Mode,    "DstIn"     },
10786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kSrcOut_Mode,   "SrcOut"    },
10886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kDstOut_Mode,   "DstOut"    },
10986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kSrcATop_Mode,  "SrcATop"   },
11086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kDstATop_Mode,  "DstATop"   },
11186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kXor_Mode,      "Xor"       },
11286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
11386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kPlus_Mode,         "Plus"          },
11486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kModulate_Mode,     "Modulate"      },
11586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kScreen_Mode,       "Screen"        },
11686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kOverlay_Mode,      "Overlay"       },
11786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kDarken_Mode,       "Darken"        },
11886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kLighten_Mode,      "Lighten"       },
11986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kColorDodge_Mode,   "ColorDodge"    },
12086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kColorBurn_Mode,    "ColorBurn"     },
12186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kHardLight_Mode,    "HardLight"     },
12286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kSoftLight_Mode,    "SoftLight"     },
12386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kDifference_Mode,   "Difference"    },
12486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kExclusion_Mode,    "Exclusion"     },
12586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kMultiply_Mode,     "Multiply"      },
12686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kHue_Mode,          "Hue"           },
12786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kSaturation_Mode,   "Saturation"    },
12886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kColor_Mode,        "Color"         },
12986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            { SkXfermode::kLuminosity_Mode,   "Luminosity"    },
13086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        };
13186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
13286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        int x = 0, y = 0;
133cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        SkAutoTUnref<SkImageFilter> background(SkBitmapSource::Create(fCheckerboard));
13486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) {
13586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            SkAutoTUnref<SkXfermode> mode(SkXfermode::Create(gModes[i].fMode));
136cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkAutoTUnref<SkImageFilter> filter(SkXfermodeImageFilter::Create(mode, background));
13786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            paint.setImageFilter(filter);
138e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org            drawClippedBitmap(canvas, fBitmap, paint, x, y);
13986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            x += fBitmap.width() + MARGIN;
14086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            if (x + fBitmap.width() > WIDTH) {
14186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org                x = 0;
14286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org                y += fBitmap.height() + MARGIN;
14386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            }
14486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        }
14586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        // Test arithmetic mode as image filter
14686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        SkAutoTUnref<SkXfermode> mode(SkArithmeticMode::Create(0, SK_Scalar1, SK_Scalar1, 0));
147cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        SkAutoTUnref<SkImageFilter> filter(SkXfermodeImageFilter::Create(mode, background));
14886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        paint.setImageFilter(filter);
149e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        drawClippedBitmap(canvas, fBitmap, paint, x, y);
15086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        x += fBitmap.width() + MARGIN;
15186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        if (x + fBitmap.width() > WIDTH) {
15286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            x = 0;
15386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org            y += fBitmap.height() + MARGIN;
15486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        }
15586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        // Test NULL mode
156cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        filter.reset(SkXfermodeImageFilter::Create(NULL, background));
15786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org        paint.setImageFilter(filter);
158e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        drawClippedBitmap(canvas, fBitmap, paint, x, y);
1597b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        x += fBitmap.width() + MARGIN;
1607b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        if (x + fBitmap.width() > WIDTH) {
1617b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org            x = 0;
1627b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org            y += fBitmap.height() + MARGIN;
1637b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        }
164e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        SkRect clipRect = SkRect::MakeWH(SkIntToScalar(fBitmap.width() + 4),
165e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org                                         SkIntToScalar(fBitmap.height() + 4));
1667b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        // Test offsets on SrcMode (uses fixed-function blend)
167cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        SkAutoTUnref<SkImageFilter> foreground(SkBitmapSource::Create(fBitmap));
168cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        SkAutoTUnref<SkImageFilter> offsetForeground(SkOffsetImageFilter::Create(
169cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkIntToScalar(4), SkIntToScalar(-4), foreground));
170cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        SkAutoTUnref<SkImageFilter> offsetBackground(SkOffsetImageFilter::Create(
171cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkIntToScalar(4), SkIntToScalar(4), background));
1727b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        mode.reset(SkXfermode::Create(SkXfermode::kSrcOver_Mode));
173cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        filter.reset(SkXfermodeImageFilter::Create(mode, offsetBackground, offsetForeground));
1747b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        paint.setImageFilter(filter);
175e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        drawClippedPaint(canvas, clipRect, paint, x, y);
1767b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        x += fBitmap.width() + MARGIN;
1777b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        if (x + fBitmap.width() > WIDTH) {
1787b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org            x = 0;
1797b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org            y += fBitmap.height() + MARGIN;
1807b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        }
1817b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        // Test offsets on Darken (uses shader blend)
1827b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        mode.reset(SkXfermode::Create(SkXfermode::kDarken_Mode));
183cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        filter.reset(SkXfermodeImageFilter::Create(mode, offsetBackground, offsetForeground));
1847b320703d47ff2b242ae74faba5e4b0af3560d71commit-bot@chromium.org        paint.setImageFilter(filter);
185e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org        drawClippedPaint(canvas, clipRect, paint, x, y);
1861a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        x += fBitmap.width() + MARGIN;
1871a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        if (x + fBitmap.width() > WIDTH) {
1881a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            x = 0;
1891a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            y += fBitmap.height() + MARGIN;
1901a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        }
1911a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        // Test cropping
1921a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        static const size_t nbSamples = 3;
1931a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        SkXfermode::Mode sampledModes[nbSamples] = {SkXfermode::kOverlay_Mode,
1941a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org                                                    SkXfermode::kSrcOver_Mode,
1951a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org                                                    SkXfermode::kPlus_Mode};
1961a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        int offsets[nbSamples][4] = {{ 10,  10, -16, -16},
1971a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org                                     { 10,  10,  10,  10},
1981a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org                                     {-10, -10,  -6,  -6}};
1991a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        for (size_t i = 0; i < nbSamples; ++i) {
200e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org            SkIRect cropRect = SkIRect::MakeXYWH(offsets[i][0],
201e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org                                                 offsets[i][1],
2021a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org                                                 fBitmap.width()  + offsets[i][2],
2031a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org                                                 fBitmap.height() + offsets[i][3]);
204b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org            SkImageFilter::CropRect rect(SkRect::Make(cropRect));
2051a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            mode.reset(SkXfermode::Create(sampledModes[i]));
206cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            filter.reset(SkXfermodeImageFilter::Create(
207cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                    mode, offsetBackground, offsetForeground, &rect));
2081a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            paint.setImageFilter(filter);
209e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org            drawClippedPaint(canvas, clipRect, paint, x, y);
2101a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            x += fBitmap.width() + MARGIN;
2111a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            if (x + fBitmap.width() > WIDTH) {
2121a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org                x = 0;
2131a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org                y += fBitmap.height() + MARGIN;
2141a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            }
2151a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        }
21686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    }
21786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.orgprivate:
21886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    SkBitmap fBitmap, fCheckerboard;
219e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.org    typedef GM INHERITED;
22086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org};
22186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
22286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org//////////////////////////////////////////////////////////////////////////////
22386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
224e93e1dbf0eced1e1b9aeed7c0c170961e2d61e32senorblanco@chromium.orgDEF_GM( return new XfermodeImageFilterGM; );
22586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
22686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org}
227