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;
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  If the current paint is set to stroke and the stroke-width when applied to
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  the matrix is <= 1.0, then this returns true, and sets coverage (simulating
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  a stroke by drawing a hairline with partial coverage). If any of these
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  conditions are false, then this returns false and coverage is ignored.
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDrawTreatAsHairline(const SkPaint&, const SkMatrix&, SkScalar* coverage);
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
71