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