11a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org/* 21a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org * Copyright 2013 Google Inc. 31a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org * 41a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 51a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org * found in the LICENSE file. 61a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org */ 71a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org 81a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org#include "gm.h" 91a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org#include "SkOffsetImageFilter.h" 101a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org#include "SkBitmapSource.h" 111a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org 12e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org#define WIDTH 600 131a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org#define HEIGHT 100 141a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org#define MARGIN 12 151a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org 161a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.orgnamespace skiagm { 171a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org 181a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.orgclass OffsetImageFilterGM : public GM { 191a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.orgpublic: 201a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org OffsetImageFilterGM() : fInitialized(false) { 211a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org this->setBGColor(0xFF000000); 221a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org } 231a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org 241a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.orgprotected: 251a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org virtual SkString onShortName() { 261a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org return SkString("offsetimagefilter"); 271a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org } 281a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org 291a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org void make_bitmap() { 30eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com fBitmap.allocN32Pixels(80, 80); 31c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org SkCanvas canvas(fBitmap); 321a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org canvas.clear(0x00000000); 331a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org SkPaint paint; 341a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org paint.setAntiAlias(true); 35992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark sk_tool_utils::set_portable_typeface(&paint); 361a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org paint.setColor(0xD000D000); 371a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org paint.setTextSize(SkIntToScalar(96)); 381a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org const char* str = "e"; 391a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org canvas.drawText(str, strlen(str), SkIntToScalar(15), SkIntToScalar(65), paint); 401a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org } 411a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org 421a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org void make_checkerboard() { 43c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org fCheckerboard.allocN32Pixels(80, 80); 44c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org SkCanvas canvas(fCheckerboard); 451a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org canvas.clear(0x00000000); 461a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org SkPaint darkPaint; 471a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org darkPaint.setColor(0xFF404040); 481a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org SkPaint lightPaint; 491a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org lightPaint.setColor(0xFFA0A0A0); 501a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org for (int y = 0; y < 80; y += 16) { 511a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org for (int x = 0; x < 80; x += 16) { 521a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org canvas.save(); 531a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org canvas.translate(SkIntToScalar(x), SkIntToScalar(y)); 541a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint); 551a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint); 561a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint); 571a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint); 581a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org canvas.restore(); 591a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org } 601a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org } 611a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org } 621a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org 631a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org virtual SkISize onISize() { 64f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina return SkISize::Make(WIDTH, HEIGHT); 651a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org } 661a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org 67e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org void drawClippedBitmap(SkCanvas* canvas, const SkBitmap& bitmap, const SkPaint& paint, SkScalar scale, const SkIRect& cropRect) { 681a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org canvas->save(); 69e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org SkRect clipRect = SkRect::MakeWH( 70e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.height())); 71e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org canvas->clipRect(clipRect); 72e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org canvas->scale(scale, scale); 736776b82d466fa93ccffd251fdf556fe058395444senorblanco@chromium.org canvas->drawBitmap(bitmap, 0, 0, &paint); 741a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org canvas->restore(); 75e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org SkPaint strokePaint; 76e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org strokePaint.setStyle(SkPaint::kStroke_Style); 77e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org strokePaint.setColor(SK_ColorRED); 78e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org 79e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org // Draw a boundary rect around the intersection of the clip rect 80e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org // and crop rect. 81e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org SkMatrix scaleMatrix; 82e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org scaleMatrix.setScale(scale, scale); 83e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org SkRect cropRectFloat; 84e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org scaleMatrix.mapRect(&cropRectFloat, SkRect::Make(cropRect)); 85e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org clipRect.intersect(cropRectFloat); 86e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org canvas->drawRect(clipRect, strokePaint); 871a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org } 881a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org 891a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org virtual void onDraw(SkCanvas* canvas) { 901a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org if (!fInitialized) { 911a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org make_bitmap(); 921a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org make_checkerboard(); 931a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org fInitialized = true; 941a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org } 951a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org canvas->clear(0x00000000); 961a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org SkPaint paint; 971a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org 987fa2a65c0cfc714364490cb715171461143024e0reed@google.com for (int i = 0; i < 4; i++) { 991a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org SkBitmap* bitmap = (i & 0x01) ? &fCheckerboard : &fBitmap; 1006776b82d466fa93ccffd251fdf556fe058395444senorblanco@chromium.org SkIRect cropRect = SkIRect::MakeXYWH(i * 12, 1016776b82d466fa93ccffd251fdf556fe058395444senorblanco@chromium.org i * 8, 1021a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org bitmap->width() - i * 8, 1031a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org bitmap->height() - i * 12); 104b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org SkImageFilter::CropRect rect(SkRect::Make(cropRect)); 105cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkAutoTUnref<SkImageFilter> tileInput(SkBitmapSource::Create(*bitmap)); 1061a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org SkScalar dx = SkIntToScalar(i*5); 1071a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org SkScalar dy = SkIntToScalar(i*10); 108cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkAutoTUnref<SkImageFilter> filter( 109cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkOffsetImageFilter::Create(dx, dy, tileInput, &rect)); 1101a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org paint.setImageFilter(filter); 111e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org drawClippedBitmap(canvas, *bitmap, paint, SK_Scalar1, cropRect); 112e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org canvas->translate(SkIntToScalar(bitmap->width() + MARGIN), 0); 1131a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org } 114e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org 115e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org SkIRect cropRect = SkIRect::MakeXYWH(0, 0, 100, 100); 116e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org SkImageFilter::CropRect rect(SkRect::Make(cropRect)); 117cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkAutoTUnref<SkImageFilter> filter( 118cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkOffsetImageFilter::Create(SkIntToScalar(-5), SkIntToScalar(-10), NULL, &rect)); 119e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org paint.setImageFilter(filter); 120e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org drawClippedBitmap(canvas, fBitmap, paint, SkIntToScalar(2), cropRect); 1211a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org } 1221a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.orgprivate: 1231a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org typedef GM INHERITED; 1241a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org SkBitmap fBitmap, fCheckerboard; 1251a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org bool fInitialized; 1261a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org}; 1271a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org 1281a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 1291a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org 1301a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.orgstatic GM* MyFactory(void*) { return new OffsetImageFilterGM; } 1311a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.orgstatic GMRegistry reg(MyFactory); 1321a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org 1331a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org} 134