| epoger@google.com | ec3ed6a | 2011-07-28 14:26:00 +0000 | [diff] [blame] | 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 |  */ | 
| reed@android.com | 47ca036 | 2009-09-02 02:07:45 +0000 | [diff] [blame] | 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 |  | 
 | 16 | static 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 |  | 
| senorblanco@chromium.org | e36ddf0 | 2011-07-15 14:28:16 +0000 | [diff] [blame] | 51 | class BlurView : public SampleView { | 
| reed@android.com | 47ca036 | 2009-09-02 02:07:45 +0000 | [diff] [blame] | 52 |     SkBitmap    fBM; | 
 | 53 | public: | 
 | 54 | 	BlurView() { | 
| caryclark@google.com | 02939ce | 2012-06-06 12:09:51 +0000 | [diff] [blame^] | 55 |         if (false) { // avoid bit rot, suppress warning | 
 | 56 |             fBM = make_bitmap(); | 
 | 57 |         } | 
| reed@android.com | 47ca036 | 2009-09-02 02:07:45 +0000 | [diff] [blame] | 58 |     } | 
| reed@google.com | 0ecc2b7 | 2011-02-16 13:06:15 +0000 | [diff] [blame] | 59 |  | 
| reed@android.com | 47ca036 | 2009-09-02 02:07:45 +0000 | [diff] [blame] | 60 | protected: | 
 | 61 |     // overrides from SkEventSink | 
 | 62 |     virtual bool onQuery(SkEvent* evt) { | 
 | 63 |         if (SampleCode::TitleQ(*evt)) { | 
 | 64 |             SampleCode::TitleR(evt, "Blur"); | 
 | 65 |             return true; | 
 | 66 |         } | 
 | 67 |         return this->INHERITED::onQuery(evt); | 
 | 68 |     } | 
| reed@google.com | 0ecc2b7 | 2011-02-16 13:06:15 +0000 | [diff] [blame] | 69 |  | 
| reed@android.com | 47ca036 | 2009-09-02 02:07:45 +0000 | [diff] [blame] | 70 |     void drawBG(SkCanvas* canvas) { | 
 | 71 |         canvas->drawColor(0xFFDDDDDD); | 
 | 72 |     } | 
| reed@google.com | 0ecc2b7 | 2011-02-16 13:06:15 +0000 | [diff] [blame] | 73 |  | 
| senorblanco@chromium.org | e36ddf0 | 2011-07-15 14:28:16 +0000 | [diff] [blame] | 74 |     virtual void onDrawContent(SkCanvas* canvas) { | 
| reed@android.com | 47ca036 | 2009-09-02 02:07:45 +0000 | [diff] [blame] | 75 |         drawBG(canvas); | 
| reed@google.com | 0ecc2b7 | 2011-02-16 13:06:15 +0000 | [diff] [blame] | 76 |  | 
| reed@android.com | da449a3 | 2009-09-18 20:57:05 +0000 | [diff] [blame] | 77 |         SkBlurMaskFilter::BlurStyle NONE = SkBlurMaskFilter::BlurStyle(-999); | 
 | 78 |         static const struct { | 
 | 79 |             SkBlurMaskFilter::BlurStyle fStyle; | 
 | 80 |             int                         fCx, fCy; | 
 | 81 |         } gRecs[] = { | 
 | 82 |             { NONE,                                 0,  0 }, | 
 | 83 |             { SkBlurMaskFilter::kInner_BlurStyle,  -1,  0 }, | 
 | 84 |             { SkBlurMaskFilter::kNormal_BlurStyle,  0,  1 }, | 
 | 85 |             { SkBlurMaskFilter::kSolid_BlurStyle,   0, -1 }, | 
 | 86 |             { SkBlurMaskFilter::kOuter_BlurStyle,   1,  0 }, | 
 | 87 |         }; | 
| reed@android.com | 47ca036 | 2009-09-02 02:07:45 +0000 | [diff] [blame] | 88 |  | 
| reed@android.com | 47ca036 | 2009-09-02 02:07:45 +0000 | [diff] [blame] | 89 |         SkPaint paint; | 
 | 90 |         paint.setAntiAlias(true); | 
| reed@google.com | 0ecc2b7 | 2011-02-16 13:06:15 +0000 | [diff] [blame] | 91 |         paint.setTextSize(25); | 
 | 92 |         canvas->translate(-40, 0); | 
| reed@android.com | da449a3 | 2009-09-18 20:57:05 +0000 | [diff] [blame] | 93 |  | 
| reed@google.com | 0ecc2b7 | 2011-02-16 13:06:15 +0000 | [diff] [blame] | 94 |         SkBlurMaskFilter::BlurFlags flags = SkBlurMaskFilter::kNone_BlurFlag; | 
 | 95 |         for (int j = 0; j < 2; j++) { | 
 | 96 |             canvas->save(); | 
 | 97 |             paint.setColor(SK_ColorBLUE); | 
 | 98 |             for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) { | 
 | 99 |                 if (gRecs[i].fStyle != NONE) { | 
 | 100 |                     SkMaskFilter* mf = SkBlurMaskFilter::Create(20, | 
 | 101 |                                                                 gRecs[i].fStyle, | 
 | 102 |                                                                 flags); | 
 | 103 |                     paint.setMaskFilter(mf)->unref(); | 
 | 104 |                 } else { | 
 | 105 |                     paint.setMaskFilter(NULL); | 
 | 106 |                 } | 
| reed@google.com | 261b8e2 | 2011-04-14 17:53:24 +0000 | [diff] [blame] | 107 |                 canvas->drawCircle(200 + gRecs[i].fCx*100.f, | 
 | 108 |                                    200 + gRecs[i].fCy*100.f, 50, paint); | 
| reed@android.com | da449a3 | 2009-09-18 20:57:05 +0000 | [diff] [blame] | 109 |             } | 
| reed@google.com | 0ecc2b7 | 2011-02-16 13:06:15 +0000 | [diff] [blame] | 110 |             // draw text | 
 | 111 |             { | 
 | 112 |                 SkMaskFilter* mf = SkBlurMaskFilter::Create(4, | 
 | 113 |                                                             SkBlurMaskFilter::kNormal_BlurStyle, | 
 | 114 |                                                             flags); | 
 | 115 |                 paint.setMaskFilter(mf)->unref(); | 
 | 116 |                 SkScalar x = SkIntToScalar(70); | 
 | 117 |                 SkScalar y = SkIntToScalar(400); | 
 | 118 |                 paint.setColor(SK_ColorBLACK); | 
 | 119 |                 canvas->drawText("Hamburgefons Style", 18, x, y, paint); | 
 | 120 |                 canvas->drawText("Hamburgefons Style", 18, x, y + SkIntToScalar(50), paint); | 
 | 121 |                 paint.setMaskFilter(NULL); | 
 | 122 |                 paint.setColor(SK_ColorWHITE); | 
 | 123 |                 x -= SkIntToScalar(2); | 
 | 124 |                 y -= SkIntToScalar(2); | 
 | 125 |                 canvas->drawText("Hamburgefons Style", 18, x, y, paint); | 
 | 126 |             } | 
 | 127 |             canvas->restore(); | 
| reed@google.com | 11a5ff3 | 2011-02-18 20:20:51 +0000 | [diff] [blame] | 128 |             flags = SkBlurMaskFilter::kHighQuality_BlurFlag; | 
| reed@google.com | 0ecc2b7 | 2011-02-16 13:06:15 +0000 | [diff] [blame] | 129 |             canvas->translate(350, 0); | 
| reed@android.com | da449a3 | 2009-09-18 20:57:05 +0000 | [diff] [blame] | 130 |         } | 
| reed@android.com | 47ca036 | 2009-09-02 02:07:45 +0000 | [diff] [blame] | 131 |     } | 
| reed@google.com | 0ecc2b7 | 2011-02-16 13:06:15 +0000 | [diff] [blame] | 132 |  | 
| reed@android.com | 47ca036 | 2009-09-02 02:07:45 +0000 | [diff] [blame] | 133 | private: | 
 | 134 |     typedef SkView INHERITED; | 
 | 135 | }; | 
 | 136 |  | 
 | 137 | ////////////////////////////////////////////////////////////////////////////// | 
 | 138 |  | 
 | 139 | static SkView* MyFactory() { return new BlurView; } | 
 | 140 | static SkViewRegister reg(MyFactory); | 
 | 141 |  |