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 */ 80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SampleCode.h" 90b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkBlurMaskFilter.h" 100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkColorPriv.h" 110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkGradientShader.h" 120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkView.h" 130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCanvas.h" 140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkUtils.h" 150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkBitmap make_bitmap() { 170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBitmap bm; 180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkColorTable* ctable = new SkColorTable(256); 190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPMColor* c = ctable->lockColors(); 210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int i = 0; i < 256; i++) { 220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger c[i] = SkPackARGB32(255 - i, 0, 0, 0); 230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ctable->unlockColors(true); 250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm.setConfig(SkBitmap::kIndex8_Config, 256, 256); 260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm.allocPixels(ctable); 270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ctable->unref(); 280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm.lockPixels(); 300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const float cx = bm.width() * 0.5f; 310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const float cy = bm.height() * 0.5f; 320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int y = 0; y < bm.height(); y++) { 330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger float dy = y - cy; 340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger dy *= dy; 350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger uint8_t* p = bm.getAddr8(0, y); 360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int x = 0; x < 256; x++) { 370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger float dx = x - cx; 380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger dx *= dx; 390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger float d = (dx + dy) / (cx/2); 400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger int id = (int)d; 410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (id > 255) { 420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger id = 255; 430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p[x] = id; 450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm.unlockPixels(); 480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return bm; 490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass BlurView : public SampleView { 520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBitmap fBM; 530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic: 540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger BlurView() { 550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected: 580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // overrides from SkEventSink 590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual bool onQuery(SkEvent* evt) { 600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (SampleCode::TitleQ(*evt)) { 610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SampleCode::TitleR(evt, "Blur"); 620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return this->INHERITED::onQuery(evt); 650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger void drawBG(SkCanvas* canvas) { 680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawColor(0xFFDDDDDD); 690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void onDrawContent(SkCanvas* canvas) { 720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger drawBG(canvas); 730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBlurMaskFilter::BlurStyle NONE = SkBlurMaskFilter::BlurStyle(-999); 750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger static const struct { 760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBlurMaskFilter::BlurStyle fStyle; 770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger int fCx, fCy; 780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } gRecs[] = { 790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { NONE, 0, 0 }, 800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkBlurMaskFilter::kInner_BlurStyle, -1, 0 }, 810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkBlurMaskFilter::kNormal_BlurStyle, 0, 1 }, 820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkBlurMaskFilter::kSolid_BlurStyle, 0, -1 }, 830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkBlurMaskFilter::kOuter_BlurStyle, 1, 0 }, 840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger }; 850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint paint; 870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setAntiAlias(true); 880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setTextSize(25); 890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(-40, 0); 900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBlurMaskFilter::BlurFlags flags = SkBlurMaskFilter::kNone_BlurFlag; 920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int j = 0; j < 2; j++) { 930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->save(); 940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(SK_ColorBLUE); 950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) { 960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (gRecs[i].fStyle != NONE) { 970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkMaskFilter* mf = SkBlurMaskFilter::Create(20, 980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger gRecs[i].fStyle, 990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger flags); 1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setMaskFilter(mf)->unref(); 1010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } else { 1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setMaskFilter(NULL); 1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawCircle(200 + gRecs[i].fCx*100.f, 1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 200 + gRecs[i].fCy*100.f, 50, paint); 1060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // draw text 1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkMaskFilter* mf = SkBlurMaskFilter::Create(4, 1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBlurMaskFilter::kNormal_BlurStyle, 1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger flags); 1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setMaskFilter(mf)->unref(); 1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar x = SkIntToScalar(70); 1140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar y = SkIntToScalar(400); 1150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(SK_ColorBLACK); 1160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawText("Hamburgefons Style", 18, x, y, paint); 1170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawText("Hamburgefons Style", 18, x, y + SkIntToScalar(50), paint); 1180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setMaskFilter(NULL); 1190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(SK_ColorWHITE); 1200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger x -= SkIntToScalar(2); 1210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger y -= SkIntToScalar(2); 1220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawText("Hamburgefons Style", 18, x, y, paint); 1230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->restore(); 1250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger flags = SkBlurMaskFilter::kHighQuality_BlurFlag; 1260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(350, 0); 1270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate: 1310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger typedef SkView INHERITED; 1320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 1330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger////////////////////////////////////////////////////////////////////////////// 1350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkView* MyFactory() { return new BlurView; } 1370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkViewRegister reg(MyFactory); 1380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 139