15acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt/*
25acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt * Copyright 2011 Google Inc.
35acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt *
45acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt * Use of this source code is governed by a BSD-style license that can be
55acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt * found in the LICENSE file.
65acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt */
75acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
85acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt#include "gm.h"
95acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt#include "SkBlurImageFilter.h"
105acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt#include "SkRandom.h"
115acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
125acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt// TODO deprecate imageblur
135acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
145acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt#define WIDTH 500
155acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt#define HEIGHT 500
165acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
175acfea789d39106dbc706c6ee85cd8f027fce3edjoshualittstatic const float kBlurSigmas[] = {
185acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        0.0, 0.3f, 0.5f, 2.0f, 32.0f, 80.0f };
195acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
205acfea789d39106dbc706c6ee85cd8f027fce3edjoshualittconst char* kTestStrings[] = {
215acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        "The quick`~",
225acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        "brown fox[]",
235acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        "jumped over",
245acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        "the lazy@#$",
255acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        "dog.{}!%^&",
265acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        "*()+=-\\'\"/",
275acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt};
285acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
295acfea789d39106dbc706c6ee85cd8f027fce3edjoshualittnamespace skiagm {
305acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
315acfea789d39106dbc706c6ee85cd8f027fce3edjoshualittclass BlurImageFilter : public GM {
325acfea789d39106dbc706c6ee85cd8f027fce3edjoshualittpublic:
335acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt    BlurImageFilter() {
345acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        this->setBGColor(0xFFFFFFFF);
355acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        fName.printf("imageblur2");
365acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt    }
375acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
385acfea789d39106dbc706c6ee85cd8f027fce3edjoshualittprotected:
395acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt    virtual uint32_t onGetFlags() const SK_OVERRIDE {
405acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        return kSkipTiled_Flag;
415acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt    }
425acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
435acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt    virtual SkString onShortName() {
445acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        return fName;
455acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt    }
465acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
475acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt    virtual SkISize onISize() {
485acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        return SkISize::Make(WIDTH, HEIGHT);
495acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt    }
505acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
515acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt    virtual void onDraw(SkCanvas* canvas) {
525acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        const int sigmaCount = SK_ARRAY_COUNT(kBlurSigmas);
535acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        const int testStringCount = SK_ARRAY_COUNT(kTestStrings);
545acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        SkScalar dx = WIDTH / sigmaCount;
555acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        SkScalar dy = HEIGHT / sigmaCount;
565acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        const SkScalar textSize = 12;
575acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
585acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        for (int x = 0; x < sigmaCount; x++) {
595acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt            SkScalar sigmaX = kBlurSigmas[x];
605acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt            for (int y = 0; y < sigmaCount; y++) {
615acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt                SkScalar sigmaY = kBlurSigmas[y];
625acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
635acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt                SkPaint paint;
645acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt                paint.setImageFilter(SkBlurImageFilter::Create(sigmaX, sigmaY))->unref();
655acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt                canvas->saveLayer(NULL, &paint);
665acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
675acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt                SkRandom rand;
685acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt                SkPaint textPaint;
695acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt                textPaint.setAntiAlias(false);
705acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt                textPaint.setColor(rand.nextBits(24) | 0xFF000000);
715acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt                textPaint.setTextSize(textSize);
725acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
735acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt                for (int i = 0; i < testStringCount; i++) {
745acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt                    canvas->drawText(kTestStrings[i],
755acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt                                     strlen(kTestStrings[i]),
765acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt                                     SkIntToScalar(x * dx),
775acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt                                     SkIntToScalar(y * dy + textSize * i + textSize),
785acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt                                     textPaint);
795acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt                }
805acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt                canvas->restore();
815acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt            }
825acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt        }
835acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt    }
845acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
855acfea789d39106dbc706c6ee85cd8f027fce3edjoshualittprivate:
865acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt    SkString fName;
875acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
885acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt    typedef GM INHERITED;
895acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt};
905acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
915acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt//////////////////////////////////////////////////////////////////////////////
925acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
935acfea789d39106dbc706c6ee85cd8f027fce3edjoshualittstatic GM* MyFactory(void*) { return new BlurImageFilter; }
945acfea789d39106dbc706c6ee85cd8f027fce3edjoshualittstatic GMRegistry reg(MyFactory);
955acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
965acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt}
97