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 #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 */ 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