/* * Copyright 2010 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrTextContext_DEFINED #define GrTextContext_DEFINED #include "GrGlyph.h" #include "GrMatrix.h" #include "GrRefCnt.h" class GrContext; class GrFontScaler; class GrPaint; class SkGpuDevice; class SkPaint; /** * Derived classes can use stages GrPaint::kTotalStages through * GrDrawState::kNumStages-1. The stages before GrPaint::kTotalStages * are reserved for setting up the draw (i.e., textures and filter masks). */ class GrTextContext: public GrRefCnt { protected: GrContext* fContext; public: /** * To use a text context it must be wrapped in an AutoFinish. AutoFinish's * destructor ensures all drawing is flushed to the GrContext. */ class AutoFinish { public: AutoFinish(GrTextContext* textContext, GrContext* context, const GrPaint&, const GrMatrix* extMatrix); ~AutoFinish(); GrTextContext* getTextContext() const; private: GrTextContext* fTextContext; }; virtual void drawPackedGlyph(GrGlyph::PackedID, GrFixed left, GrFixed top, GrFontScaler*) = 0; virtual ~GrTextContext() {} protected: GrTextContext() { fContext = NULL; } bool isValid() const { return (NULL != fContext); } /** * Initialize the object. * * Before call to this method, the instance is considered to be in * invalid state. I.e. call to any method other than isValid will result in * undefined behaviour. * * @see finish */ virtual void init(GrContext* context, const GrPaint&, const GrMatrix* extMatrix) { fContext = context; } /** * Reset the object to invalid state. * * After call to this method, the instance is considered to be in * invalid state. * * It might be brought back to a valid state by calling init. * * @see init */ virtual void finish() { fContext = NULL; } private: typedef GrRefCnt INHERITED; }; inline GrTextContext::AutoFinish::AutoFinish(GrTextContext* textContext, GrContext* context, const GrPaint& grPaint, const GrMatrix* extMatrix) { GrAssert(NULL != textContext); fTextContext = textContext; fTextContext->ref(); fTextContext->init(context, grPaint, extMatrix); } inline GrTextContext::AutoFinish::~AutoFinish() { fTextContext->finish(); fTextContext->unref(); } inline GrTextContext* GrTextContext::AutoFinish::getTextContext() const { return fTextContext; } #endif