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