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