1118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org/* 2118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org * Copyright 2014 Google Inc. 3118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org * 4118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be 5118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org * found in the LICENSE file. 6118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org */ 7118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 8118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "gm.h" 9118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkCanvas.h" 10118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkColorFilter.h" 11118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkColorPriv.h" 12118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkShader.h" 13118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 14118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkBitmapSource.h" 15118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkBlurImageFilter.h" 16118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkColorMatrixFilter.h" 17118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkDisplacementMapEffect.h" 18118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkDropShadowImageFilter.h" 19118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkGradientShader.h" 20118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkMorphologyImageFilter.h" 21118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkColorFilterImageFilter.h" 22118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkMergeImageFilter.h" 23118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkOffsetImageFilter.h" 24118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 25118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org/////////////////////////////////////////////////////////////////////////////// 26118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 27118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.orgclass ImageFiltersCropExpandGM : public skiagm::GM { 28118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.orgpublic: 29118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org ImageFiltersCropExpandGM () {} 30118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 31118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.orgprotected: 32118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 33118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org virtual SkString onShortName() { 34118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org return SkString("imagefilterscropexpand"); 35118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org } 36118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 37118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org virtual SkISize onISize() { return SkISize::Make(570, 650); } 38118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 39118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org void make_checkerboard(SkBitmap* bitmap) { 40118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org bitmap->allocN32Pixels(64, 64); 41118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkCanvas canvas(*bitmap); 42118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas.clear(0xFFFF0000); 43118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkPaint darkPaint; 44118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org darkPaint.setColor(0xFF404040); 45118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkPaint lightPaint; 46118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org lightPaint.setColor(0xFFA0A0A0); 47118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org for (int y = 8; y < 48; y += 16) { 48118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org for (int x = 8; x < 48; x += 16) { 49118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas.save(); 50118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas.translate(SkIntToScalar(x), SkIntToScalar(y)); 51118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint); 52118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint); 53118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint); 54118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint); 55118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas.restore(); 56118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org } 57118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org } 58118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org } 59118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 60118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org void make_gradient_circle(int width, int height, SkBitmap* bitmap) { 61118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkScalar x = SkIntToScalar(width / 2); 62118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkScalar y = SkIntToScalar(height / 2); 63118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkScalar radius = SkMinScalar(x, y) * 0.8f; 64118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org bitmap->allocN32Pixels(width, height); 65118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkCanvas canvas(*bitmap); 66118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas.clear(0x00000000); 67118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkColor colors[2]; 68118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org colors[0] = SK_ColorWHITE; 69118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org colors[1] = SK_ColorBLACK; 70118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkAutoTUnref<SkShader> shader( 71118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkGradientShader::CreateRadial(SkPoint::Make(x, y), radius, colors, NULL, 2, 72118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkShader::kClamp_TileMode) 73118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org ); 74118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkPaint paint; 75118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org paint.setShader(shader); 76118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas.drawCircle(x, y, radius, paint); 77118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org } 78118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 79118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org static void draw(SkCanvas* canvas, const SkBitmap& bitmap, const SkRect& rect, SkImageFilter* filter) { 80118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkPaint paint; 81118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org paint.setImageFilter(filter)->unref(); 82118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas->saveLayer(&rect, &paint); 83118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas->drawBitmap(bitmap, 0, 0); 84118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas->restore(); 85f0f9f5f904a3f9a5c0e42ea19dafe6ae3c2ef8d0skia.committer@gmail.com 86118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkPaint strokePaint; 87118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org strokePaint.setColor(0xFFFF0000); 88118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org strokePaint.setStyle(SkPaint::kStroke_Style); 89118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas->drawRect(rect, strokePaint); 90118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 91118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas->translate(SkIntToScalar(80), 0); 92118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org } 93118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 94118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org virtual void onDraw(SkCanvas* canvas) { 95118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkAutoTUnref<SkColorFilter> cf( 96118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkColorFilter::CreateModeFilter(SK_ColorBLUE, SkXfermode::kSrcIn_Mode)); 97118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkImageFilter::CropRect crop_rect( 98118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkRect::Make(SkIRect::MakeXYWH(10, 10, 44, 44)), 99118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkImageFilter::CropRect::kHasAll_CropEdge); 100118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 101118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkBitmap gradient_circle, checkerboard; 102118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org make_gradient_circle(64, 64, &gradient_circle); 103118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org make_checkerboard(&checkerboard); 104118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 105118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkAutoTUnref<SkImageFilter> gradient_circle_source( 106118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkBitmapSource::Create(gradient_circle)); 107118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkAutoTUnref<SkImageFilter> noop_cropped( 108118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkOffsetImageFilter::Create(0, 0, NULL, &crop_rect)); 109118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkScalar sk255 = SkIntToScalar(255); 110118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkScalar matrix[20] = { 1, 0, 0, 0, 0, 111118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 0, 1, 0, 0, sk255, 112118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 0, 0, 1, 0, 0, 113118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 0, 0, 0, 0, sk255 }; 114118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkAutoTUnref<SkColorFilter> cf_alpha_trans(SkColorMatrixFilter::Create(matrix)); 115118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 116118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64)); 117118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkScalar MARGIN = SkIntToScalar(12); 118118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 119118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkIRect bounds; 120118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org r.roundOut(&bounds); 121118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 122118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkPaint paint; 123118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas->translate(MARGIN, MARGIN); 124118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org for (int outset = -15; outset <= 20; outset += 5) { 125118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas->save(); 126118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkRect rect = crop_rect.rect(); 127118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org rect.outset(SkIntToScalar(outset), 128118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkIntToScalar(outset)); 129118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkImageFilter::CropRect big_rect(rect, SkImageFilter::CropRect::kHasAll_CropEdge); 130f0f9f5f904a3f9a5c0e42ea19dafe6ae3c2ef8d0skia.committer@gmail.com 131118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org draw(canvas, checkerboard, rect, SkColorFilterImageFilter::Create( 132118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org cf_alpha_trans, noop_cropped.get(), &big_rect)); 133118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 134118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org draw(canvas, checkerboard, rect, SkBlurImageFilter::Create( 135118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 8.0f, 8.0f, noop_cropped.get(), &big_rect)); 136118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 137118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org draw(canvas, checkerboard, rect, SkDilateImageFilter::Create( 138118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 2, 2, noop_cropped.get(), &big_rect)); 139118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 140118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org draw(canvas, checkerboard, rect, SkErodeImageFilter::Create( 141118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 2, 2, noop_cropped.get(), &big_rect)); 142118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 143118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org draw(canvas, checkerboard, rect, SkDropShadowImageFilter::Create( 144118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkIntToScalar(10), SkIntToScalar(10), SkIntToScalar(3), SkIntToScalar(3), 145118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SK_ColorBLUE, noop_cropped.get(), &big_rect)); 146118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 147118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org draw(canvas, checkerboard, rect, SkDisplacementMapEffect::Create( 148118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkDisplacementMapEffect::kR_ChannelSelectorType, 149118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkDisplacementMapEffect::kR_ChannelSelectorType, 150118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkIntToScalar(12), 151118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org gradient_circle_source.get(), 152118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org noop_cropped.get(), 153118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org &big_rect)); 154118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 155118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org draw(canvas, checkerboard, rect, SkOffsetImageFilter::Create( 156118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org SkIntToScalar(-8), SkIntToScalar(16), noop_cropped.get(), &big_rect)); 157118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 158118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas->restore(); 159118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org canvas->translate(0, SkIntToScalar(80)); 160118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org } 161118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org } 162118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 163118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.orgprivate: 164118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org typedef GM INHERITED; 165118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org}; 166118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 167118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org/////////////////////////////////////////////////////////////////////////////// 168118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org 169118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.orgstatic skiagm::GM* MyFactory(void*) { return new ImageFiltersCropExpandGM; } 170118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.orgstatic skiagm::GMRegistry reg(MyFactory); 171