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