rsFont.h revision c9fa30536fb41f0166153561388b7c42f7cb85a0
1d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk/*
2d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk * Copyright (C) 2009 The Android Open Source Project
3d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk *
4d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
5d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk * you may not use this file except in compliance with the License.
6d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk * You may obtain a copy of the License at
7d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk *
8d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
9d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk *
10d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
11d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
12d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk * See the License for the specific language governing permissions and
14d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk * limitations under the License.
15d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk */
16d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
17d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk#ifndef ANDROID_RS_FONT_H
18d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk#define ANDROID_RS_FONT_H
19d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
20d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk#include "RenderScript.h"
21d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk#include "rsStream.h"
22d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk#include <utils/String8.h>
23d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk#include <utils/Vector.h>
24d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk#include <utils/KeyedVector.h>
25d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
26d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk#include <ft2build.h>
27d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk#include FT_FREETYPE_H
28d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
29d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk// ---------------------------------------------------------------------------
30d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouknamespace android {
31d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
32d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouknamespace renderscript {
33d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
34c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk// Gamma (>= 1.0, <= 10.0)
35c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk#define PROPERTY_TEXT_GAMMA "ro.text_gamma"
36c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk#define PROPERTY_TEXT_BLACK_GAMMA_THRESHOLD "ro.text_gamma.black_threshold"
37c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk#define PROPERTY_TEXT_WHITE_GAMMA_THRESHOLD "ro.text_gamma.white_threshold"
38c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk
39c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk#define DEFAULT_TEXT_GAMMA 1.4f
40c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk#define DEFAULT_TEXT_BLACK_GAMMA_THRESHOLD 64
41c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk#define DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD 192
42c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk
43d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukclass FontState;
44d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
45d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukclass Font : public ObjectBase
46d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{
47d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukpublic:
48d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ~Font();
49d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
50d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Pointer to the utf data, length of data, where to start, number of glyphs ot read
51d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // (each glyph may be longer than a char because we are dealing with utf data)
52d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Last two variables are the initial pen position
53d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void renderUTF(const char *text, uint32_t len, uint32_t start, int numGlyphs, int x, int y);
54d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
55d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Currently files do not get serialized,
56d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // but we need to inherit from ObjectBase for ref tracking
57d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    virtual void serialize(OStream *stream) const {
58d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    }
59d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    virtual RsA3DClassID getClassId() const {
60d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        return RS_A3D_CLASS_ID_UNKNOWN;
61d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    }
62d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
63d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    static Font * create(Context *rsc, const char *name, uint32_t fontSize, uint32_t dpi);
64d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
65d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukprotected:
66d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
67d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    friend class FontState;
68d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
69d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void invalidateTextureCache();
70d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    struct CachedGlyphInfo
71d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    {
72d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Has the cache been invalidated?
73d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        bool mIsValid;
74d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Location of the cached glyph in the bitmap
75d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // in case we need to resize the texture
76d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mBitmapMinX;
77d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mBitmapMinY;
78d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mBitmapWidth;
79d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mBitmapHeight;
80d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Also cache texture coords for the quad
81d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        float mBitmapMinU;
82d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        float mBitmapMinV;
83d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        float mBitmapMaxU;
84d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        float mBitmapMaxV;
85d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Minimize how much we call freetype
86d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        FT_UInt mGlyphIndex;
87d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        FT_Vector mAdvance;
88d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Values below contain a glyph's origin in the bitmap
89d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        FT_Int mBitmapLeft;
90d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        FT_Int mBitmapTop;
91d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    };
92d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
93d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    String8 mFontName;
94d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    uint32_t mFontSize;
95d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    uint32_t mDpi;
96d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
97d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Font(Context *rsc);
98d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    bool init(const char *name, uint32_t fontSize, uint32_t dpi);
99d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
100d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    FT_Face mFace;
101d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    bool mInitialized;
102d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    bool mHasKerning;
103d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
104d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    DefaultKeyedVector<uint32_t, CachedGlyphInfo* > mCachedGlyphs;
10501bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk    CachedGlyphInfo* getCachedUTFChar(int32_t utfChar);
106d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
107d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    CachedGlyphInfo *cacheGlyph(uint32_t glyph);
108d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void updateGlyphCache(CachedGlyphInfo *glyph);
109d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void drawCachedGlyph(CachedGlyphInfo *glyph, int x, int y);
110d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk};
111d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
112d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukclass FontState
113d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{
114d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukpublic:
115d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    FontState();
116d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ~FontState();
117d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
118d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void init(Context *rsc);
119d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void deinit(Context *rsc);
120d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
121d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<Font> mDefault;
122d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<Font> mLast;
123d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
124d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void renderText(const char *text, uint32_t len, uint32_t startIndex, int numGlyphs, int x, int y);
125d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void renderText(const char *text, int x, int y);
126d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void renderText(Allocation *alloc, int x, int y);
127d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void renderText(Allocation *alloc, uint32_t start, int len, int x, int y);
128d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
1299fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    void setFontColor(float r, float g, float b, float a);
130ca5a454e022caec6c6d3cbb404cc09ea095ba97aAlex Sakhartchouk    void getFontColor(float *r, float *g, float *b, float *a) const;
1319fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk
132d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukprotected:
133d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
134d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    friend class Font;
135d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
136d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    struct CacheTextureLine
137d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    {
138d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mMaxHeight;
139d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mMaxWidth;
140d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mCurrentRow;
141d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mCurrentCol;
14201bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk        bool mDirty;
143d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
144d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        CacheTextureLine(uint32_t maxHeight, uint32_t maxWidth, uint32_t currentRow, uint32_t currentCol) :
14501bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk            mMaxHeight(maxHeight), mMaxWidth(maxWidth), mCurrentRow(currentRow), mCurrentCol(currentCol),
14601bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk            mDirty(false)  {
147d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        }
148d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
149d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        bool fitBitmap(FT_Bitmap *bitmap, uint32_t *retOriginX, uint32_t *retOriginY) {
150d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk            if((uint32_t)bitmap->rows > mMaxHeight) {
151d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk                return false;
152d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk            }
153d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
154d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk            if(mCurrentCol + (uint32_t)bitmap->width < mMaxWidth) {
155d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk               *retOriginX = mCurrentCol;
156d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk               *retOriginY = mCurrentRow;
157d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk               mCurrentCol += bitmap->width;
15801bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk               mDirty = true;
159d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk               return true;
160d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk            }
161d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
162d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk            return false;
163d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        }
164d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    };
165d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
166d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Vector<CacheTextureLine*> mCacheLines;
16701bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk    uint32_t getRemainingCacheCapacity();
16801bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk
16901bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk    void precacheLatin(Font *font);
17001bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk    String8 mLatinPrecache;
171d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
172d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Context *mRSC;
173d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
174c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    struct {
175c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk        float mFontColor[4];
176c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk        float mGamma;
177c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    } mConstants;
178c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    bool mConstantsDirty;
179c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk
180c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    float mBlackGamma;
181c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    float mWhiteGamma;
182c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk
183c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    float mBlackThreshold;
184c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    float mWhiteThreshold;
1859fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk
186d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Free type library, we only need one copy
187d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    FT_Library mLibrary;
188a1ccecd965c07c2739f1258989526051a010bdabAlex Sakhartchouk    FT_Library getLib();
189d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Vector<Font*> mActiveFonts;
190d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
191d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Render state for the font
192e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    ObjectBaseRef<Allocation> mFontShaderFConstant;
193d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<ProgramFragment> mFontShaderF;
194d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<Sampler> mFontSampler;
195d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<ProgramStore> mFontProgramStore;
196d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void initRenderState();
197d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
198d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Texture to cache glyph bitmaps
199d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<Allocation> mTextTexture;
200d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void initTextTexture();
201d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
202d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    bool cacheBitmap(FT_Bitmap *bitmap, uint32_t *retOriginX, uint32_t *retOriginY);
203d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    const Type* getCacheTextureType() {
204d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        return mTextTexture->getType();
205d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    }
206d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
207d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void flushAllAndInvalidate();
208d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
209d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Pointer to vertex data to speed up frame to frame work
210d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    float *mTextMeshPtr;
211d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    uint32_t mCurrentQuadIndex;
212d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    uint32_t mMaxNumberOfQuads;
213d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
214d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void initVertexArrayBuffers();
215d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<Allocation> mIndexBuffer;
216d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<Allocation> mVertexArray;
217d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
218d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
219d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    bool mInitialized;
220d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
221d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void checkInit();
222d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
223d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void issueDrawCommand();
224d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
225d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void appendMeshQuad(float x1, float y1, float z1,
226d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk                          float u1, float v1,
227d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk                          float x2, float y2, float z2,
228d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk                          float u2, float v2,
229d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk                          float x3, float y3, float z3,
230d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk                          float u3, float v3,
231d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk                          float x4, float y4, float z4,
232d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk                          float u4, float v4);
233d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
234d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk};
235d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
236d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
237d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
238d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
239d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
240d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk#endif
241