SkBlurDrawLooper.cpp revision 0910916c0f7b951ee55c4b7c6358295b9bca0565
10910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBlurDrawLooper.h" 20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBlurMaskFilter.h" 30910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkCanvas.h" 40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPaint.h" 50910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMaskFilter.h" 60910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkBlurDrawLooper::SkBlurDrawLooper(SkScalar radius, SkScalar dx, SkScalar dy, 80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkColor color) 90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project : fDx(dx), fDy(dy), fBlurColor(color) 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (radius > 0) 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBlur = SkBlurMaskFilter::Create(radius, 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBlurMaskFilter::kNormal_BlurStyle); 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBlur = NULL; 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkBlurDrawLooper::SkBlurDrawLooper(SkFlattenableReadBuffer& buffer) 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fDx = buffer.readScalar(); 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fDy = buffer.readScalar(); 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBlurColor = buffer.readU32(); 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBlur = static_cast<SkMaskFilter*>(buffer.readFlattenable()); 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkBlurDrawLooper::~SkBlurDrawLooper() 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBlur->safeUnref(); 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkBlurDrawLooper::flatten(SkFlattenableWriteBuffer& buffer) 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project buffer.writeScalar(fDx); 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project buffer.writeScalar(fDy); 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project buffer.write32(fBlurColor); 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project buffer.writeFlattenable(fBlur); 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkBlurDrawLooper::init(SkCanvas* canvas, SkPaint* paint) 400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // we do nothing if a maskfilter is already installed 420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (paint->getMaskFilter() != NULL) 430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fState = kDone; 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fState = kBeforeEdge; 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fPaint = paint; 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fCanvas = canvas; 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fSaveCount = canvas->getSaveCount(); 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkBlurDrawLooper::next() 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project switch (fState) { 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project case kBeforeEdge: 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fSavedColor = fPaint->getColor(); 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fPaint->setColor(fBlurColor); 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fPaint->setMaskFilter(fBlur); 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fCanvas->save(SkCanvas::kMatrix_SaveFlag); 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fCanvas->translate(fDx, fDy); 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fState = kAfterEdge; 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project case kAfterEdge: 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fPaint->setColor(fSavedColor); 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fPaint->setMaskFilter(NULL); 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fCanvas->restore(); // to remove the translate we did earlier 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fState = kDone; 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project default: 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(kDone == fState); 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkBlurDrawLooper::restore() 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (kAfterEdge == fState) 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fPaint->setColor(fSavedColor); 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fPaint->setMaskFilter(NULL); 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fCanvas->restore(); // to remove the translate we did earlier 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fState = kDone; 840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic SkFlattenable::Registrar gReg("SkBlurDrawLooper", 900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBlurDrawLooper::CreateProc); 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 92