SampleBlur.cpp revision 261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70
147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SampleCode.h" 247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkBlurMaskFilter.h" 347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkColorPriv.h" 447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkGradientShader.h" 547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkView.h" 647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkCanvas.h" 747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkUtils.h" 847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkBitmap make_bitmap() { 1047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com SkBitmap bm; 1147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com SkColorTable* ctable = new SkColorTable(256); 1247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 1347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com SkPMColor* c = ctable->lockColors(); 1447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com for (int i = 0; i < 256; i++) { 1547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com c[i] = SkPackARGB32(255 - i, 0, 0, 0); 1647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 1747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com ctable->unlockColors(true); 1847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com bm.setConfig(SkBitmap::kIndex8_Config, 256, 256); 1947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com bm.allocPixels(ctable); 2047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com ctable->unref(); 2147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 2247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com bm.lockPixels(); 2347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com const float cx = bm.width() * 0.5f; 2447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com const float cy = bm.height() * 0.5f; 2547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com for (int y = 0; y < bm.height(); y++) { 2647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com float dy = y - cy; 2747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com dy *= dy; 2847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com uint8_t* p = bm.getAddr8(0, y); 2947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com for (int x = 0; x < 256; x++) { 3047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com float dx = x - cx; 3147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com dx *= dx; 3247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com float d = (dx + dy) / (cx/2); 3347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com int id = (int)d; 3447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com if (id > 255) { 3547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com id = 255; 3647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 3747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com p[x] = id; 3847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 3947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 4047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com bm.unlockPixels(); 4147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com return bm; 4247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com} 4347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 4447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comclass BlurView : public SkView { 4547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com SkBitmap fBM; 4647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.compublic: 4747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com BlurView() { 4847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 490ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 5047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comprotected: 5147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com // overrides from SkEventSink 5247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com virtual bool onQuery(SkEvent* evt) { 5347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com if (SampleCode::TitleQ(*evt)) { 5447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com SampleCode::TitleR(evt, "Blur"); 5547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com return true; 5647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 5747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com return this->INHERITED::onQuery(evt); 5847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 590ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 6047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com void drawBG(SkCanvas* canvas) { 6147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com canvas->drawColor(0xFFDDDDDD); 6247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 630ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 6447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com virtual void onDraw(SkCanvas* canvas) { 6547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com drawBG(canvas); 660ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 67da449a38a2ac06f47f504cef7897afe322981daereed@android.com SkBlurMaskFilter::BlurStyle NONE = SkBlurMaskFilter::BlurStyle(-999); 68da449a38a2ac06f47f504cef7897afe322981daereed@android.com static const struct { 69da449a38a2ac06f47f504cef7897afe322981daereed@android.com SkBlurMaskFilter::BlurStyle fStyle; 70da449a38a2ac06f47f504cef7897afe322981daereed@android.com int fCx, fCy; 71da449a38a2ac06f47f504cef7897afe322981daereed@android.com } gRecs[] = { 72da449a38a2ac06f47f504cef7897afe322981daereed@android.com { NONE, 0, 0 }, 73da449a38a2ac06f47f504cef7897afe322981daereed@android.com { SkBlurMaskFilter::kInner_BlurStyle, -1, 0 }, 74da449a38a2ac06f47f504cef7897afe322981daereed@android.com { SkBlurMaskFilter::kNormal_BlurStyle, 0, 1 }, 75da449a38a2ac06f47f504cef7897afe322981daereed@android.com { SkBlurMaskFilter::kSolid_BlurStyle, 0, -1 }, 76da449a38a2ac06f47f504cef7897afe322981daereed@android.com { SkBlurMaskFilter::kOuter_BlurStyle, 1, 0 }, 77da449a38a2ac06f47f504cef7897afe322981daereed@android.com }; 7847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 7947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com SkPaint paint; 8047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com paint.setAntiAlias(true); 810ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setTextSize(25); 820ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->translate(-40, 0); 83da449a38a2ac06f47f504cef7897afe322981daereed@android.com 840ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com SkBlurMaskFilter::BlurFlags flags = SkBlurMaskFilter::kNone_BlurFlag; 850ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com for (int j = 0; j < 2; j++) { 860ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->save(); 870ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setColor(SK_ColorBLUE); 880ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) { 890ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com if (gRecs[i].fStyle != NONE) { 900ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com SkMaskFilter* mf = SkBlurMaskFilter::Create(20, 910ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com gRecs[i].fStyle, 920ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com flags); 930ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setMaskFilter(mf)->unref(); 940ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com } else { 950ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setMaskFilter(NULL); 960ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com } 97261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com canvas->drawCircle(200 + gRecs[i].fCx*100.f, 98261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com 200 + gRecs[i].fCy*100.f, 50, paint); 990ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com } 1000ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com // draw text 1010ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com { 1020ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com SkMaskFilter* mf = SkBlurMaskFilter::Create(4, 1030ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com SkBlurMaskFilter::kNormal_BlurStyle, 1040ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com flags); 105da449a38a2ac06f47f504cef7897afe322981daereed@android.com paint.setMaskFilter(mf)->unref(); 1060ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com SkScalar x = SkIntToScalar(70); 1070ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com SkScalar y = SkIntToScalar(400); 1080ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setColor(SK_ColorBLACK); 1090ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->drawText("Hamburgefons Style", 18, x, y, paint); 1100ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->drawText("Hamburgefons Style", 18, x, y + SkIntToScalar(50), paint); 111da449a38a2ac06f47f504cef7897afe322981daereed@android.com paint.setMaskFilter(NULL); 1120ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setColor(SK_ColorWHITE); 1130ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com x -= SkIntToScalar(2); 1140ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com y -= SkIntToScalar(2); 1150ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->drawText("Hamburgefons Style", 18, x, y, paint); 116da449a38a2ac06f47f504cef7897afe322981daereed@android.com } 1170ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->restore(); 11811a5ff376be94d15daf5bc66cdf857f5f2f297afreed@google.com flags = SkBlurMaskFilter::kHighQuality_BlurFlag; 1190ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->translate(350, 0); 120da449a38a2ac06f47f504cef7897afe322981daereed@android.com } 12147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 1220ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 12347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comprivate: 12447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com typedef SkView INHERITED; 12547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com}; 12647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 12747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com////////////////////////////////////////////////////////////////////////////// 12847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 12947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkView* MyFactory() { return new BlurView; } 13047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkViewRegister reg(MyFactory); 13147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 132