1d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org/* 2d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org * Copyright 2013 Google Inc. 3d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org * 4d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be 5d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org * found in the LICENSE file. 6d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org */ 7d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 8d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org#include "gm.h" 9d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org#include "SkColorFilter.h" 10d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 11d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org#include "SkColorFilterImageFilter.h" 12d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org#include "SkDropShadowImageFilter.h" 13d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 14d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org/////////////////////////////////////////////////////////////////////////////// 15d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 16d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgstatic void draw_paint(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { 17d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkPaint paint; 18d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org paint.setImageFilter(imf); 19d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org paint.setColor(SK_ColorBLACK); 20d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->save(); 21d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->clipRect(r); 22d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->drawPaint(paint); 23d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->restore(); 24d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org} 25d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 26d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgstatic void draw_path(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { 27d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkPaint paint; 28d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org paint.setColor(SK_ColorGREEN); 29d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org paint.setImageFilter(imf); 30d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org paint.setAntiAlias(true); 31d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->save(); 32d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->clipRect(r); 33d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->drawCircle(r.centerX(), r.centerY(), r.width()/3, paint); 34d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->restore(); 35d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org} 36d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 37d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgstatic void draw_text(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { 38d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkPaint paint; 39d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org paint.setImageFilter(imf); 40d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org paint.setColor(SK_ColorGREEN); 41d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org paint.setAntiAlias(true); 42d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org paint.setTextSize(r.height()/2); 43d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org paint.setTextAlign(SkPaint::kCenter_Align); 44d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->save(); 45d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->clipRect(r); 46d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->drawText("Text", 4, r.centerX(), r.centerY(), paint); 47d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->restore(); 48d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org} 49d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 50d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgstatic void draw_bitmap(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { 51d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkPaint paint; 52d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 53d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkIRect bounds; 54d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org r.roundOut(&bounds); 55d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 56d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkBitmap bm; 57eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com bm.allocN32Pixels(bounds.width(), bounds.height()); 58d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org bm.eraseColor(SK_ColorTRANSPARENT); 59d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkCanvas c(bm); 60d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org draw_path(&c, r, NULL); 61d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 62d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org paint.setImageFilter(imf); 63d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->save(); 64d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->clipRect(r); 65d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->drawBitmap(bm, 0, 0, &paint); 66d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->restore(); 67d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org} 68d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 69d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgstatic void draw_sprite(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { 70d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkPaint paint; 71d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 72d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkIRect bounds; 73d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org r.roundOut(&bounds); 74d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 75d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkBitmap bm; 76eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com bm.allocN32Pixels(bounds.width(), bounds.height()); 77d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org bm.eraseColor(SK_ColorRED); 78d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkCanvas c(bm); 79d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 80d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkIRect cropRect = SkIRect::MakeXYWH(10, 10, 44, 44); 81d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org paint.setColor(SK_ColorGREEN); 82d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org c.drawRect(SkRect::Make(cropRect), paint); 83d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 84d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org paint.setImageFilter(imf); 85d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkPoint loc = { r.fLeft, r.fTop }; 86d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->getTotalMatrix().mapPoints(&loc, 1); 87d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->drawSprite(bm, 88d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkScalarRoundToInt(loc.fX), SkScalarRoundToInt(loc.fY), 89d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org &paint); 90d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org} 91d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 92d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org/////////////////////////////////////////////////////////////////////////////// 93d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 94d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgclass DropShadowImageFilterGM : public skiagm::GM { 95d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgpublic: 96d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org DropShadowImageFilterGM () {} 97d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 98d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgprotected: 99d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 100d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org virtual SkString onShortName() { 101d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org return SkString("dropshadowimagefilter"); 102d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org } 103d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 104d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org virtual SkISize onISize() { return SkISize::Make(400, 700); } 105d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 106d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org void draw_frame(SkCanvas* canvas, const SkRect& r) { 107d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkPaint paint; 108d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org paint.setStyle(SkPaint::kStroke_Style); 109d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org paint.setColor(SK_ColorRED); 110d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->drawRect(r, paint); 111d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org } 112d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 113d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org virtual uint32_t onGetFlags() const { 114d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org // Because of the use of drawSprite, this test is excluded 115d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org // from scaled replay tests because drawSprite ignores the 116d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org // reciprocal scale that is applied at record time, which is 117d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org // the intended behavior of drawSprite. 118a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipScaledReplay_Flag | kSkipTiled_Flag; 119d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org } 120d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 121d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org virtual void onDraw(SkCanvas* canvas) { 122d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org void (*drawProc[])(SkCanvas*, const SkRect&, SkImageFilter*) = { 123d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org draw_sprite, draw_bitmap, draw_path, draw_paint, draw_text 124d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org }; 125d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 126d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkAutoTUnref<SkColorFilter> cf( 127d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkColorFilter::CreateModeFilter(SK_ColorMAGENTA, SkXfermode::kSrcIn_Mode)); 128d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkAutoTUnref<SkImageFilter> cfif(SkColorFilterImageFilter::Create(cf.get())); 129d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkImageFilter::CropRect cropRect(SkRect::Make(SkIRect::MakeXYWH(10, 10, 44, 44)), 130d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkImageFilter::CropRect::kHasAll_CropEdge); 131d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkImageFilter::CropRect bogusRect(SkRect::Make(SkIRect::MakeXYWH(-100, -100, 10, 10)), 132d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkImageFilter::CropRect::kHasAll_CropEdge); 133d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 134d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkImageFilter* filters[] = { 135d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org NULL, 136cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkDropShadowImageFilter::Create(7.0f, 0.0f, 0.0f, 3.0f, SK_ColorBLUE), 137cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkDropShadowImageFilter::Create(0.0f, 7.0f, 3.0f, 0.0f, SK_ColorBLUE), 138cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkDropShadowImageFilter::Create(7.0f, 7.0f, 3.0f, 3.0f, SK_ColorBLUE), 139cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkDropShadowImageFilter::Create(7.0f, 7.0f, 3.0f, 3.0f, SK_ColorBLUE, cfif), 140cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkDropShadowImageFilter::Create(7.0f, 7.0f, 3.0f, 3.0f, SK_ColorBLUE, NULL, &cropRect), 141cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkDropShadowImageFilter::Create(7.0f, 7.0f, 3.0f, 3.0f, SK_ColorBLUE, NULL, &bogusRect), 142d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org }; 143d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 144d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64)); 145d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkScalar MARGIN = SkIntToScalar(16); 146d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkScalar DX = r.width() + MARGIN; 147d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkScalar DY = r.height() + MARGIN; 148d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 149d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->translate(MARGIN, MARGIN); 150d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org for (size_t j = 0; j < SK_ARRAY_COUNT(drawProc); ++j) { 151d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->save(); 152d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { 153d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org drawProc[j](canvas, r, filters[i]); 154d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->translate(0, DY); 155d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org } 156d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->restore(); 157d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org canvas->translate(DX, 0); 158d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org } 159d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 160d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org for(size_t j = 0; j < SK_ARRAY_COUNT(filters); ++j) { 161d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org SkSafeUnref(filters[j]); 162d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org } 163d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org } 164d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 165d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgprivate: 166d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org typedef GM INHERITED; 167d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org}; 168d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 169d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org/////////////////////////////////////////////////////////////////////////////// 170d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org 171d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgstatic skiagm::GM* MyFactory(void*) { return new DropShadowImageFilterGM; } 172d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgstatic skiagm::GMRegistry reg(MyFactory); 173