/* * Copyright 2014 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrStencilAndCoverTextContext_DEFINED #define GrStencilAndCoverTextContext_DEFINED #include "GrTextContext.h" #include "GrDrawState.h" #include "GrDrawTarget.h" #include "SkStrokeRec.h" class GrTextStrike; class GrPath; /* * This class implements text rendering using stencil and cover path rendering * (by the means of GrDrawTarget::drawPath). * This class exposes the functionality through GrTextContext interface. */ class GrStencilAndCoverTextContext : public GrTextContext { public: GrStencilAndCoverTextContext(GrContext*, const SkDeviceProperties&); virtual ~GrStencilAndCoverTextContext(); virtual void drawText(const GrPaint&, const SkPaint&, const char text[], size_t byteLength, SkScalar x, SkScalar y) SK_OVERRIDE; virtual void drawPosText(const GrPaint&, const SkPaint&, const char text[], size_t byteLength, const SkScalar pos[], SkScalar constY, int scalarsPerPosition) SK_OVERRIDE; virtual bool canDraw(const SkPaint& paint) SK_OVERRIDE; private: class GlyphPathRange; static const int kGlyphBufferSize = 1024; enum DeviceSpaceGlyphsBehavior { kUseIfNeeded_DeviceSpaceGlyphsBehavior, kDoNotUse_DeviceSpaceGlyphsBehavior, }; void init(const GrPaint&, const SkPaint&, size_t textByteLength, DeviceSpaceGlyphsBehavior, SkScalar textTranslateY = 0); void initGlyphs(SkGlyphCache* cache); void appendGlyph(uint16_t glyphID, float x); void appendGlyph(uint16_t glyphID, float x, float y); void flush(); void finish(); GrDrawState::AutoRestoreEffects fStateRestore; SkScalar fTextRatio; float fTextInverseRatio; SkStrokeRec fStroke; SkGlyphCache* fGlyphCache; GlyphPathRange* fGlyphs; uint32_t fIndexBuffer[kGlyphBufferSize]; float fTransformBuffer[2 * kGlyphBufferSize]; GrDrawTarget::PathTransformType fTransformType; int fPendingGlyphCount; SkMatrix fContextInitialMatrix; bool fNeedsDeviceSpaceGlyphs; }; #endif