OLD | NEW |
| (Empty) |
1 #include "SkBlurDrawLooper.h" | |
2 #include "SkBlurMaskFilter.h" | |
3 #include "SkCanvas.h" | |
4 #include "SkPaint.h" | |
5 #include "SkMaskFilter.h" | |
6 | |
7 SkBlurDrawLooper::SkBlurDrawLooper(SkScalar radius, SkScalar dx, SkScalar dy, | |
8 SkColor color) | |
9 : fDx(dx), fDy(dy), fBlurColor(color) | |
10 { | |
11 if (radius > 0) | |
12 fBlur = SkBlurMaskFilter::Create(radius, | |
13 SkBlurMaskFilter::kNormal_BlurStyle); | |
14 else | |
15 fBlur = NULL; | |
16 } | |
17 | |
18 SkBlurDrawLooper::SkBlurDrawLooper(SkFlattenableReadBuffer& buffer) | |
19 { | |
20 fDx = buffer.readScalar(); | |
21 fDy = buffer.readScalar(); | |
22 fBlurColor = buffer.readU32(); | |
23 fBlur = static_cast<SkMaskFilter*>(buffer.readFlattenable()); | |
24 } | |
25 | |
26 SkBlurDrawLooper::~SkBlurDrawLooper() | |
27 { | |
28 fBlur->safeUnref(); | |
29 } | |
30 | |
31 void SkBlurDrawLooper::flatten(SkFlattenableWriteBuffer& buffer) | |
32 { | |
33 buffer.writeScalar(fDx); | |
34 buffer.writeScalar(fDy); | |
35 buffer.write32(fBlurColor); | |
36 buffer.writeFlattenable(fBlur); | |
37 } | |
38 | |
39 void SkBlurDrawLooper::init(SkCanvas* canvas, SkPaint* paint) | |
40 { | |
41 // we do nothing if a maskfilter is already installed | |
42 if (paint->getMaskFilter() != NULL) | |
43 fState = kDone; | |
44 else | |
45 { | |
46 fState = kBeforeEdge; | |
47 fPaint = paint; | |
48 fCanvas = canvas; | |
49 fSaveCount = canvas->getSaveCount(); | |
50 } | |
51 } | |
52 | |
53 bool SkBlurDrawLooper::next() | |
54 { | |
55 switch (fState) { | |
56 case kBeforeEdge: | |
57 fSavedColor = fPaint->getColor(); | |
58 fPaint->setColor(fBlurColor); | |
59 fPaint->setMaskFilter(fBlur); | |
60 fCanvas->save(SkCanvas::kMatrix_SaveFlag); | |
61 fCanvas->translate(fDx, fDy); | |
62 fState = kAfterEdge; | |
63 return true; | |
64 case kAfterEdge: | |
65 fPaint->setColor(fSavedColor); | |
66 fPaint->setMaskFilter(NULL); | |
67 fCanvas->restore(); // to remove the translate we did earlier | |
68 fState = kDone; | |
69 return true; | |
70 default: | |
71 SkASSERT(kDone == fState); | |
72 return false; | |
73 } | |
74 } | |
75 | |
76 void SkBlurDrawLooper::restore() | |
77 { | |
78 if (kAfterEdge == fState) | |
79 { | |
80 fPaint->setColor(fSavedColor); | |
81 fPaint->setMaskFilter(NULL); | |
82 fCanvas->restore(); // to remove the translate we did earlier | |
83 fState = kDone; | |
84 } | |
85 } | |
86 | |
87 /////////////////////////////////////////////////////////////////////////////// | |
88 | |
89 static SkFlattenable::Registrar gReg("SkBlurDrawLooper", | |
90 SkBlurDrawLooper::CreateProc); | |
91 | |
OLD | NEW |