diff options
Diffstat (limited to 'libs/hwui/FontRenderer.h')
| -rw-r--r-- | libs/hwui/FontRenderer.h | 68 |
1 files changed, 54 insertions, 14 deletions
diff --git a/libs/hwui/FontRenderer.h b/libs/hwui/FontRenderer.h index 307a1d9..aa7e776 100644 --- a/libs/hwui/FontRenderer.h +++ b/libs/hwui/FontRenderer.h @@ -17,8 +17,10 @@ #ifndef ANDROID_HWUI_FONT_RENDERER_H #define ANDROID_HWUI_FONT_RENDERER_H +#include <utils/Functor.h> #include <utils/LruCache.h> #include <utils/Vector.h> +#include <utils/StrongPointer.h> #include <SkPaint.h> @@ -32,19 +34,55 @@ #include "Matrix.h" #include "Properties.h" +#ifdef ANDROID_ENABLE_RENDERSCRIPT +#include "RenderScript.h" namespace RSC { class Element; class RS; class ScriptIntrinsicBlur; + class sp; } +#endif class Functor; namespace android { namespace uirenderer { +class OpenGLRenderer; + /////////////////////////////////////////////////////////////////////////////// -// Renderer +// TextSetupFunctor +/////////////////////////////////////////////////////////////////////////////// +class TextSetupFunctor: public Functor { +public: + struct Data { + Data(GLenum glyphFormat) : glyphFormat(glyphFormat) { + } + + GLenum glyphFormat; + }; + + TextSetupFunctor(OpenGLRenderer* renderer, float x, float y, bool pureTranslate, + int alpha, SkXfermode::Mode mode, SkPaint* paint): Functor(), + renderer(renderer), x(x), y(y), pureTranslate(pureTranslate), + alpha(alpha), mode(mode), paint(paint) { + } + ~TextSetupFunctor() { } + + status_t operator ()(int what, void* data); + + OpenGLRenderer* renderer; + float x; + float y; + bool pureTranslate; + int alpha; + SkXfermode::Mode mode; + SkPaint* paint; +}; + +/////////////////////////////////////////////////////////////////////////////// +// FontRenderer /////////////////////////////////////////////////////////////////////////////// class FontRenderer { @@ -52,6 +90,7 @@ public: FontRenderer(); ~FontRenderer(); + void flushLargeCaches(Vector<CacheTexture*>& cacheTextures); void flushLargeCaches(); void setGammaTable(const uint8_t* gammaTable) { @@ -70,7 +109,8 @@ public: // bounds is an out parameter bool renderTextOnPath(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex, - uint32_t len, int numGlyphs, SkPath* path, float hOffset, float vOffset, Rect* bounds); + uint32_t len, int numGlyphs, SkPath* path, float hOffset, float vOffset, Rect* bounds, + Functor* functor); struct DropShadow { DropShadow() { }; @@ -97,30 +137,29 @@ public: mLinearFiltering = linearFiltering; } - uint32_t getCacheSize() const; + uint32_t getCacheSize(GLenum format) const; private: friend class Font; - static const uint32_t gMaxNumberOfQuads = 2048; - const uint8_t* mGammaTable; void allocateTextureMemory(CacheTexture* cacheTexture); void deallocateTextureMemory(CacheTexture* cacheTexture); void initTextTexture(); - CacheTexture* createCacheTexture(int width, int height, bool allocate); + CacheTexture* createCacheTexture(int width, int height, GLenum format, bool allocate); void cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyph, uint32_t *retOriginX, uint32_t *retOriginY, bool precaching); - CacheTexture* cacheBitmapInTexture(const SkGlyph& glyph, uint32_t* startX, uint32_t* startY); + CacheTexture* cacheBitmapInTexture(Vector<CacheTexture*>& cacheTextures, const SkGlyph& glyph, + uint32_t* startX, uint32_t* startY); void flushAllAndInvalidate(); - void initVertexArrayBuffers(); void checkInit(); void initRender(const Rect* clip, Rect* bounds, Functor* functor); void finishRender(); + void issueDrawCommand(Vector<CacheTexture*>& cacheTextures); void issueDrawCommand(); void appendMeshQuadNoClip(float x1, float y1, float u1, float v1, float x2, float y2, float u2, float v2, @@ -148,7 +187,8 @@ private: uint32_t mLargeCacheWidth; uint32_t mLargeCacheHeight; - Vector<CacheTexture*> mCacheTextures; + Vector<CacheTexture*> mACacheTextures; + Vector<CacheTexture*> mRGBACacheTextures; Font* mCurrentFont; LruCache<Font::FontDescription, Font*> mActiveFonts; @@ -157,8 +197,6 @@ private: bool mUploadTexture; - uint32_t mIndexBufferID; - Functor* mFunctor; const Rect* mClip; Rect* mBounds; @@ -168,10 +206,12 @@ private: bool mLinearFiltering; +#ifdef ANDROID_ENABLE_RENDERSCRIPT // RS constructs - sp<RSC::RS> mRs; - sp<const RSC::Element> mRsElement; - sp<RSC::ScriptIntrinsicBlur> mRsScript; + RSC::sp<RSC::RS> mRs; + RSC::sp<const RSC::Element> mRsElement; + RSC::sp<RSC::ScriptIntrinsicBlur> mRsScript; +#endif static void computeGaussianWeights(float* weights, int32_t radius); static void horizontalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest, |
