|
1 |
|
2 /* |
|
3 * Copyright 2011 Google Inc. |
|
4 * |
|
5 * Use of this source code is governed by a BSD-style license that can be |
|
6 * found in the LICENSE file. |
|
7 */ |
|
8 #ifndef SkDrawProcs_DEFINED |
|
9 #define SkDrawProcs_DEFINED |
|
10 |
|
11 #include "SkBlitter.h" |
|
12 #include "SkDraw.h" |
|
13 |
|
14 class SkAAClip; |
|
15 class SkBlitter; |
|
16 |
|
17 struct SkDraw1Glyph { |
|
18 const SkDraw* fDraw; |
|
19 SkBounder* fBounder; |
|
20 const SkRegion* fClip; |
|
21 const SkAAClip* fAAClip; |
|
22 SkBlitter* fBlitter; |
|
23 SkGlyphCache* fCache; |
|
24 const SkPaint* fPaint; |
|
25 SkIRect fClipBounds; |
|
26 /** Half the sampling frequency of the rasterized glyph in x. */ |
|
27 SkFixed fHalfSampleX; |
|
28 /** Half the sampling frequency of the rasterized glyph in y. */ |
|
29 SkFixed fHalfSampleY; |
|
30 |
|
31 /** Draws one glyph. |
|
32 * |
|
33 * The x and y are pre-biased, so implementations may just truncate them. |
|
34 * i.e. half the sampling frequency has been added. |
|
35 * e.g. 1/2 or 1/(2^(SkGlyph::kSubBits+1)) has already been added. |
|
36 * This added bias can be found in fHalfSampleX,Y. |
|
37 */ |
|
38 typedef void (*Proc)(const SkDraw1Glyph&, SkFixed x, SkFixed y, const SkGlyph&); |
|
39 |
|
40 Proc init(const SkDraw* draw, SkBlitter* blitter, SkGlyphCache* cache, |
|
41 const SkPaint&); |
|
42 |
|
43 // call this instead of fBlitter->blitMask() since this wrapper will handle |
|
44 // the case when the mask is ARGB32_Format |
|
45 // |
|
46 void blitMask(const SkMask& mask, const SkIRect& clip) const { |
|
47 if (SkMask::kARGB32_Format == mask.fFormat) { |
|
48 this->blitMaskAsSprite(mask); |
|
49 } else { |
|
50 fBlitter->blitMask(mask, clip); |
|
51 } |
|
52 } |
|
53 |
|
54 // mask must be kARGB32_Format |
|
55 void blitMaskAsSprite(const SkMask& mask) const; |
|
56 }; |
|
57 |
|
58 struct SkDrawProcs { |
|
59 SkDraw1Glyph::Proc fD1GProc; |
|
60 }; |
|
61 |
|
62 bool SkDrawTreatAAStrokeAsHairline(SkScalar strokeWidth, const SkMatrix&, |
|
63 SkScalar* coverage); |
|
64 |
|
65 /** |
|
66 * If the current paint is set to stroke and the stroke-width when applied to |
|
67 * the matrix is <= 1.0, then this returns true, and sets coverage (simulating |
|
68 * a stroke by drawing a hairline with partial coverage). If any of these |
|
69 * conditions are false, then this returns false and coverage is ignored. |
|
70 */ |
|
71 inline bool SkDrawTreatAsHairline(const SkPaint& paint, const SkMatrix& matrix, |
|
72 SkScalar* coverage) { |
|
73 if (SkPaint::kStroke_Style != paint.getStyle()) { |
|
74 return false; |
|
75 } |
|
76 |
|
77 SkScalar strokeWidth = paint.getStrokeWidth(); |
|
78 if (0 == strokeWidth) { |
|
79 *coverage = SK_Scalar1; |
|
80 return true; |
|
81 } |
|
82 |
|
83 if (!paint.isAntiAlias()) { |
|
84 return false; |
|
85 } |
|
86 |
|
87 return SkDrawTreatAAStrokeAsHairline(strokeWidth, matrix, coverage); |
|
88 } |
|
89 |
|
90 #endif |