11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "gm.h"
905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkBlurDrawLooper.h"
1005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergernamespace skiagm {
1205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
1405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void setup(SkPaint* paint, SkColor c, SkScalar strokeWidth) {
160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    paint->setColor(c);
170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    if (strokeWidth < 0) {
180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint->setStyle(SkPaint::kFill_Style);
190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    } else {
200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint->setStyle(SkPaint::kStroke_Style);
210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint->setStrokeWidth(strokeWidth);
220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
2405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass ShadowsGM : public GM {
2605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic:
2705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkPath fCirclePath;
280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkRect fRect;
290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    ShadowsGM() {
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        this->setBGColor(0xFFDDDDDD);
3205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        fCirclePath.addCircle(SkIntToScalar(20), SkIntToScalar(20), SkIntToScalar(10) );
330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        fRect.set(SkIntToScalar(10), SkIntToScalar(10),
340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                  SkIntToScalar(30), SkIntToScalar(30));
3505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
3605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprotected:
3805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual SkString onShortName() {
3905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return SkString("shadows");
4005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
4105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
4205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual SkISize onISize() {
4305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return make_isize(200, 80);
4405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
4505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
4605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual void onDraw(SkCanvas* canvas) {
4705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkBlurDrawLooper* shadowLoopers[5];
4805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    shadowLoopers[0] =
490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        new SkBlurDrawLooper (SkIntToScalar(10), SkIntToScalar(5),
500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                              SkIntToScalar(10), 0xFF0000FF,
5105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                              SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
5205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                              SkBlurDrawLooper::kOverrideColor_BlurFlag |
5305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                              SkBlurDrawLooper::kHighQuality_BlurFlag );
5405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkAutoUnref aurL0(shadowLoopers[0]);
5505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    shadowLoopers[1] =
560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        new SkBlurDrawLooper (SkIntToScalar(10), SkIntToScalar(5),
570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                              SkIntToScalar(10), 0xFF0000FF,
5805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                              SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
5905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                              SkBlurDrawLooper::kOverrideColor_BlurFlag );
6005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkAutoUnref aurL1(shadowLoopers[1]);
6105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    shadowLoopers[2] =
620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        new SkBlurDrawLooper (SkIntToScalar(5), SkIntToScalar(5),
630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                              SkIntToScalar(10), 0xFF000000,
6405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                              SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
6505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                              SkBlurDrawLooper::kHighQuality_BlurFlag  );
6605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkAutoUnref aurL2(shadowLoopers[2]);
6705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    shadowLoopers[3] =
680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        new SkBlurDrawLooper (SkIntToScalar(5), SkIntToScalar(-5),
690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                              SkIntToScalar(-10), 0x7FFF0000,
7005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                              SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
7105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                              SkBlurDrawLooper::kOverrideColor_BlurFlag |
7205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                              SkBlurDrawLooper::kHighQuality_BlurFlag  );
7305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkAutoUnref aurL3(shadowLoopers[3]);
7405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    shadowLoopers[4] =
750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        new SkBlurDrawLooper (SkIntToScalar(0), SkIntToScalar(5),
760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                              SkIntToScalar(5), 0xFF000000,
7705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                              SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
7805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                              SkBlurDrawLooper::kOverrideColor_BlurFlag |
7905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                              SkBlurDrawLooper::kHighQuality_BlurFlag  );
8005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkAutoUnref aurL4(shadowLoopers[4]);
8105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static const struct {
830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkColor fColor;
840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkScalar fStrokeWidth;
850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    } gRec[] = {
860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        { SK_ColorRED,      -SK_Scalar1 },
870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        { SK_ColorGREEN,    SkIntToScalar(4) },
880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    };
890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPaint paint;
910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    paint.setAntiAlias(true);
920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    for (size_t i = 0; i < SK_ARRAY_COUNT(shadowLoopers); ++i) {
930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkAutoCanvasRestore acr(canvas, true);
940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setLooper(shadowLoopers[i]);
960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->translate(SkIntToScalar(i*40), SkIntToScalar(0));
980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        setup(&paint, gRec[0].fColor, gRec[0].fStrokeWidth);
990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->drawRect(fRect, paint);
1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
10105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        canvas->translate(SkIntToScalar(0), SkIntToScalar(40));
1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        setup(&paint, gRec[1].fColor, gRec[1].fStrokeWidth);
1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->drawPath(fCirclePath, paint);
10405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
10505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
10605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
10705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprivate:
10805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    typedef GM INHERITED;
10905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
11005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
11105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
11205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
11305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic GM* MyFactory(void*) { return new ShadowsGM; }
11405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic GMRegistry reg(MyFactory);
11505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
11605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
117