| /* |
| * 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 |