imagefiltersclipped.cpp revision 897b73f62c012758bd8fef77c24d3573c847dbc3
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" 17897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org#include "SkResizeImageFilter.h" 18c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkScalar.h" 19c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 20897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org#define RESIZE_FACTOR_X SkIntToScalar(2) 21897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org#define RESIZE_FACTOR_Y SkIntToScalar(5) 22897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org 23c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgnamespace skiagm { 24c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 25c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgclass ImageFiltersClippedGM : public GM { 26c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgpublic: 27c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org ImageFiltersClippedGM() : fInitialized(false) { 28c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org this->setBGColor(0x00000000); 29c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 30c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 31c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgprotected: 32c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org virtual SkString onShortName() { 33c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org return SkString("imagefiltersclipped"); 34c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 35c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 36c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org virtual SkISize onISize() { 37c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org return make_isize(860, 500); 38c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 39c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 40c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org void make_checkerboard() { 41c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org fCheckerboard.allocN32Pixels(64, 64); 42c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org SkCanvas canvas(fCheckerboard); 43c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.clear(0x00000000); 44c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkPaint darkPaint; 45c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org darkPaint.setColor(0xFF404040); 46c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkPaint lightPaint; 47c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org lightPaint.setColor(0xFFA0A0A0); 48c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org for (int y = 0; y < 64; y += 16) { 49c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org for (int x = 0; x < 64; x += 16) { 50c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.save(); 51c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.translate(SkIntToScalar(x), SkIntToScalar(y)); 52c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint); 53c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint); 54c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint); 55c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint); 56c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.restore(); 57c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 58c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 59c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 60c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 61c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org void make_gradient_circle(int width, int height) { 62c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkScalar x = SkIntToScalar(width / 2); 63c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkScalar y = SkIntToScalar(height / 2); 64c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org SkScalar radius = SkMinScalar(x, y) * 0.8f; 65c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org fGradientCircle.allocN32Pixels(width, height); 66c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org SkCanvas canvas(fGradientCircle); 67c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.clear(0x00000000); 68c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkColor colors[2]; 69c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org colors[0] = SK_ColorWHITE; 70c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org colors[1] = SK_ColorBLACK; 71c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkAutoTUnref<SkShader> shader( 72c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkGradientShader::CreateRadial(SkPoint::Make(x, y), radius, colors, NULL, 2, 73c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkShader::kClamp_TileMode) 74c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org ); 75c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkPaint paint; 76c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org paint.setShader(shader); 77c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas.drawCircle(x, y, radius, paint); 78c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 79c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 80c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org virtual void onDraw(SkCanvas* canvas) { 81c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org if (!fInitialized) { 82c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org this->make_checkerboard(); 83c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org this->make_gradient_circle(64, 64); 84c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org fInitialized = true; 85c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 86c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->clear(0x00000000); 87c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 88c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkAutoTUnref<SkImageFilter> gradient(new SkBitmapSource(fGradientCircle)); 89c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkAutoTUnref<SkImageFilter> checkerboard(new SkBitmapSource(fCheckerboard)); 90c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 91c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkImageFilter* filters[] = { 92c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org new SkBlurImageFilter(SkIntToScalar(12), SkIntToScalar(12)), 93c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org new SkDropShadowImageFilter(SkIntToScalar(10), SkIntToScalar(10), SkIntToScalar(3), 94c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SK_ColorGREEN), 95c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org new SkDisplacementMapEffect(SkDisplacementMapEffect::kR_ChannelSelectorType, 96c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkDisplacementMapEffect::kR_ChannelSelectorType, 97c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkIntToScalar(12), 98c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org gradient.get(), 99c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org checkerboard.get()), 100c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org new SkDilateImageFilter(2, 2, checkerboard.get()), 101c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org new SkErodeImageFilter(2, 2, checkerboard.get()), 102c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org new SkOffsetImageFilter(SkIntToScalar(-16), SkIntToScalar(32)), 103897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org new SkResizeImageFilter(RESIZE_FACTOR_X, RESIZE_FACTOR_Y, SkPaint::kNone_FilterLevel), 104c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org }; 105c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 106c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64)); 107c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkScalar margin = SkIntToScalar(16); 108c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkRect bounds = r; 109c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org bounds.outset(margin, margin); 110c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 111c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org for (int xOffset = 0; xOffset < 80; xOffset += 16) { 112c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->save(); 113c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org bounds.fLeft = SkIntToScalar(xOffset); 114c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { 115c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkPaint paint; 116c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org paint.setColor(SK_ColorWHITE); 117c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org paint.setImageFilter(filters[i]); 118c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org paint.setAntiAlias(true); 119c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->save(); 120c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->clipRect(bounds); 121897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org if (5 == i) { 122c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->translate(SkIntToScalar(16), SkIntToScalar(-32)); 123897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org } else if (6 == i) { 124897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org canvas->scale(SkScalarInvert(RESIZE_FACTOR_X), 125897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org SkScalarInvert(RESIZE_FACTOR_Y)); 126c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 127c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->drawCircle(r.centerX(), r.centerY(), 128c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkScalarDiv(r.width()*2, SkIntToScalar(5)), paint); 129c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->restore(); 130c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->translate(r.width() + margin, 0); 131c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 132c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->restore(); 133c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->translate(0, r.height() + margin); 134c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 13567117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org 13667117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { 13767117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org SkSafeUnref(filters[i]); 13867117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org } 139c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 140c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 141c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgprivate: 142c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org bool fInitialized; 143c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkBitmap fCheckerboard; 144c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org SkBitmap fGradientCircle; 145c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org typedef GM INHERITED; 146c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org}; 147c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 148c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org////////////////////////////////////////////////////////////////////////////// 149c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 150c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgstatic GM* MyFactory(void*) { return new ImageFiltersClippedGM; } 151c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgstatic GMRegistry reg(MyFactory); 152c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org 153c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org} 154