180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkDrawProcs_DEFINED
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkDrawProcs_DEFINED
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkBlitter.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDraw.h"
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkAAClip;
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkBlitter;
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustruct SkDraw1Glyph {
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkDraw* fDraw;
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkBounder* fBounder;
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkRegion* fClip;
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkAAClip* fAAClip;
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkBlitter* fBlitter;
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkGlyphCache* fCache;
247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    const SkPaint* fPaint;
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkIRect fClipBounds;
26096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /** Half the sampling frequency of the rasterized glyph in x. */
27096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkFixed fHalfSampleX;
28096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /** Half the sampling frequency of the rasterized glyph in y. */
29096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkFixed fHalfSampleY;
30096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
31096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /** Draws one glyph.
32096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *
33096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  The x and y are pre-biased, so implementations may just truncate them.
34096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  i.e. half the sampling frequency has been added.
35096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  e.g. 1/2 or 1/(2^(SkGlyph::kSubBits+1)) has already been added.
36096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  This added bias can be found in fHalfSampleX,Y.
37096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     */
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef void (*Proc)(const SkDraw1Glyph&, SkFixed x, SkFixed y, const SkGlyph&);
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    Proc init(const SkDraw* draw, SkBlitter* blitter, SkGlyphCache* cache,
417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger              const SkPaint&);
427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    // call this instead of fBlitter->blitMask() since this wrapper will handle
447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    // the case when the mask is ARGB32_Format
457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    //
467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    void blitMask(const SkMask& mask, const SkIRect& clip) const {
477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        if (SkMask::kARGB32_Format == mask.fFormat) {
487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            this->blitMaskAsSprite(mask);
497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        } else {
507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fBlitter->blitMask(mask, clip);
517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    // mask must be kARGB32_Format
557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    void blitMaskAsSprite(const SkMask& mask) const;
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustruct SkDrawProcs {
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDraw1Glyph::Proc  fD1GProc;
60910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger#if SK_DISTANCEFIELD_FONTS
61910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    uint32_t            fFlags;
62910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger
63910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    enum Flags {
64910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        /**
65910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger         * Disable baked glyph transforms
66910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger         */
67910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        kSkipBakedGlyphTransform_Flag = 0x1,
68910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        /**
69910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger         * Scale glyphs to get different point sizes
70910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger         */
71910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        kUseScaledGlyphs_Flag         = 0x2,
72910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    };
73910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger
74910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    static const int kBaseDFFontSize = 32;
75910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger#endif
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
78910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenbergerbool SkDrawTreatAAStrokeAsHairline(SkScalar strokeWidth, const SkMatrix&,
79910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger                                   SkScalar* coverage);
80910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  If the current paint is set to stroke and the stroke-width when applied to
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  the matrix is <= 1.0, then this returns true, and sets coverage (simulating
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  a stroke by drawing a hairline with partial coverage). If any of these
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  conditions are false, then this returns false and coverage is ignored.
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
87910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenbergerinline bool SkDrawTreatAsHairline(const SkPaint& paint, const SkMatrix& matrix,
88910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger                                  SkScalar* coverage) {
89910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    if (SkPaint::kStroke_Style != paint.getStyle()) {
90910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        return false;
91910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    }
92910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger
93910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    SkScalar strokeWidth = paint.getStrokeWidth();
94910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    if (0 == strokeWidth) {
95910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        *coverage = SK_Scalar1;
96910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        return true;
97910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    }
98910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger
99910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    if (!paint.isAntiAlias()) {
100910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        return false;
101910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    }
102910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger
103910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    return SkDrawTreatAAStrokeAsHairline(strokeWidth, matrix, coverage);
104910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger}
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
107