rsFont.h revision a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2
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
2602000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchoukstruct FT_LibraryRec_;
2702000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchoukstruct FT_FaceRec_;
2802000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchoukstruct FT_Bitmap_;
29d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
30d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk// ---------------------------------------------------------------------------
31d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouknamespace android {
32d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
33d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouknamespace renderscript {
34d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
35c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk// Gamma (>= 1.0, <= 10.0)
36c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk#define PROPERTY_TEXT_GAMMA "ro.text_gamma"
37c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk#define PROPERTY_TEXT_BLACK_GAMMA_THRESHOLD "ro.text_gamma.black_threshold"
38c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk#define PROPERTY_TEXT_WHITE_GAMMA_THRESHOLD "ro.text_gamma.white_threshold"
39c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk
40c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk#define DEFAULT_TEXT_GAMMA 1.4f
41c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk#define DEFAULT_TEXT_BLACK_GAMMA_THRESHOLD 64
42c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk#define DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD 192
43c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk
44d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukclass FontState;
45d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
46afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukclass Font : public ObjectBase {
47d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukpublic:
4809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    enum RenderMode {
4909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        FRAMEBUFFER,
5009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        BITMAP,
5109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        MEASURE,
5209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    };
53d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
5409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    struct Rect {
5509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        int32_t left;
5609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        int32_t top;
5709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        int32_t right;
5809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        int32_t bottom;
5909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        void set(int32_t l, int32_t r, int32_t t, int32_t b) {
6009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk            left = l;
6109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk            right = r;
6209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk            top = t;
6309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk            bottom = b;
6409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        }
6509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    };
6609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
6709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    ~Font();
68d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
69d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Currently files do not get serialized,
70d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // but we need to inherit from ObjectBase for ref tracking
71d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    virtual void serialize(OStream *stream) const {
72d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    }
73d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    virtual RsA3DClassID getClassId() const {
74d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        return RS_A3D_CLASS_ID_UNKNOWN;
75d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    }
76d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
775224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk    static Font * create(Context *rsc, const char *name, float fontSize, uint32_t dpi,
785224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                         const void *data = NULL, uint32_t dataLen = 0);
79d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
80d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukprotected:
81d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
82d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    friend class FontState;
83d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
8409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    // Pointer to the utf data, length of data, where to start, number of glyphs ot read
8509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    // (each glyph may be longer than a char because we are dealing with utf data)
8609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    // Last two variables are the initial pen position
8709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    void renderUTF(const char *text, uint32_t len, int32_t x, int32_t y,
8809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                   uint32_t start, int32_t numGlyphs,
8909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                   RenderMode mode = FRAMEBUFFER, Rect *bounds = NULL,
9009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                   uint8_t *bitmap = NULL, uint32_t bitmapW = 0, uint32_t bitmapH = 0);
9109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
92d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void invalidateTextureCache();
93d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    struct CachedGlyphInfo
94d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    {
95d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Has the cache been invalidated?
96d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        bool mIsValid;
97d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Location of the cached glyph in the bitmap
98d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // in case we need to resize the texture
99d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mBitmapMinX;
100d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mBitmapMinY;
101d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mBitmapWidth;
102d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mBitmapHeight;
103d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Also cache texture coords for the quad
104d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        float mBitmapMinU;
105d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        float mBitmapMinV;
106d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        float mBitmapMaxU;
107d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        float mBitmapMaxV;
108d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Minimize how much we call freetype
10902000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk        int32_t mGlyphIndex;
11002000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk        int32_t mAdvanceX;
11102000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk        int32_t mAdvanceY;
112d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Values below contain a glyph's origin in the bitmap
11302000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk        int32_t mBitmapLeft;
11402000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk        int32_t mBitmapTop;
115d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    };
116d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
117d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    String8 mFontName;
118c17ace2391783dcabc6c1482edf0362654fd83e5Alex Sakhartchouk    float mFontSize;
119d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    uint32_t mDpi;
120d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
121d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Font(Context *rsc);
1225224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk    bool init(const char *name, float fontSize, uint32_t dpi, const void *data = NULL, uint32_t dataLen = 0);
123d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
1242e8665de7c0eb4514c67baf8693d61c892e5303dJason Sams    virtual void preDestroy() const;
12502000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk    FT_FaceRec_ *mFace;
126d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    bool mInitialized;
127d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    bool mHasKerning;
128d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
129d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    DefaultKeyedVector<uint32_t, CachedGlyphInfo* > mCachedGlyphs;
13001bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk    CachedGlyphInfo* getCachedUTFChar(int32_t utfChar);
131d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
132d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    CachedGlyphInfo *cacheGlyph(uint32_t glyph);
133d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void updateGlyphCache(CachedGlyphInfo *glyph);
13409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    void measureCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y, Rect *bounds);
13509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    void drawCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y);
13609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    void drawCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y,
13709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                         uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH);
138d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk};
139d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
140afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukclass FontState {
141d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukpublic:
142d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    FontState();
143d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ~FontState();
144d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
145d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void init(Context *rsc);
146d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void deinit(Context *rsc);
147d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
148d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<Font> mDefault;
149d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
15009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    void renderText(const char *text, uint32_t len, int32_t x, int32_t y,
15109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                    uint32_t startIndex = 0, int numGlyphs = -1,
15209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                    Font::RenderMode mode = Font::FRAMEBUFFER,
15309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                    Font::Rect *bounds = NULL,
15409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                    uint8_t *bitmap = NULL, uint32_t bitmapW = 0, uint32_t bitmapH = 0);
15509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
15609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    void measureText(const char *text, uint32_t len, Font::Rect *bounds);
157d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
1589fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    void setFontColor(float r, float g, float b, float a);
159ca5a454e022caec6c6d3cbb404cc09ea095ba97aAlex Sakhartchouk    void getFontColor(float *r, float *g, float *b, float *a) const;
1609fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk
161d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukprotected:
162d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
163a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk    float mSurfaceWidth;
164a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk    float mSurfaceHeight;
165a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk
166d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    friend class Font;
167d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
168afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    struct CacheTextureLine {
169d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mMaxHeight;
170d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mMaxWidth;
171d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mCurrentRow;
172d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mCurrentCol;
17301bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk        bool mDirty;
174d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
175afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk        CacheTextureLine(uint32_t maxHeight, uint32_t maxWidth, uint32_t currentRow, uint32_t currentCol)
176afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk            : mMaxHeight(maxHeight), mMaxWidth(maxWidth), mCurrentRow(currentRow),
177afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk              mCurrentCol(currentCol), mDirty(false)  {
178d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        }
179d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
18002000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk        bool fitBitmap(FT_Bitmap_ *bitmap, uint32_t *retOriginX, uint32_t *retOriginY);
181d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    };
182d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
183d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Vector<CacheTextureLine*> mCacheLines;
18401bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk    uint32_t getRemainingCacheCapacity();
18501bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk
18601bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk    void precacheLatin(Font *font);
18701bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk    String8 mLatinPrecache;
188d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
189d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Context *mRSC;
190d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
191c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    struct {
192c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk        float mFontColor[4];
193c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk        float mGamma;
194c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    } mConstants;
195c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    bool mConstantsDirty;
196c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk
197c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    float mBlackGamma;
198c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    float mWhiteGamma;
199c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk
200c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    float mBlackThreshold;
201c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    float mWhiteThreshold;
2029fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk
203d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Free type library, we only need one copy
204b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
20502000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk    FT_LibraryRec_ *mLibrary;
20602000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk    FT_LibraryRec_ *getLib();
207b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk#endif //ANDROID_RS_SERIALIZE
208d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Vector<Font*> mActiveFonts;
209d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
210d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Render state for the font
211e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    ObjectBaseRef<Allocation> mFontShaderFConstant;
212d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<ProgramFragment> mFontShaderF;
213d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<Sampler> mFontSampler;
214d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<ProgramStore> mFontProgramStore;
215d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void initRenderState();
216d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
217d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Texture to cache glyph bitmaps
218d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<Allocation> mTextTexture;
219d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void initTextTexture();
22009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    const uint8_t* getTextTextureData() const {
22109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        return (uint8_t*)mTextTexture->getPtr();
22209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
223d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
224b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
22502000b3cdcb2ac369bd06313932b26d4b8e023a9Alex Sakhartchouk    bool cacheBitmap(FT_Bitmap_ *bitmap, uint32_t *retOriginX, uint32_t *retOriginY);
226b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk#endif //ANDROID_RS_SERIALIZE
227d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    const Type* getCacheTextureType() {
228d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        return mTextTexture->getType();
229d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    }
230d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
231d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void flushAllAndInvalidate();
232d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
233d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Pointer to vertex data to speed up frame to frame work
234d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    float *mTextMeshPtr;
235d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    uint32_t mCurrentQuadIndex;
236d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    uint32_t mMaxNumberOfQuads;
237d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
238d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void initVertexArrayBuffers();
239a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    ObjectBaseRef<Mesh> mMesh;
240d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
241d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    bool mInitialized;
242d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
243d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void checkInit();
244d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
245d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void issueDrawCommand();
246d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
247d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void appendMeshQuad(float x1, float y1, float z1,
248afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                        float u1, float v1,
249afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                        float x2, float y2, float z2,
250afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                        float u2, float v2,
251afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                        float x3, float y3, float z3,
252afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                        float u3, float v3,
253afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                        float x4, float y4, float z4,
254afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                        float u4, float v4);
255d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk};
256d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
257d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
258d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
259d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
260d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk#endif
261