rsFont.h revision a6dd823b9dcbd7ce7dfc34eda52a1e4104771f79
16f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/*
26f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Copyright (C) 2009 The Android Open Source Project
36f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
46f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
56f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * you may not use this file except in compliance with the License.
66f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * You may obtain a copy of the License at
76f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
86f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
96f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Unless required by applicable law or agreed to in writing, software
116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * See the License for the specific language governing permissions and
146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * limitations under the License.
156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */
166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
176f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#ifndef ANDROID_RS_FONT_H
18ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#define ANDROID_RS_FONT_H
19ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
20ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "rsStream.h"
21ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include <utils/String8.h>
226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <utils/Vector.h>
231ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include <utils/KeyedVector.h>
246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
25d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinskistruct FT_LibraryRec_;
26467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinskistruct FT_FaceRec_;
276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct FT_Bitmap_;
2890919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski
29e597d68d33c76c2b830f5497ed4ba74c5193a056Adam Lesinski// ---------------------------------------------------------------------------
30e597d68d33c76c2b830f5497ed4ba74c5193a056Adam Lesinskinamespace android {
31e597d68d33c76c2b830f5497ed4ba74c5193a056Adam Lesinski
3290919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinskinamespace renderscript {
33d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski
346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski// Gamma (>= 1.0, <= 10.0)
356f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#define PROPERTY_TEXT_GAMMA "ro.text_gamma"
3690919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski#define PROPERTY_TEXT_BLACK_GAMMA_THRESHOLD "ro.text_gamma.black_threshold"
376f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#define PROPERTY_TEXT_WHITE_GAMMA_THRESHOLD "ro.text_gamma.white_threshold"
381ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
39ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#define DEFAULT_TEXT_GAMMA 1.4f
40cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski#define DEFAULT_TEXT_BLACK_GAMMA_THRESHOLD 64
4190919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski#define DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD 192
42cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
43ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinskiclass FontState;
44ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
45ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinskiclass Font : public ObjectBase {
46769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinskipublic:
47769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    enum RenderMode {
48ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski        FRAMEBUFFER,
49ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski        BITMAP,
5090919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski        MEASURE,
5190919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski    };
5290919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski
531ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    struct Rect {
54ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski        int32_t left;
55ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski        int32_t top;
56cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski        int32_t right;
5752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski        int32_t bottom;
5890919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski        void set(int32_t l, int32_t r, int32_t t, int32_t b) {
59cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski            left = l;
60cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski            right = r;
61cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski            top = t;
6290919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski            bottom = b;
6390919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski        }
64cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    };
65ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
66cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    ~Font();
676f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
68cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    // Currently files do not get serialized,
69cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    // but we need to inherit from ObjectBase for ref tracking
70ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    virtual void serialize(Context *rsc, OStream *stream) const {
71ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    }
72ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    virtual RsA3DClassID getClassId() const {
73ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski        return RS_A3D_CLASS_ID_UNKNOWN;
746f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    }
756f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
766f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    static Font * create(Context *rsc, const char *name, float fontSize, uint32_t dpi,
77cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                         const void *data = NULL, uint32_t dataLen = 0);
78ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
796f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiprotected:
80ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
81cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    friend class FontState;
82cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
837542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    // Pointer to the utf data, length of data, where to start, number of glyphs ot read
846f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    // (each glyph may be longer than a char because we are dealing with utf data)
856f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    // Last two variables are the initial pen position
866f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    void renderUTF(const char *text, uint32_t len, int32_t x, int32_t y,
87cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                   uint32_t start, int32_t numGlyphs,
88ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                   RenderMode mode = FRAMEBUFFER, Rect *bounds = NULL,
896f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski                   uint8_t *bitmap = NULL, uint32_t bitmapW = 0, uint32_t bitmapH = 0);
90ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
91cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    void invalidateTextureCache();
92cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    struct CachedGlyphInfo
937542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    {
946f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski        // Has the cache been invalidated?
956f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski        bool mIsValid;
969f22204c3a9ddac4f92573c9ab098e6cf3ed1cb4Adam Lesinski        // Location of the cached glyph in the bitmap
97cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski        // in case we need to resize the texture
98ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski        uint32_t mBitmapMinX;
999f22204c3a9ddac4f92573c9ab098e6cf3ed1cb4Adam Lesinski        uint32_t mBitmapMinY;
100cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski        uint32_t mBitmapWidth;
101ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski        uint32_t mBitmapHeight;
1029f22204c3a9ddac4f92573c9ab098e6cf3ed1cb4Adam Lesinski        // Also cache texture coords for the quad
1039f22204c3a9ddac4f92573c9ab098e6cf3ed1cb4Adam Lesinski        float mBitmapMinU;
1048c3f31f022f7e094fd227ef0c2987e0846cb3e43Adam Lesinski        float mBitmapMinV;
105cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski        float mBitmapMaxU;
1067542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski        float mBitmapMaxV;
107cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski        // Minimize how much we call freetype
1088049f3da712ea9c3154b57ce2276c97e749d1f2cAdam Lesinski        int32_t mGlyphIndex;
109ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski        int32_t mAdvanceX;
1108c3f31f022f7e094fd227ef0c2987e0846cb3e43Adam Lesinski        int32_t mAdvanceY;
111ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski        // Values below contain a glyph's origin in the bitmap
112cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski        int32_t mBitmapLeft;
1138c3f31f022f7e094fd227ef0c2987e0846cb3e43Adam Lesinski        int32_t mBitmapTop;
1148049f3da712ea9c3154b57ce2276c97e749d1f2cAdam Lesinski    };
115ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
1168049f3da712ea9c3154b57ce2276c97e749d1f2cAdam Lesinski    String8 mFontName;
1177542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    float mFontSize;
1188c3f31f022f7e094fd227ef0c2987e0846cb3e43Adam Lesinski    uint32_t mDpi;
119cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
120ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    Font(Context *rsc);
1218049f3da712ea9c3154b57ce2276c97e749d1f2cAdam Lesinski    bool init(const char *name, float fontSize, uint32_t dpi, const void *data = NULL, uint32_t dataLen = 0);
1228049f3da712ea9c3154b57ce2276c97e749d1f2cAdam Lesinski
1238049f3da712ea9c3154b57ce2276c97e749d1f2cAdam Lesinski    virtual void preDestroy() const;
1248049f3da712ea9c3154b57ce2276c97e749d1f2cAdam Lesinski    FT_FaceRec_ *mFace;
1258049f3da712ea9c3154b57ce2276c97e749d1f2cAdam Lesinski    bool mInitialized;
1268c3f31f022f7e094fd227ef0c2987e0846cb3e43Adam Lesinski    bool mHasKerning;
1278c3f31f022f7e094fd227ef0c2987e0846cb3e43Adam Lesinski
1288c3f31f022f7e094fd227ef0c2987e0846cb3e43Adam Lesinski    DefaultKeyedVector<uint32_t, CachedGlyphInfo* > mCachedGlyphs;
129cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    CachedGlyphInfo* getCachedUTFChar(int32_t utfChar);
130ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
1318c3f31f022f7e094fd227ef0c2987e0846cb3e43Adam Lesinski    CachedGlyphInfo *cacheGlyph(uint32_t glyph);
132ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    void updateGlyphCache(CachedGlyphInfo *glyph);
133cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    void measureCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y, Rect *bounds);
134cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    void drawCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y);
1357542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    void drawCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y,
1368c3f31f022f7e094fd227ef0c2987e0846cb3e43Adam Lesinski                         uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH);
137cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski};
138ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
1398c3f31f022f7e094fd227ef0c2987e0846cb3e43Adam Lesinskiclass FontState {
140ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinskipublic:
141cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    FontState();
142cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    ~FontState();
1438c3f31f022f7e094fd227ef0c2987e0846cb3e43Adam Lesinski
1448c3f31f022f7e094fd227ef0c2987e0846cb3e43Adam Lesinski    void init(Context *rsc);
1457542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    void deinit(Context *rsc);
1467542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski
1477542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    ObjectBaseRef<Font> mDefault;
1487542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski
1497542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    void renderText(const char *text, uint32_t len, int32_t x, int32_t y,
1507542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski                    uint32_t startIndex = 0, int numGlyphs = -1,
1517542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski                    Font::RenderMode mode = Font::FRAMEBUFFER,
1527542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski                    Font::Rect *bounds = NULL,
1537542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski                    uint8_t *bitmap = NULL, uint32_t bitmapW = 0, uint32_t bitmapH = 0);
1547542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski
1557542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    void measureText(const char *text, uint32_t len, Font::Rect *bounds);
1567542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski
1577542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    void setFontColor(float r, float g, float b, float a);
1587542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    void getFontColor(float *r, float *g, float *b, float *a) const;
1597542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski
1607542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinskiprotected:
1617542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski
1627542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    float mSurfaceWidth;
1637542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    float mSurfaceHeight;
1647542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski
1657542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    friend class Font;
1667542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski
1677542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    struct CacheTextureLine {
168ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski        uint32_t mMaxHeight;
1691ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        uint32_t mMaxWidth;
170ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski        uint32_t mCurrentRow;
171cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski        uint32_t mCurrentCol;
172cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski        bool mDirty;
1737542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski
1747542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski        CacheTextureLine(uint32_t maxHeight, uint32_t maxWidth, uint32_t currentRow, uint32_t currentCol)
1757542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski            : mMaxHeight(maxHeight), mMaxWidth(maxWidth), mCurrentRow(currentRow),
1767542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski              mCurrentCol(currentCol), mDirty(false)  {
1777542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski        }
1787542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski
1797542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski        bool fitBitmap(FT_Bitmap_ *bitmap, uint32_t *retOriginX, uint32_t *retOriginY);
1807542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    };
1817542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski
1827542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    Vector<CacheTextureLine*> mCacheLines;
1837542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    uint32_t getRemainingCacheCapacity();
1847542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski
1857542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    void precacheLatin(Font *font);
1867542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    String8 mLatinPrecache;
1877542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski
1887542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    Context *mRSC;
1897542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski
1907542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    struct {
1917542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski        float mFontColor[4];
1927542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski        float mGamma;
1937542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    } mConstants;
1947542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    bool mConstantsDirty;
1957542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski
1967542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    float mBlackGamma;
1977542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    float mWhiteGamma;
1987542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski
1997542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski    float mBlackThreshold;
2001ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    float mWhiteThreshold;
2011ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
202dfa5e0705ff82f15e228ba076bc192893bcbe118Adam Lesinski    // Free type library, we only need one copy
203cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski#ifndef ANDROID_RS_SERIALIZE
204ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    FT_LibraryRec_ *mLibrary;
205cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    FT_LibraryRec_ *getLib();
206cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski#endif //ANDROID_RS_SERIALIZE
207cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    Vector<Font*> mActiveFonts;
2087542162cb1b1fd2ce8a26dd7f3fedc8de8160d38Adam Lesinski
209cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    // Render state for the font
21090919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski    ObjectBaseRef<Allocation> mFontShaderFConstant;
21190919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski    ObjectBaseRef<ProgramFragment> mFontShaderF;
21290919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski    ObjectBaseRef<Sampler> mFontSampler;
21390919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski    ObjectBaseRef<ProgramStore> mFontProgramStore;
21490919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski    void initRenderState();
215dfa5e0705ff82f15e228ba076bc192893bcbe118Adam Lesinski
216dfa5e0705ff82f15e228ba076bc192893bcbe118Adam Lesinski    // Texture to cache glyph bitmaps
217dfa5e0705ff82f15e228ba076bc192893bcbe118Adam Lesinski    ObjectBaseRef<Allocation> mTextTexture;
218cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    uint8_t *mCacheBuffer;
219ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    uint32_t mCacheWidth;
220dfa5e0705ff82f15e228ba076bc192893bcbe118Adam Lesinski    uint32_t mCacheHeight;
22190919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski
222cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    void initTextTexture();
223cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
224cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski#ifndef ANDROID_RS_SERIALIZE
225dfa5e0705ff82f15e228ba076bc192893bcbe118Adam Lesinski    bool cacheBitmap(FT_Bitmap_ *bitmap, uint32_t *retOriginX, uint32_t *retOriginY);
226dfa5e0705ff82f15e228ba076bc192893bcbe118Adam Lesinski#endif //ANDROID_RS_SERIALIZE
2276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    const Type* getCacheTextureType() {
228cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski        return mTextTexture->getType();
229cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    }
230cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
231ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    void flushAllAndInvalidate();
232cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
233ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    // Pointer to vertex data to speed up frame to frame work
234cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    float *mTextMeshPtr;
235ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    uint32_t mCurrentQuadIndex;
236cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    uint32_t mMaxNumberOfQuads;
237ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
238cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    void initVertexArrayBuffers();
239ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    ObjectBaseRef<Mesh> mMesh;
240cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
241cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    bool mInitialized;
242cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
243cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    void checkInit();
244cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
245cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    void issueDrawCommand();
24690919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski
247ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    void appendMeshQuad(float x1, float y1, float z1,
24890919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski                        float u1, float v1,
24990919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski                        float x2, float y2, float z2,
25090919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski                        float u2, float v2,
25190919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski                        float x3, float y3, float z3,
25290919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski                        float u3, float v3,
253ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                        float x4, float y4, float z4,
25452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski                        float u4, float v4);
25590919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski};
25690919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski
25790919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski}
25852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
259ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
260ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#endif
261ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski