• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     //
blitMaskSkDraw1Glyph46     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 #if SK_DISTANCEFIELD_FONTS
61     uint32_t            fFlags;
62 
63     enum Flags {
64         /**
65          * Disable baked glyph transforms
66          */
67         kSkipBakedGlyphTransform_Flag = 0x1,
68         /**
69          * Scale glyphs to get different point sizes
70          */
71         kUseScaledGlyphs_Flag         = 0x2,
72     };
73 
74     static const int kBaseDFFontSize = 32;
75 #endif
76 };
77 
78 bool SkDrawTreatAAStrokeAsHairline(SkScalar strokeWidth, const SkMatrix&,
79                                    SkScalar* coverage);
80 
81 /**
82  *  If the current paint is set to stroke and the stroke-width when applied to
83  *  the matrix is <= 1.0, then this returns true, and sets coverage (simulating
84  *  a stroke by drawing a hairline with partial coverage). If any of these
85  *  conditions are false, then this returns false and coverage is ignored.
86  */
SkDrawTreatAsHairline(const SkPaint & paint,const SkMatrix & matrix,SkScalar * coverage)87 inline bool SkDrawTreatAsHairline(const SkPaint& paint, const SkMatrix& matrix,
88                                   SkScalar* coverage) {
89     if (SkPaint::kStroke_Style != paint.getStyle()) {
90         return false;
91     }
92 
93     SkScalar strokeWidth = paint.getStrokeWidth();
94     if (0 == strokeWidth) {
95         *coverage = SK_Scalar1;
96         return true;
97     }
98 
99     if (!paint.isAntiAlias()) {
100         return false;
101     }
102 
103     return SkDrawTreatAAStrokeAsHairline(strokeWidth, matrix, coverage);
104 }
105 
106 #endif
107