imagefiltersscaled.cpp revision c3bd8af6d5722e854feca70c40d92f4954c5b67b
12bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org/* 22bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org * Copyright 2014 Google Inc. 32bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org * 42bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be 52bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org * found in the LICENSE file. 62bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org */ 72bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org 82bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org#include "gm.h" 92bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org#include "SkColor.h" 102bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org#include "SkBitmapSource.h" 112bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org#include "SkBlurImageFilter.h" 122bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org#include "SkDisplacementMapEffect.h" 132bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org#include "SkDropShadowImageFilter.h" 142bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org#include "SkGradientShader.h" 152bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org#include "SkMorphologyImageFilter.h" 16c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkOffsetImageFilter.h" 172bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org#include "SkScalar.h" 182bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org 192bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.orgnamespace skiagm { 202bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org 212bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.orgclass ImageFiltersScaledGM : public GM { 222bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.orgpublic: 232bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org ImageFiltersScaledGM() : fInitialized(false) { 242bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org this->setBGColor(0x00000000); 252bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org } 262bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org 272bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.orgprotected: 282bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org virtual SkString onShortName() { 292bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org return SkString("imagefiltersscaled"); 302bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org } 312bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org 322bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org virtual SkISize onISize() { 332bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org return make_isize(860, 500); 342bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org } 352bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org 362bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org void make_checkerboard() { 37eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com fCheckerboard.allocN32Pixels(64, 64); 38c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org SkCanvas canvas(fCheckerboard); 392bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas.clear(0x00000000); 402bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkPaint darkPaint; 412bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org darkPaint.setColor(0xFF404040); 422bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkPaint lightPaint; 432bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org lightPaint.setColor(0xFFA0A0A0); 442bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org for (int y = 0; y < 64; y += 16) { 452bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org for (int x = 0; x < 64; x += 16) { 462bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas.save(); 472bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas.translate(SkIntToScalar(x), SkIntToScalar(y)); 482bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint); 492bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint); 502bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint); 512bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint); 522bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas.restore(); 532bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org } 542bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org } 552bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org } 562bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org 572bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org void make_gradient_circle(int width, int height) { 582bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkScalar x = SkIntToScalar(width / 2); 592bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkScalar y = SkIntToScalar(height / 2); 602bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkScalar radius = SkScalarMul(SkMinScalar(x, y), SkIntToScalar(4) / SkIntToScalar(5)); 61eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com fGradientCircle.allocN32Pixels(width, height); 62c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org SkCanvas canvas(fGradientCircle); 632bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas.clear(0x00000000); 642bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkColor colors[2]; 652bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org colors[0] = SK_ColorWHITE; 662bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org colors[1] = SK_ColorBLACK; 672bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkAutoTUnref<SkShader> shader( 682bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkGradientShader::CreateRadial(SkPoint::Make(x, y), radius, colors, NULL, 2, 692bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkShader::kClamp_TileMode) 702bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org ); 712bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkPaint paint; 722bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org paint.setShader(shader); 732bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas.drawCircle(x, y, radius, paint); 742bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org } 752bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org 762bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org virtual void onDraw(SkCanvas* canvas) { 772bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org if (!fInitialized) { 782bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org this->make_checkerboard(); 792bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org this->make_gradient_circle(64, 64); 802bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org fInitialized = true; 812bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org } 822bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas->clear(0x00000000); 832bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org 842bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkAutoTUnref<SkImageFilter> gradient(new SkBitmapSource(fGradientCircle)); 852bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkAutoTUnref<SkImageFilter> checkerboard(new SkBitmapSource(fCheckerboard)); 862bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org 872bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkImageFilter* filters[] = { 882bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org new SkBlurImageFilter(SkIntToScalar(4), SkIntToScalar(4)), 892bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org new SkDropShadowImageFilter(SkIntToScalar(5), SkIntToScalar(10), SkIntToScalar(3), 902bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SK_ColorYELLOW), 912bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org new SkDisplacementMapEffect(SkDisplacementMapEffect::kR_ChannelSelectorType, 922bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkDisplacementMapEffect::kR_ChannelSelectorType, 932bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkIntToScalar(12), 942bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org gradient.get(), 952bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org checkerboard.get()), 962bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org new SkDilateImageFilter(1, 1, checkerboard.get()), 972bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org new SkErodeImageFilter(1, 1, checkerboard.get()), 98c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org new SkOffsetImageFilter(SkIntToScalar(32), 0), 992bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org }; 1002bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org 1012bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkVector scales[] = { 1022bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkVector::Make(SkScalarInvert(2), SkScalarInvert(2)), 1032bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkVector::Make(SkIntToScalar(1), SkIntToScalar(1)), 1042bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkVector::Make(SkIntToScalar(1), SkIntToScalar(2)), 1052bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkVector::Make(SkIntToScalar(2), SkIntToScalar(1)), 1062bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkVector::Make(SkIntToScalar(2), SkIntToScalar(2)), 1072bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org }; 1082bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org 1092bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64)); 1102bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkScalar margin = SkIntToScalar(16); 1112bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkRect bounds = r; 1122bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org bounds.outset(margin, margin); 1132bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org 1142bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org for (size_t j = 0; j < SK_ARRAY_COUNT(scales); ++j) { 1152bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas->save(); 1162bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { 1172bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkPaint paint; 1182bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org paint.setColor(SK_ColorBLUE); 1192bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org paint.setImageFilter(filters[i]); 1202bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org paint.setAntiAlias(true); 1212bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas->save(); 1222bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas->scale(scales[j].fX, scales[j].fY); 123c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org if (5 == i) { 124c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org canvas->translate(SkIntToScalar(-32), 0); 125c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org } 1262bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas->drawCircle(r.centerX(), r.centerY(), 1272bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkScalarDiv(r.width()*2, SkIntToScalar(5)), paint); 1282bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas->restore(); 1292bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas->translate(r.width() * scales[j].fX + margin, 0); 1302bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org } 1312bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas->restore(); 1322bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org canvas->translate(0, r.height() * scales[j].fY + margin); 1332bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org } 1342bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org 1352bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { 1362bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org filters[i]->unref(); 1372bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org } 1382bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org } 1392bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org 1402bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.orgprivate: 1412bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org bool fInitialized; 1422bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkBitmap fCheckerboard; 1432bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org SkBitmap fGradientCircle; 1442bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org typedef GM INHERITED; 1452bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org}; 1462bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org 1472bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org////////////////////////////////////////////////////////////////////////////// 1482bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org 1492bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.orgstatic GM* MyFactory(void*) { return new ImageFiltersScaledGM; } 1502bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.orgstatic GMRegistry reg(MyFactory); 1512bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org 1522bfe36b68d11d05c114a33d62f9f45427e316916senorblanco@chromium.org} 153