1 2/* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8#include "SampleCode.h" 9#include "SkBlurMaskFilter.h" 10#include "SkColorPriv.h" 11#include "SkGradientShader.h" 12#include "SkView.h" 13#include "SkCanvas.h" 14#include "SkUtils.h" 15 16static SkBitmap make_bitmap() { 17 SkBitmap bm; 18 SkColorTable* ctable = new SkColorTable(256); 19 20 SkPMColor* c = ctable->lockColors(); 21 for (int i = 0; i < 256; i++) { 22 c[i] = SkPackARGB32(255 - i, 0, 0, 0); 23 } 24 ctable->unlockColors(true); 25 bm.setConfig(SkBitmap::kIndex8_Config, 256, 256); 26 bm.allocPixels(ctable); 27 ctable->unref(); 28 29 bm.lockPixels(); 30 const float cx = bm.width() * 0.5f; 31 const float cy = bm.height() * 0.5f; 32 for (int y = 0; y < bm.height(); y++) { 33 float dy = y - cy; 34 dy *= dy; 35 uint8_t* p = bm.getAddr8(0, y); 36 for (int x = 0; x < 256; x++) { 37 float dx = x - cx; 38 dx *= dx; 39 float d = (dx + dy) / (cx/2); 40 int id = (int)d; 41 if (id > 255) { 42 id = 255; 43 } 44 p[x] = id; 45 } 46 } 47 bm.unlockPixels(); 48 return bm; 49} 50 51class BlurView : public SampleView { 52 SkBitmap fBM; 53public: 54 BlurView() { 55 } 56 57protected: 58 // overrides from SkEventSink 59 virtual bool onQuery(SkEvent* evt) { 60 if (SampleCode::TitleQ(*evt)) { 61 SampleCode::TitleR(evt, "Blur"); 62 return true; 63 } 64 return this->INHERITED::onQuery(evt); 65 } 66 67 void drawBG(SkCanvas* canvas) { 68 canvas->drawColor(0xFFDDDDDD); 69 } 70 71 virtual void onDrawContent(SkCanvas* canvas) { 72 drawBG(canvas); 73 74 SkBlurMaskFilter::BlurStyle NONE = SkBlurMaskFilter::BlurStyle(-999); 75 static const struct { 76 SkBlurMaskFilter::BlurStyle fStyle; 77 int fCx, fCy; 78 } gRecs[] = { 79 { NONE, 0, 0 }, 80 { SkBlurMaskFilter::kInner_BlurStyle, -1, 0 }, 81 { SkBlurMaskFilter::kNormal_BlurStyle, 0, 1 }, 82 { SkBlurMaskFilter::kSolid_BlurStyle, 0, -1 }, 83 { SkBlurMaskFilter::kOuter_BlurStyle, 1, 0 }, 84 }; 85 86 SkPaint paint; 87 paint.setAntiAlias(true); 88 paint.setTextSize(25); 89 canvas->translate(-40, 0); 90 91 SkBlurMaskFilter::BlurFlags flags = SkBlurMaskFilter::kNone_BlurFlag; 92 for (int j = 0; j < 2; j++) { 93 canvas->save(); 94 paint.setColor(SK_ColorBLUE); 95 for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) { 96 if (gRecs[i].fStyle != NONE) { 97 SkMaskFilter* mf = SkBlurMaskFilter::Create(20, 98 gRecs[i].fStyle, 99 flags); 100 paint.setMaskFilter(mf)->unref(); 101 } else { 102 paint.setMaskFilter(NULL); 103 } 104 canvas->drawCircle(200 + gRecs[i].fCx*100.f, 105 200 + gRecs[i].fCy*100.f, 50, paint); 106 } 107 // draw text 108 { 109 SkMaskFilter* mf = SkBlurMaskFilter::Create(4, 110 SkBlurMaskFilter::kNormal_BlurStyle, 111 flags); 112 paint.setMaskFilter(mf)->unref(); 113 SkScalar x = SkIntToScalar(70); 114 SkScalar y = SkIntToScalar(400); 115 paint.setColor(SK_ColorBLACK); 116 canvas->drawText("Hamburgefons Style", 18, x, y, paint); 117 canvas->drawText("Hamburgefons Style", 18, x, y + SkIntToScalar(50), paint); 118 paint.setMaskFilter(NULL); 119 paint.setColor(SK_ColorWHITE); 120 x -= SkIntToScalar(2); 121 y -= SkIntToScalar(2); 122 canvas->drawText("Hamburgefons Style", 18, x, y, paint); 123 } 124 canvas->restore(); 125 flags = SkBlurMaskFilter::kHighQuality_BlurFlag; 126 canvas->translate(350, 0); 127 } 128 } 129 130private: 131 typedef SkView INHERITED; 132}; 133 134////////////////////////////////////////////////////////////////////////////// 135 136static SkView* MyFactory() { return new BlurView; } 137static SkViewRegister reg(MyFactory); 138 139