xfermodeimagefilter.cpp revision b0cce2c1d37d4bf5b89da6c70062209ac4e0e643
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: 2872c9faab45124e08c85f70ca38536914862d947cmtklein SkString onShortName() SK_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 4572c9faab45124e08c85f70ca38536914862d947cmtklein SkISize onISize() SK_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 6872c9faab45124e08c85f70ca38536914862d947cmtklein void onOnceBeforeDraw() SK_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 7672c9faab45124e08c85f70ca38536914862d947cmtklein void onDraw(SkCanvas* canvas) SK_OVERRIDE { 7786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org canvas->clear(0x00000000); 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