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