Home | History | Annotate | Download | only in core
      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