1194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org/* 2194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org * Copyright 2011 Google Inc. 3194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org * 4194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be 5194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org * found in the LICENSE file. 6194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org */ 7194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 8194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org#include "gm.h" 9194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org#include "SkCanvas.h" 10194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org#include "SkColorFilter.h" 11194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org#include "SkColorPriv.h" 12194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org#include "SkShader.h" 13194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 14194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org#include "SkBlurImageFilter.h" 15194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org#include "SkColorFilterImageFilter.h" 16962c8864e4cf0cfbaf8ea3d17eda83261733362asenorblanco@chromium.org#include "SkMergeImageFilter.h" 17962c8864e4cf0cfbaf8ea3d17eda83261733362asenorblanco@chromium.org#include "SkOffsetImageFilter.h" 18194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org#include "SkTestImageFilters.h" 19194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 20194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org/////////////////////////////////////////////////////////////////////////////// 21194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 22194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.orgstatic void draw_paint(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { 23194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkPaint paint; 24194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org paint.setImageFilter(imf); 25194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org paint.setColor(SK_ColorBLACK); 26194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->save(); 27194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->clipRect(r); 28194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->drawPaint(paint); 29194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->restore(); 30194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org} 31194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 32194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.orgstatic void draw_path(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { 33194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkPaint paint; 34194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org paint.setColor(SK_ColorMAGENTA); 35194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org paint.setImageFilter(imf); 36194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org paint.setAntiAlias(true); 37194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->save(); 38194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->clipRect(r); 39194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->drawCircle(r.centerX(), r.centerY(), r.width()*2/5, paint); 40194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->restore(); 41194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org} 42194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 43194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.orgstatic void draw_text(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { 44194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkPaint paint; 45194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org paint.setImageFilter(imf); 46194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org paint.setColor(SK_ColorGREEN); 47194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org paint.setAntiAlias(true); 48194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org paint.setTextSize(r.height()/2); 49194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org paint.setTextAlign(SkPaint::kCenter_Align); 50194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->save(); 51194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->clipRect(r); 52194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->drawText("Text", 4, r.centerX(), r.centerY(), paint); 53194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->restore(); 54194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org} 55194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 56194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.orgstatic void draw_bitmap(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { 57194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkPaint paint; 58194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 59194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkIRect bounds; 60194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org r.roundOut(&bounds); 61194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 62194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkBitmap bm; 63eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com bm.allocN32Pixels(bounds.width(), bounds.height()); 64194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org bm.eraseColor(SK_ColorTRANSPARENT); 65194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkCanvas c(bm); 66194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org draw_path(&c, r, NULL); 67194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 68194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org paint.setImageFilter(imf); 69194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->save(); 70194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->clipRect(r); 71194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->drawBitmap(bm, 0, 0, &paint); 72194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->restore(); 73194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org} 74194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 75194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.orgstatic void draw_sprite(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { 76194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkPaint paint; 77194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 78194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkIRect bounds; 79194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org r.roundOut(&bounds); 80194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 81194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkBitmap bm; 82eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com bm.allocN32Pixels(bounds.width(), bounds.height()); 83194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org bm.eraseColor(SK_ColorRED); 84194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkCanvas c(bm); 85194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 86194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkIRect cropRect = SkIRect::MakeXYWH(10, 10, 44, 44); 87194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org paint.setColor(SK_ColorGREEN); 88194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org c.drawRect(SkRect::Make(cropRect), paint); 89194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 90194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org paint.setImageFilter(imf); 91194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkPoint loc = { r.fLeft, r.fTop }; 92194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->getTotalMatrix().mapPoints(&loc, 1); 93194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->drawSprite(bm, 94194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkScalarRoundToInt(loc.fX), SkScalarRoundToInt(loc.fY), 95194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org &paint); 96194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org} 97194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 98194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org/////////////////////////////////////////////////////////////////////////////// 99194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 100194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.orgclass ImageFiltersCroppedGM : public skiagm::GM { 101194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.orgpublic: 102194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org ImageFiltersCroppedGM () {} 103194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 104194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.orgprotected: 105194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org virtual SkString onShortName() { 106194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org return SkString("imagefilterscropped"); 107194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org } 108194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 1097168ecc363f4f205c81c777e44cc6659f36e2821senorblanco@chromium.org virtual SkISize onISize() { return SkISize::Make(400, 640); } 110194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 111194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org void draw_frame(SkCanvas* canvas, const SkRect& r) { 112194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkPaint paint; 113194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org paint.setStyle(SkPaint::kStroke_Style); 114194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org paint.setColor(SK_ColorRED); 115194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->drawRect(r, paint); 116194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org } 117194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 118194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org virtual uint32_t onGetFlags() const { 119194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org // Because of the use of drawSprite, this test is excluded 120194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org // from scaled replay tests because drawSprite ignores the 121194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org // reciprocal scale that is applied at record time, which is 122194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org // the intended behavior of drawSprite. 123a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipScaledReplay_Flag | kSkipTiled_Flag; 124194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org } 125194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 126194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org virtual void onDraw(SkCanvas* canvas) { 127194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org void (*drawProc[])(SkCanvas*, const SkRect&, SkImageFilter*) = { 128194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org draw_sprite, draw_bitmap, draw_path, draw_paint, draw_text 129194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org }; 130194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 131962c8864e4cf0cfbaf8ea3d17eda83261733362asenorblanco@chromium.org SkAutoTUnref<SkColorFilter> cf( 132962c8864e4cf0cfbaf8ea3d17eda83261733362asenorblanco@chromium.org SkColorFilter::CreateModeFilter(SK_ColorBLUE, SkXfermode::kSrcIn_Mode)); 133b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org SkImageFilter::CropRect cropRect(SkRect::Make(SkIRect::MakeXYWH(10, 10, 44, 44)), SkImageFilter::CropRect::kHasAll_CropEdge); 134b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org SkImageFilter::CropRect bogusRect(SkRect::Make(SkIRect::MakeXYWH(-100, -100, 10, 10)), SkImageFilter::CropRect::kHasAll_CropEdge); 135194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 136cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkAutoTUnref<SkImageFilter> offset(SkOffsetImageFilter::Create( 137962c8864e4cf0cfbaf8ea3d17eda83261733362asenorblanco@chromium.org SkIntToScalar(-10), SkIntToScalar(-10))); 138962c8864e4cf0cfbaf8ea3d17eda83261733362asenorblanco@chromium.org 139962c8864e4cf0cfbaf8ea3d17eda83261733362asenorblanco@chromium.org SkAutoTUnref<SkImageFilter> cfOffset(SkColorFilterImageFilter::Create(cf.get(), offset.get())); 140962c8864e4cf0cfbaf8ea3d17eda83261733362asenorblanco@chromium.org 141194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkImageFilter* filters[] = { 142194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org NULL, 143962c8864e4cf0cfbaf8ea3d17eda83261733362asenorblanco@chromium.org SkColorFilterImageFilter::Create(cf.get(), NULL, &cropRect), 144cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkBlurImageFilter::Create(1.0f, 1.0f, NULL, &cropRect), 145cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkBlurImageFilter::Create(8.0f, 0.0f, NULL, &cropRect), 146cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkBlurImageFilter::Create(0.0f, 8.0f, NULL, &cropRect), 147cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkBlurImageFilter::Create(8.0f, 8.0f, NULL, &cropRect), 148cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkMergeImageFilter::Create(NULL, cfOffset.get(), SkXfermode::kSrcOver_Mode, &cropRect), 149cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkBlurImageFilter::Create(8.0f, 8.0f, NULL, &bogusRect), 150962c8864e4cf0cfbaf8ea3d17eda83261733362asenorblanco@chromium.org SkColorFilterImageFilter::Create(cf.get(), NULL, &bogusRect), 151194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org }; 152194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 153194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64)); 154194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkScalar MARGIN = SkIntToScalar(16); 155194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkScalar DX = r.width() + MARGIN; 156194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkScalar DY = r.height() + MARGIN; 157194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 158194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->translate(MARGIN, MARGIN); 1597168ecc363f4f205c81c777e44cc6659f36e2821senorblanco@chromium.org for (size_t j = 0; j < SK_ARRAY_COUNT(drawProc); ++j) { 160194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->save(); 1617168ecc363f4f205c81c777e44cc6659f36e2821senorblanco@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { 162194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org drawProc[j](canvas, r, filters[i]); 163194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->translate(0, DY); 164194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org } 165194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->restore(); 166194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org canvas->translate(DX, 0); 167194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org } 168194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 169194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org for(size_t j = 0; j < SK_ARRAY_COUNT(filters); ++j) { 170194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org SkSafeUnref(filters[j]); 171194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org } 172194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org } 173194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 174194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.orgprivate: 175194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org typedef GM INHERITED; 176194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org}; 177194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 178194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org/////////////////////////////////////////////////////////////////////////////// 179194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org 180194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.orgstatic skiagm::GM* MyFactory(void*) { return new ImageFiltersCroppedGM; } 181194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.orgstatic skiagm::GMRegistry reg(MyFactory); 182