rsFont.h revision 59f6142d7657e43b4d21e077a28387431db02edf
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 "rsStream.h"
21b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni#include <utils/KeyedVector.h>
2259f6142d7657e43b4d21e077a28387431db02edfMiao Wang#include <utils/Unicode.h>
23d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
2402000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchoukstruct FT_LibraryRec_;
2502000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchoukstruct FT_FaceRec_;
2602000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchoukstruct FT_Bitmap_;
27d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
28d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk// ---------------------------------------------------------------------------
29d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouknamespace android {
30d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
31d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouknamespace renderscript {
32d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
33c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk// Gamma (>= 1.0, <= 10.0)
34c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk#define PROPERTY_TEXT_GAMMA "ro.text_gamma"
35c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk#define PROPERTY_TEXT_BLACK_GAMMA_THRESHOLD "ro.text_gamma.black_threshold"
36c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk#define PROPERTY_TEXT_WHITE_GAMMA_THRESHOLD "ro.text_gamma.white_threshold"
37c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk
38c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk#define DEFAULT_TEXT_GAMMA 1.4f
39c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk#define DEFAULT_TEXT_BLACK_GAMMA_THRESHOLD 64
40c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk#define DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD 192
41c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk
42d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukclass FontState;
43d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
44afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukclass Font : public ObjectBase {
45d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukpublic:
4609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    enum RenderMode {
4709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        FRAMEBUFFER,
4809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        BITMAP,
4909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        MEASURE,
5009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    };
51d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
5209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    struct Rect {
5309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        int32_t left;
5409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        int32_t top;
5509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        int32_t right;
5609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        int32_t bottom;
5709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        void set(int32_t l, int32_t r, int32_t t, int32_t b) {
5809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk            left = l;
5909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk            right = r;
6009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk            top = t;
6109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk            bottom = b;
6209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        }
6309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    };
6409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
6509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    ~Font();
66d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
67d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Currently files do not get serialized,
68d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // but we need to inherit from ObjectBase for ref tracking
69e3150cfb3edb028407669e4a65e087eae77e718cJason Sams    virtual void serialize(Context *rsc, OStream *stream) const {
70d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    }
71d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    virtual RsA3DClassID getClassId() const {
72d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        return RS_A3D_CLASS_ID_UNKNOWN;
73d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    }
74d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
755224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk    static Font * create(Context *rsc, const char *name, float fontSize, uint32_t dpi,
7644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes                         const void *data = nullptr, uint32_t dataLen = 0);
77d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
78d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukprotected:
79d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
80d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    friend class FontState;
81d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
8209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    // Pointer to the utf data, length of data, where to start, number of glyphs ot read
8309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    // (each glyph may be longer than a char because we are dealing with utf data)
8409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    // Last two variables are the initial pen position
8509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    void renderUTF(const char *text, uint32_t len, int32_t x, int32_t y,
8609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                   uint32_t start, int32_t numGlyphs,
8744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes                   RenderMode mode = FRAMEBUFFER, Rect *bounds = nullptr,
8844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes                   uint8_t *bitmap = nullptr, uint32_t bitmapW = 0, uint32_t bitmapH = 0);
8909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
90d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void invalidateTextureCache();
91d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    struct CachedGlyphInfo
92d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    {
93d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Has the cache been invalidated?
94d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        bool mIsValid;
95d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Location of the cached glyph in the bitmap
96d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // in case we need to resize the texture
97d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mBitmapMinX;
98d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mBitmapMinY;
99d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mBitmapWidth;
100d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mBitmapHeight;
101d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Also cache texture coords for the quad
102d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        float mBitmapMinU;
103d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        float mBitmapMinV;
104d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        float mBitmapMaxU;
105d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        float mBitmapMaxV;
106d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Minimize how much we call freetype
10702000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk        int32_t mGlyphIndex;
10802000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk        int32_t mAdvanceX;
10902000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk        int32_t mAdvanceY;
110d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Values below contain a glyph's origin in the bitmap
11102000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk        int32_t mBitmapLeft;
11202000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk        int32_t mBitmapTop;
113d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    };
114d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
11548ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams    const char *mFontName;
116c17ace2391783dcabc6c1482edf0362654fd83e5Alex Sakhartchouk    float mFontSize;
117d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    uint32_t mDpi;
118d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
11910ab8bb0fa510bdb577adce5e67b6bf35882a9ddChih-Hung Hsieh    explicit Font(Context *rsc);
12044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    bool init(const char *name, float fontSize, uint32_t dpi, const void *data = nullptr, uint32_t dataLen = 0);
121d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
1222e8665de7c0eb4514c67baf8693d61c892e5303dJason Sams    virtual void preDestroy() const;
12302000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk    FT_FaceRec_ *mFace;
124d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    bool mInitialized;
125d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    bool mHasKerning;
126d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
127b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni    DefaultKeyedVector<uint32_t, CachedGlyphInfo* > mCachedGlyphs;
12801bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk    CachedGlyphInfo* getCachedUTFChar(int32_t utfChar);
129d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
130d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    CachedGlyphInfo *cacheGlyph(uint32_t glyph);
131d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void updateGlyphCache(CachedGlyphInfo *glyph);
13209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    void measureCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y, Rect *bounds);
13309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    void drawCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y);
13409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    void drawCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y,
13509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                         uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH);
136d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk};
137d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
138afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukclass FontState {
139d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukpublic:
140d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    FontState();
141d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ~FontState();
142d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
143d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void init(Context *rsc);
144d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void deinit(Context *rsc);
145d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
146d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<Font> mDefault;
147d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
14809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    void renderText(const char *text, uint32_t len, int32_t x, int32_t y,
14909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                    uint32_t startIndex = 0, int numGlyphs = -1,
15009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                    Font::RenderMode mode = Font::FRAMEBUFFER,
15144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes                    Font::Rect *bounds = nullptr,
15244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes                    uint8_t *bitmap = nullptr, uint32_t bitmapW = 0, uint32_t bitmapH = 0);
15309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
15409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    void measureText(const char *text, uint32_t len, Font::Rect *bounds);
155d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
1569fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    void setFontColor(float r, float g, float b, float a);
157ca5a454e022caec6c6d3cbb404cc09ea095ba97aAlex Sakhartchouk    void getFontColor(float *r, float *g, float *b, float *a) const;
1589fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk
159d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukprotected:
160d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
161a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk    float mSurfaceWidth;
162a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk    float mSurfaceHeight;
163a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk
164d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    friend class Font;
165d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
166afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    struct CacheTextureLine {
167d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mMaxHeight;
168d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mMaxWidth;
169d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mCurrentRow;
170d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mCurrentCol;
17101bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk        bool mDirty;
172d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
173afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk        CacheTextureLine(uint32_t maxHeight, uint32_t maxWidth, uint32_t currentRow, uint32_t currentCol)
174afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk            : mMaxHeight(maxHeight), mMaxWidth(maxWidth), mCurrentRow(currentRow),
175afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk              mCurrentCol(currentCol), mDirty(false)  {
176d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        }
177d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
17802000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk        bool fitBitmap(FT_Bitmap_ *bitmap, uint32_t *retOriginX, uint32_t *retOriginY);
179d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    };
180d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
18182e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang    std::vector<CacheTextureLine*> mCacheLines;
18201bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk    uint32_t getRemainingCacheCapacity();
18301bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk
18401bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk    void precacheLatin(Font *font);
185a7f5e0406825151660c1c2e75c287e2fc8368023Jason Sams    const char *mLatinPrecache;
186d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
187d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Context *mRSC;
188d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
189c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    struct {
190c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk        float mFontColor[4];
191c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk        float mGamma;
192c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    } mConstants;
193c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    bool mConstantsDirty;
194c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk
195c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    float mBlackGamma;
196c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    float mWhiteGamma;
197c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk
198c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    float mBlackThreshold;
199c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    float mWhiteThreshold;
2009fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk
201d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Free type library, we only need one copy
202b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
20302000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk    FT_LibraryRec_ *mLibrary;
20402000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk    FT_LibraryRec_ *getLib();
205b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk#endif //ANDROID_RS_SERIALIZE
20682e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang    std::vector<Font*> mActiveFonts;
207d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
208d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Render state for the font
209e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    ObjectBaseRef<Allocation> mFontShaderFConstant;
210d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<ProgramFragment> mFontShaderF;
211d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<Sampler> mFontSampler;
212d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<ProgramStore> mFontProgramStore;
213d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void initRenderState();
214d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
215d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Texture to cache glyph bitmaps
216d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<Allocation> mTextTexture;
217a6dd823b9dcbd7ce7dfc34eda52a1e4104771f79Jason Sams    uint8_t *mCacheBuffer;
218a6dd823b9dcbd7ce7dfc34eda52a1e4104771f79Jason Sams    uint32_t mCacheWidth;
219a6dd823b9dcbd7ce7dfc34eda52a1e4104771f79Jason Sams    uint32_t mCacheHeight;
220a6dd823b9dcbd7ce7dfc34eda52a1e4104771f79Jason Sams
221d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void initTextTexture();
222d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
223b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
22402000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk    bool cacheBitmap(FT_Bitmap_ *bitmap, uint32_t *retOriginX, uint32_t *retOriginY);
225b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk#endif //ANDROID_RS_SERIALIZE
226d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    const Type* getCacheTextureType() {
227d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        return mTextTexture->getType();
228d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    }
229d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
230d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void flushAllAndInvalidate();
231d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
232d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Pointer to vertex data to speed up frame to frame work
233d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    float *mTextMeshPtr;
234d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    uint32_t mCurrentQuadIndex;
235d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    uint32_t mMaxNumberOfQuads;
236d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
237d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void initVertexArrayBuffers();
238a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    ObjectBaseRef<Mesh> mMesh;
239d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
240d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    bool mInitialized;
241d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
242d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void checkInit();
243d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
244d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void issueDrawCommand();
245d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
246d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void appendMeshQuad(float x1, float y1, float z1,
247afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                        float u1, float v1,
248afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                        float x2, float y2, float z2,
249afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                        float u2, float v2,
250afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                        float x3, float y3, float z3,
251afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                        float u3, float v3,
252afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                        float x4, float y4, float z4,
253afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                        float u4, float v4);
254d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk};
255d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
2567974fc03e11f3a8dd40f794f3b33b4889483090cRahul Chaudhry} // namespace renderscript
2577974fc03e11f3a8dd40f794f3b33b4889483090cRahul Chaudhry} // namespace android
258d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
259d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk#endif
260