SkBlurDrawLooper.cpp revision 8a1c16ff38322f0210116fa7293eb8817c7e477e
18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkBlurDrawLooper.h" 28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkBlurMaskFilter.h" 38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h" 48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPaint.h" 58a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkMaskFilter.h" 68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkBlurDrawLooper::SkBlurDrawLooper(SkScalar radius, SkScalar dx, SkScalar dy, 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkColor color) 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com : fDx(dx), fDy(dy), fBlurColor(color) 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (radius > 0) 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fBlur = SkBlurMaskFilter::Create(radius, 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkBlurMaskFilter::kNormal_BlurStyle); 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fBlur = NULL; 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkBlurDrawLooper::SkBlurDrawLooper(SkFlattenableReadBuffer& buffer) 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fDx = buffer.readScalar(); 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fDy = buffer.readScalar(); 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fBlurColor = buffer.readU32(); 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fBlur = static_cast<SkMaskFilter*>(buffer.readFlattenable()); 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkBlurDrawLooper::~SkBlurDrawLooper() 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fBlur->safeUnref(); 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkBlurDrawLooper::flatten(SkFlattenableWriteBuffer& buffer) 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com buffer.writeScalar(fDx); 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com buffer.writeScalar(fDy); 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com buffer.write32(fBlurColor); 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com buffer.writeFlattenable(fBlur); 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkBlurDrawLooper::init(SkCanvas* canvas, SkPaint* paint) 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // we do nothing if a maskfilter is already installed 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (paint->getMaskFilter() != NULL) 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fState = kDone; 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fState = kBeforeEdge; 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPaint = paint; 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fCanvas = canvas; 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fSaveCount = canvas->getSaveCount(); 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkBlurDrawLooper::next() 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com switch (fState) { 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com case kBeforeEdge: 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fSavedColor = fPaint->getColor(); 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPaint->setColor(fBlurColor); 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPaint->setMaskFilter(fBlur); 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fCanvas->save(SkCanvas::kMatrix_SaveFlag); 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fCanvas->translate(fDx, fDy); 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fState = kAfterEdge; 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com case kAfterEdge: 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPaint->setColor(fSavedColor); 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPaint->setMaskFilter(NULL); 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fCanvas->restore(); // to remove the translate we did earlier 688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fState = kDone; 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com default: 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(kDone == fState); 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkBlurDrawLooper::restore() 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (kAfterEdge == fState) 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPaint->setColor(fSavedColor); 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPaint->setMaskFilter(NULL); 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fCanvas->restore(); // to remove the translate we did earlier 838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fState = kDone; 848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkFlattenable::Registrar gReg("SkBlurDrawLooper", 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkBlurDrawLooper::CreateProc); 918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 92