imagefiltersclipped.cpp revision 549c8991959333e5c0f53faebcbbd5d6bc8f6a56
1c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org/* 2c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org * Copyright 2014 Google Inc. 3c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org * 4c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be 5c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org * found in the LICENSE file. 6c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org */ 7c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 8b0cce2c1d37d4bf5b89da6c70062209ac4e0e643halcanary#include "sk_tool_utils.h" 9c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkBlurImageFilter.h" 10878fa0204bc246ec5fbaca4aa3c81aaefccc30a1halcanary#include "SkColor.h" 11c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkDisplacementMapEffect.h" 12c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkDropShadowImageFilter.h" 13c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkGradientShader.h" 145598b63cd2443a608a74a222d0206bb2455383b7fmalita#include "SkImage.h" 155598b63cd2443a608a74a222d0206bb2455383b7fmalita#include "SkImageSource.h" 167b7ecfc046f7ec810482266db3430d1358b7a5bfsenorblanco#include "SkLightingImageFilter.h" 17c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkMorphologyImageFilter.h" 18c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkOffsetImageFilter.h" 1977b6ba3b6e23b84a3a4f3a62812e4a9eb6de4c23ajuma#include "SkPaintImageFilter.h" 2047d98c8e85924effc651b09df72027e6801c92a1senorblanco@chromium.org#include "SkPerlinNoiseShader.h" 217b7ecfc046f7ec810482266db3430d1358b7a5bfsenorblanco#include "SkPoint3.h" 22c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkScalar.h" 235598b63cd2443a608a74a222d0206bb2455383b7fmalita#include "SkSurface.h" 24878fa0204bc246ec5fbaca4aa3c81aaefccc30a1halcanary#include "gm.h" 25c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 26897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org#define RESIZE_FACTOR_X SkIntToScalar(2) 27897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org#define RESIZE_FACTOR_Y SkIntToScalar(5) 28897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org 29549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillipsstatic sk_sp<SkImage> make_gradient_circle(int width, int height) { 30549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips SkScalar x = SkIntToScalar(width / 2); 31549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips SkScalar y = SkIntToScalar(height / 2); 32549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips SkScalar radius = SkMinScalar(x, y) * 0.8f; 33549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips auto surface(SkSurface::MakeRasterN32Premul(width, height)); 34549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips SkCanvas* canvas = surface->getCanvas(); 35549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips canvas->clear(0x00000000); 36549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips SkColor colors[2]; 37549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips colors[0] = SK_ColorWHITE; 38549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips colors[1] = SK_ColorBLACK; 39549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips SkPaint paint; 40549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips paint.setShader(SkGradientShader::MakeRadial(SkPoint::Make(x, y), radius, colors, nullptr, 41549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips 2, SkShader::kClamp_TileMode)); 42549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips canvas->drawCircle(x, y, radius, paint); 43549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips return surface->makeImageSnapshot(); 44549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips} 45549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips 46549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillipsstatic void draw_clipped_filter(SkCanvas* canvas, SkImageFilter* filter, size_t i, 47549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips const SkRect& primBounds, const SkRect& clipBounds) { 48549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips SkPaint paint; 49549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips paint.setColor(SK_ColorWHITE); 50549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips paint.setImageFilter(filter); 51549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips paint.setAntiAlias(true); 52549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips canvas->save(); 53549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips canvas->clipRect(clipBounds); 54549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips if (5 == i) { 55549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips canvas->translate(SkIntToScalar(16), SkIntToScalar(-32)); 56549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips } else if (6 == i) { 57549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips canvas->scale(SkScalarInvert(RESIZE_FACTOR_X), SkScalarInvert(RESIZE_FACTOR_Y)); 58549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips } 59549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips canvas->drawCircle(primBounds.centerX(), primBounds.centerY(), 60549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips primBounds.width() * 2 / 5, paint); 61549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips canvas->restore(); 62549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips} 63549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips 64c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgnamespace skiagm { 65c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 66c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgclass ImageFiltersClippedGM : public GM { 67c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgpublic: 68943a462fef57832e2683894bb9f2f36ac25d98f7robertphillips ImageFiltersClippedGM() { 69c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org this->setBGColor(0x00000000); 70c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 71c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 72c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgprotected: 7336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkString onShortName() override { 74c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org return SkString("imagefiltersclipped"); 75c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 76c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 7736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkISize onISize() override { 78f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina return SkISize::Make(860, 500); 79c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 80c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 81943a462fef57832e2683894bb9f2f36ac25d98f7robertphillips void onOnceBeforeDraw() override { 829ce9d6772df650ceb0511f275e1a83dffa78ff72reed fCheckerboard = SkImage::MakeFromBitmap 839ce9d6772df650ceb0511f275e1a83dffa78ff72reed (sk_tool_utils::create_checkerboard_bitmap(64, 64, 0xFFA0A0A0, 0xFF404040, 8)); 84549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips fGradientCircle = make_gradient_circle(64, 64); 85943a462fef57832e2683894bb9f2f36ac25d98f7robertphillips } 86878fa0204bc246ec5fbaca4aa3c81aaefccc30a1halcanary 87943a462fef57832e2683894bb9f2f36ac25d98f7robertphillips void onDraw(SkCanvas* canvas) override { 8816b254a200f63e85041cac9a283ff0ff14d94ba1senorblanco canvas->clear(SK_ColorBLACK); 89c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 90549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips sk_sp<SkImageFilter> gradient(SkImageSource::Make(fGradientCircle)); 91549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips sk_sp<SkImageFilter> checkerboard(SkImageSource::Make(fCheckerboard)); 92fd0ec2c76a27ce26a62da23eb75017839959e7cbsenorblanco@chromium.org SkMatrix resizeMatrix; 93fd0ec2c76a27ce26a62da23eb75017839959e7cbsenorblanco@chromium.org resizeMatrix.setScale(RESIZE_FACTOR_X, RESIZE_FACTOR_Y); 947b7ecfc046f7ec810482266db3430d1358b7a5bfsenorblanco SkPoint3 pointLocation = SkPoint3::Make(32, 32, SkIntToScalar(10)); 95c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 96c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkImageFilter* filters[] = { 97cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkBlurImageFilter::Create(SkIntToScalar(12), SkIntToScalar(12)), 98bc9845bb60cd883e7ddabb21f04997602145a1adsenorblanco SkDropShadowImageFilter::Create(SkIntToScalar(10), SkIntToScalar(10), 99234f036b3e731e06e616c5291157d3bb4fbfdee2sugoi SkIntToScalar(3), SkIntToScalar(3), SK_ColorGREEN, 100234f036b3e731e06e616c5291157d3bb4fbfdee2sugoi SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode), 101cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkDisplacementMapEffect::Create(SkDisplacementMapEffect::kR_ChannelSelectorType, 102cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkDisplacementMapEffect::kR_ChannelSelectorType, 103cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkIntToScalar(12), 104cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org gradient.get(), 105cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org checkerboard.get()), 106cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkDilateImageFilter::Create(2, 2, checkerboard.get()), 107cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkErodeImageFilter::Create(2, 2, checkerboard.get()), 10851a315eff9b86bd60e7884240c4efc199129d37arobertphillips SkOffsetImageFilter::Make(SkIntToScalar(-16), 10951a315eff9b86bd60e7884240c4efc199129d37arobertphillips SkIntToScalar(32), 11051a315eff9b86bd60e7884240c4efc199129d37arobertphillips nullptr).release(), 1118c874eee943bdea0fab5b4d2707083c863e37c55senorblanco SkImageFilter::CreateMatrixFilter(resizeMatrix, kNone_SkFilterQuality), 112549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips SkLightingImageFilter::CreatePointLitDiffuse(pointLocation, SK_ColorWHITE, SK_Scalar1, 113549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips SkIntToScalar(2), checkerboard.get()), 1147b7ecfc046f7ec810482266db3430d1358b7a5bfsenorblanco 115c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org }; 116c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 117c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64)); 118c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkScalar margin = SkIntToScalar(16); 119c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkRect bounds = r; 120c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org bounds.outset(margin, margin); 121c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 12202781977e00d88a7b0a3bbd6de158a9f3fecfd46jvanverth canvas->save(); 123c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org for (int xOffset = 0; xOffset < 80; xOffset += 16) { 124c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->save(); 125c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org bounds.fLeft = SkIntToScalar(xOffset); 126c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { 12702781977e00d88a7b0a3bbd6de158a9f3fecfd46jvanverth draw_clipped_filter(canvas, filters[i], i, r, bounds); 128c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->translate(r.width() + margin, 0); 129c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 130c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->restore(); 131c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->translate(0, r.height() + margin); 132c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 13302781977e00d88a7b0a3bbd6de158a9f3fecfd46jvanverth canvas->restore(); 13467117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org 13567117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { 13667117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org SkSafeUnref(filters[i]); 13767117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org } 13802781977e00d88a7b0a3bbd6de158a9f3fecfd46jvanverth 13977b6ba3b6e23b84a3a4f3a62812e4a9eb6de4c23ajuma SkPaint noisePaint; 140549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips noisePaint.setShader(SkPerlinNoiseShader::MakeFractalNoise(0.1f, 0.05f, 1, 0)); 141549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips 142372177ee115d46dfb5bfb881a408e6c37ae83678robertphillips sk_sp<SkImageFilter> rectFilter(SkPaintImageFilter::Make(noisePaint)); 14302781977e00d88a7b0a3bbd6de158a9f3fecfd46jvanverth canvas->translate(SK_ARRAY_COUNT(filters)*(r.width() + margin), 0); 14402781977e00d88a7b0a3bbd6de158a9f3fecfd46jvanverth for (int xOffset = 0; xOffset < 80; xOffset += 16) { 14502781977e00d88a7b0a3bbd6de158a9f3fecfd46jvanverth bounds.fLeft = SkIntToScalar(xOffset); 146372177ee115d46dfb5bfb881a408e6c37ae83678robertphillips draw_clipped_filter(canvas, rectFilter.get(), 0, r, bounds); 14702781977e00d88a7b0a3bbd6de158a9f3fecfd46jvanverth canvas->translate(0, r.height() + margin); 14802781977e00d88a7b0a3bbd6de158a9f3fecfd46jvanverth } 149c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 150c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 151c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgprivate: 1529ce9d6772df650ceb0511f275e1a83dffa78ff72reed sk_sp<SkImage> fCheckerboard, fGradientCircle; 153943a462fef57832e2683894bb9f2f36ac25d98f7robertphillips 154c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org typedef GM INHERITED; 155c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org}; 156c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 157c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org////////////////////////////////////////////////////////////////////////////// 158c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 159943a462fef57832e2683894bb9f2f36ac25d98f7robertphillipsDEF_GM(return new ImageFiltersClippedGM;) 160c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org} 161