1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
84868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org#include "gm.h"
9b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMask.h"
104868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org#include "SkBlurDrawLooper.h"
114868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org
124868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.orgnamespace skiagm {
134868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org
144868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org///////////////////////////////////////////////////////////////////////////////
154868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org
16e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.comstatic void setup(SkPaint* paint, SkColor c, SkScalar strokeWidth) {
17e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com    paint->setColor(c);
18e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com    if (strokeWidth < 0) {
19e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com        paint->setStyle(SkPaint::kFill_Style);
20e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com    } else {
21e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com        paint->setStyle(SkPaint::kStroke_Style);
22e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com        paint->setStrokeWidth(strokeWidth);
23e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com    }
24e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com}
254868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org
26e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.comclass ShadowsGM : public GM {
274868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.orgpublic:
284868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    SkPath fCirclePath;
29e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com    SkRect fRect;
30e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com
314868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    ShadowsGM() {
3248dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com        this->setBGColor(0xFFDDDDDD);
334868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org        fCirclePath.addCircle(SkIntToScalar(20), SkIntToScalar(20), SkIntToScalar(10) );
34e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com        fRect.set(SkIntToScalar(10), SkIntToScalar(10),
35e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com                  SkIntToScalar(30), SkIntToScalar(30));
364868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    }
374868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org
384868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.orgprotected:
394868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    virtual SkString onShortName() {
404868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org        return SkString("shadows");
414868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    }
424868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org
434868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    virtual SkISize onISize() {
44f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(200, 120);
454868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    }
464868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org
474868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    virtual void onDraw(SkCanvas* canvas) {
484868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    SkBlurDrawLooper* shadowLoopers[5];
494868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    shadowLoopers[0] =
5073cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org        SkBlurDrawLooper::Create(SK_ColorBLUE,
5173cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)),
5273cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkIntToScalar(5), SkIntToScalar(10),
5373cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
5473cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkBlurDrawLooper::kOverrideColor_BlurFlag |
5573cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkBlurDrawLooper::kHighQuality_BlurFlag);
564868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    SkAutoUnref aurL0(shadowLoopers[0]);
574868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    shadowLoopers[1] =
5873cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org        SkBlurDrawLooper::Create(SK_ColorBLUE,
5973cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)),
6073cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkIntToScalar(5), SkIntToScalar(10),
6173cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
6273cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkBlurDrawLooper::kOverrideColor_BlurFlag);
634868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    SkAutoUnref aurL1(shadowLoopers[1]);
644868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    shadowLoopers[2] =
6573cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org        SkBlurDrawLooper::Create(SK_ColorBLACK,
6673cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
6773cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkIntToScalar(5),
6873cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkIntToScalar(10),
6973cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
7073cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkBlurDrawLooper::kHighQuality_BlurFlag);
714868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    SkAutoUnref aurL2(shadowLoopers[2]);
724868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    shadowLoopers[3] =
7373cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org        SkBlurDrawLooper::Create(0x7FFF0000,
7473cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
7573cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkIntToScalar(-5), SkIntToScalar(-10),
7673cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
7773cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkBlurDrawLooper::kOverrideColor_BlurFlag |
7873cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkBlurDrawLooper::kHighQuality_BlurFlag);
794868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    SkAutoUnref aurL3(shadowLoopers[3]);
804868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    shadowLoopers[4] =
8173cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org        SkBlurDrawLooper::Create(SK_ColorBLACK, SkIntToScalar(0),
8273cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkIntToScalar(5), SkIntToScalar(5),
8373cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
8473cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkBlurDrawLooper::kOverrideColor_BlurFlag |
8573cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                 SkBlurDrawLooper::kHighQuality_BlurFlag);
864868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    SkAutoUnref aurL4(shadowLoopers[4]);
874868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org
88e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com    static const struct {
89e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com        SkColor fColor;
90e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com        SkScalar fStrokeWidth;
91e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com    } gRec[] = {
92e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com        { SK_ColorRED,      -SK_Scalar1 },
93e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com        { SK_ColorGREEN,    SkIntToScalar(4) },
947c545bddf806fc1b2e9ce61a9888b49d60471d73junov@chromium.org        { SK_ColorBLUE,     SkIntToScalar(0)},
95e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com    };
96e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com
97e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com    SkPaint paint;
98e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com    paint.setAntiAlias(true);
99e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com    for (size_t i = 0; i < SK_ARRAY_COUNT(shadowLoopers); ++i) {
100e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com        SkAutoCanvasRestore acr(canvas, true);
101e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com
102e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com        paint.setLooper(shadowLoopers[i]);
103e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com
104ffe39bd3b66eb5090684959e7f2409346ab72d93tomhudson@google.com        canvas->translate(SkIntToScalar((unsigned int)i*40), SkIntToScalar(0));
105e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com        setup(&paint, gRec[0].fColor, gRec[0].fStrokeWidth);
106e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com        canvas->drawRect(fRect, paint);
107e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com
1084868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org        canvas->translate(SkIntToScalar(0), SkIntToScalar(40));
109e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com        setup(&paint, gRec[1].fColor, gRec[1].fStrokeWidth);
110e3605d0e748c1f79089f1e762f57e2a7d6644aa2reed@google.com        canvas->drawPath(fCirclePath, paint);
1117c545bddf806fc1b2e9ce61a9888b49d60471d73junov@chromium.org
1127c545bddf806fc1b2e9ce61a9888b49d60471d73junov@chromium.org        canvas->translate(SkIntToScalar(0), SkIntToScalar(40));
1137c545bddf806fc1b2e9ce61a9888b49d60471d73junov@chromium.org        setup(&paint, gRec[2].fColor, gRec[2].fStrokeWidth);
1147c545bddf806fc1b2e9ce61a9888b49d60471d73junov@chromium.org        canvas->drawPath(fCirclePath, paint);
1154868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    }
1164868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org}
1174868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org
1184868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.orgprivate:
1194868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org    typedef GM INHERITED;
1204868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org};
1214868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org
1224868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org///////////////////////////////////////////////////////////////////////////////
1234868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org
1244868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.orgstatic GM* MyFactory(void*) { return new ShadowsGM; }
1254868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.orgstatic GMRegistry reg(MyFactory);
1264868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org
1274868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org}
128