196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com/*
396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com * Copyright 2013 Google Inc.
496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com *
596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com * Use of this source code is governed by a BSD-style license that can be
696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com * found in the LICENSE file.
796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com */
896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
996ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com#include "gm.h"
1096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com#include "SkBlurMask.h"
1196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com#include "SkBlurMaskFilter.h"
1296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
1396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.comnamespace skiagm {
1496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
1596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com// This GM exercises the blurred rect nine-patching special cases when the
1696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com// blurred rect is very large and/or very far from the origin.
17ab7442c8d733e0642d1cd80af23cdab43d77039eskia.committer@gmail.com// It creates a large blurred rect/rectori then renders the 4 corners and the
1896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com// middle.
1996ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.comclass BigBlursGM : public GM {
2096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.compublic:
2196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com    BigBlursGM() {
2296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        this->setBGColor(0xFFDDDDDD);
2396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com    }
2496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
2596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.comprotected:
2696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com    virtual SkString onShortName() SK_OVERRIDE {
2796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        return SkString("bigblurs");
2896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com    }
2996ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
3096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com    virtual SkISize onISize() SK_OVERRIDE {
31f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(kWidth, kHeight);
3296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com    }
3396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
3496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
3596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        static const int kBig = 65536;
3696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        static const SkScalar kSigma = SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(4));
3796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
3896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        const SkRect bigRect = SkRect::MakeWH(SkIntToScalar(kBig), SkIntToScalar(kBig));
3996ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        SkRect insetRect = bigRect;
4096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        insetRect.inset(20, 20);
4196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
4296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        SkPath rectori;
4396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
4496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        rectori.addRect(bigRect);
4596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        rectori.addRect(insetRect, SkPath::kCCW_Direction);
4696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
4796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        // The blur extends 3*kSigma out from the big rect.
4896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        // Offset the close-up windows so we get the entire blur
4996ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        static const SkScalar kLeftTopPad  = 3*kSigma;   // use on left & up of big rect
5096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        static const SkScalar kRightBotPad = kCloseUpSize-3*kSigma; // use on right and bot sides
5196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
5296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        // UL hand corners of the rendered closeups
5396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        const SkPoint origins[] = {
5496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com            { -kLeftTopPad,          -kLeftTopPad           }, // UL
5596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com            {  kBig-kRightBotPad,    -kLeftTopPad           }, // UR
5696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com            {  kBig-kRightBotPad,     kBig-kRightBotPad     }, // LR
5796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com            { -kLeftTopPad,           kBig-kRightBotPad     }, // LL
5896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com            {  kBig/2-kCloseUpSize/2, kBig/2-kCloseUpSize/2 }, // center
5996ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        };
6096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
6196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        SkPaint outlinePaint;
6296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        outlinePaint.setColor(SK_ColorRED);
6396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        outlinePaint.setStyle(SkPaint::kStroke_Style);
6496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
6596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        SkPaint blurPaint;
6696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        blurPaint.setAntiAlias(true);
6796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        blurPaint.setColor(SK_ColorBLACK);
6896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
6996ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        int desiredX = 0, desiredY = 0;
7096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
7196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        for (int i = 0; i < 2; ++i) {
72e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org            for (int j = 0; j <= kLastEnum_SkBlurStyle; ++j) {
73e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org                SkMaskFilter* mf = SkBlurMaskFilter::Create((SkBlurStyle)j, kSigma);
7496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com                blurPaint.setMaskFilter(mf)->unref();
7596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
7696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com                for (int k = 0; k < (int)SK_ARRAY_COUNT(origins); ++k) {
7796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com                    canvas->save();
7896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
79ab7442c8d733e0642d1cd80af23cdab43d77039eskia.committer@gmail.com                    SkRect clipRect = SkRect::MakeXYWH(SkIntToScalar(desiredX),
8096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com                                                       SkIntToScalar(desiredY),
81ab7442c8d733e0642d1cd80af23cdab43d77039eskia.committer@gmail.com                                                       SkIntToScalar(kCloseUpSize),
8296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com                                                       SkIntToScalar(kCloseUpSize));
8396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
8496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com                    canvas->clipRect(clipRect, SkRegion::kReplace_Op, false);
8596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
86ab7442c8d733e0642d1cd80af23cdab43d77039eskia.committer@gmail.com                    canvas->translate(desiredX-origins[k].fX,
8796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com                                      desiredY-origins[k].fY);
8896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
8996ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com                    if (0 == i) {
9096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com                        canvas->drawRect(bigRect, blurPaint);
9196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com                    } else {
9296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com                        canvas->drawPath(rectori, blurPaint);
9396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com                    }
9496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com                    canvas->restore();
9596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com                    canvas->drawRect(clipRect, outlinePaint);
9696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
9796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com                    desiredX += kCloseUpSize;
9896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com                }
9996ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
10096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com                desiredX = 0;
10196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com                desiredY += kCloseUpSize;
10296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com            }
10396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com        }
10496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com    }
10596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
10696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.comprivate:
10796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com    static const int kCloseUpSize = 64;
10896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com    static const int kWidth = 5 * kCloseUpSize;
109e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org    static const int kHeight = 2 * (kLastEnum_SkBlurStyle + 1) * kCloseUpSize;
11096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
11196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com    typedef GM INHERITED;
11296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com};
11396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
11496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.comDEF_GM( return SkNEW(BigBlursGM); )
11596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com
116f3db546a4bf1717126a7ba4dd47ece077a6e76f7robertphillips@google.com}
117