imagefiltersclipped.cpp revision 67117808ee73bee5454442af75e7d8ebdbfd00e3
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 8c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "gm.h" 9c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkColor.h" 10c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkBitmapSource.h" 11c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkBlurImageFilter.h" 12c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkDisplacementMapEffect.h" 13c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkDropShadowImageFilter.h" 14c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkGradientShader.h" 15c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkMorphologyImageFilter.h" 16c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkOffsetImageFilter.h" 17c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkScalar.h" 18c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 19c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgnamespace skiagm { 20c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 21c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgclass ImageFiltersClippedGM : public GM { 22c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgpublic: 23c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org ImageFiltersClippedGM() : fInitialized(false) { 24c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org this->setBGColor(0x00000000); 25c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 26c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 27c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgprotected: 28c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org virtual SkString onShortName() { 29c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org return SkString("imagefiltersclipped"); 30c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 31c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 32c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org virtual SkISize onISize() { 33c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org return make_isize(860, 500); 34c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 35c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 36c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org void make_checkerboard() { 37c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org fCheckerboard.allocN32Pixels(64, 64); 38c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkBitmapDevice device(fCheckerboard); 39c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkCanvas canvas(&device); 40c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.clear(0x00000000); 41c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkPaint darkPaint; 42c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org darkPaint.setColor(0xFF404040); 43c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkPaint lightPaint; 44c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org lightPaint.setColor(0xFFA0A0A0); 45c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org for (int y = 0; y < 64; y += 16) { 46c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org for (int x = 0; x < 64; x += 16) { 47c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.save(); 48c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.translate(SkIntToScalar(x), SkIntToScalar(y)); 49c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint); 50c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint); 51c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint); 52c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint); 53c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.restore(); 54c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 55c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 56c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 57c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 58c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org void make_gradient_circle(int width, int height) { 59c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkScalar x = SkIntToScalar(width / 2); 60c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkScalar y = SkIntToScalar(height / 2); 61c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkScalar radius = SkScalarMul(SkMinScalar(x, y), SkIntToScalar(4) / SkIntToScalar(5)); 62c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org fGradientCircle.allocN32Pixels(width, height); 63c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkBitmapDevice device(fGradientCircle); 64c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkCanvas canvas(&device); 65c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.clear(0x00000000); 66c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkColor colors[2]; 67c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org colors[0] = SK_ColorWHITE; 68c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org colors[1] = SK_ColorBLACK; 69c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkAutoTUnref<SkShader> shader( 70c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkGradientShader::CreateRadial(SkPoint::Make(x, y), radius, colors, NULL, 2, 71c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkShader::kClamp_TileMode) 72c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org ); 73c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkPaint paint; 74c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org paint.setShader(shader); 75c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.drawCircle(x, y, radius, paint); 76c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 77c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 78c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org virtual void onDraw(SkCanvas* canvas) { 79c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org if (!fInitialized) { 80c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org this->make_checkerboard(); 81c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org this->make_gradient_circle(64, 64); 82c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org fInitialized = true; 83c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 84c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->clear(0x00000000); 85c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 86c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkAutoTUnref<SkImageFilter> gradient(new SkBitmapSource(fGradientCircle)); 87c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkAutoTUnref<SkImageFilter> checkerboard(new SkBitmapSource(fCheckerboard)); 88c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 89c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkImageFilter* filters[] = { 90c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org new SkBlurImageFilter(SkIntToScalar(12), SkIntToScalar(12)), 91c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org new SkDropShadowImageFilter(SkIntToScalar(10), SkIntToScalar(10), SkIntToScalar(3), 92c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SK_ColorGREEN), 93c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org new SkDisplacementMapEffect(SkDisplacementMapEffect::kR_ChannelSelectorType, 94c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkDisplacementMapEffect::kR_ChannelSelectorType, 95c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkIntToScalar(12), 96c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org gradient.get(), 97c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org checkerboard.get()), 98c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org new SkDilateImageFilter(2, 2, checkerboard.get()), 99c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org new SkErodeImageFilter(2, 2, checkerboard.get()), 100c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org new SkOffsetImageFilter(SkIntToScalar(-16), SkIntToScalar(32)), 101c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org }; 102c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 103c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64)); 104c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkScalar margin = SkIntToScalar(16); 105c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkRect bounds = r; 106c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org bounds.outset(margin, margin); 107c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 108c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org for (int xOffset = 0; xOffset < 80; xOffset += 16) { 109c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->save(); 110c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org bounds.fLeft = SkIntToScalar(xOffset); 111c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { 112c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkPaint paint; 113c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org paint.setColor(SK_ColorWHITE); 114c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org paint.setImageFilter(filters[i]); 115c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org paint.setAntiAlias(true); 116c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->save(); 117c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->clipRect(bounds); 118c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org if (i == 5) { 119c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->translate(SkIntToScalar(16), SkIntToScalar(-32)); 120c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 121c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->drawCircle(r.centerX(), r.centerY(), 122c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkScalarDiv(r.width()*2, SkIntToScalar(5)), paint); 123c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->restore(); 124c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->translate(r.width() + margin, 0); 125c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 126c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->restore(); 127c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->translate(0, r.height() + margin); 128c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 12967117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org 13067117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { 13167117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org SkSafeUnref(filters[i]); 13267117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org } 133c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 134c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 135c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgprivate: 136c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org bool fInitialized; 137c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkBitmap fCheckerboard; 138c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkBitmap fGradientCircle; 139c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org typedef GM INHERITED; 140c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org}; 141c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 142c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org////////////////////////////////////////////////////////////////////////////// 143c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 144c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgstatic GM* MyFactory(void*) { return new ImageFiltersClippedGM; } 145c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgstatic GMRegistry reg(MyFactory); 146c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 147c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org} 148