rsFont.h revision 09c67356bbeee0a97a20a06c95b66756838cb541
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:
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
77d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    static Font * create(Context *rsc, const char *name, uint32_t fontSize, uint32_t dpi);
78d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
79d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukprotected:
80d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
81d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    friend class FontState;
82d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
8309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    // Pointer to the utf data, length of data, where to start, number of glyphs ot read
8409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    // (each glyph may be longer than a char because we are dealing with utf data)
8509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    // Last two variables are the initial pen position
8609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    void renderUTF(const char *text, uint32_t len, int32_t x, int32_t y,
8709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                   uint32_t start, int32_t numGlyphs,
8809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                   RenderMode mode = FRAMEBUFFER, Rect *bounds = NULL,
8909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                   uint8_t *bitmap = NULL, uint32_t bitmapW = 0, uint32_t bitmapH = 0);
9009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
91d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void invalidateTextureCache();
92d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    struct CachedGlyphInfo
93d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    {
94d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Has the cache been invalidated?
95d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        bool mIsValid;
96d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Location of the cached glyph in the bitmap
97d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // in case we need to resize the texture
98d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mBitmapMinX;
99d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mBitmapMinY;
100d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mBitmapWidth;
101d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mBitmapHeight;
102d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Also cache texture coords for the quad
103d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        float mBitmapMinU;
104d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        float mBitmapMinV;
105d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        float mBitmapMaxU;
106d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        float mBitmapMaxV;
107d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Minimize how much we call freetype
108d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        FT_UInt mGlyphIndex;
109d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        FT_Vector mAdvance;
110d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        // Values below contain a glyph's origin in the bitmap
111d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        FT_Int mBitmapLeft;
112d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        FT_Int mBitmapTop;
113d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    };
114d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
115d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    String8 mFontName;
116d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    uint32_t mFontSize;
117d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    uint32_t mDpi;
118d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
119d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Font(Context *rsc);
120d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    bool init(const char *name, uint32_t fontSize, uint32_t dpi);
121d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
122d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    FT_Face mFace;
123d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    bool mInitialized;
124d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    bool mHasKerning;
125d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
126d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    DefaultKeyedVector<uint32_t, CachedGlyphInfo* > mCachedGlyphs;
12701bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk    CachedGlyphInfo* getCachedUTFChar(int32_t utfChar);
128d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
129d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    CachedGlyphInfo *cacheGlyph(uint32_t glyph);
130d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void updateGlyphCache(CachedGlyphInfo *glyph);
13109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    void measureCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y, Rect *bounds);
13209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    void drawCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y);
13309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    void drawCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y,
13409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                         uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH);
135d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk};
136d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
137d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukclass FontState
138d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{
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    ObjectBaseRef<Font> mLast;
148d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
14909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    void renderText(const char *text, uint32_t len, int32_t x, int32_t y,
15009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                    uint32_t startIndex = 0, int numGlyphs = -1,
15109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                    Font::RenderMode mode = Font::FRAMEBUFFER,
15209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                    Font::Rect *bounds = NULL,
15309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                    uint8_t *bitmap = NULL, uint32_t bitmapW = 0, uint32_t bitmapH = 0);
15409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
15509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    void measureText(const char *text, uint32_t len, Font::Rect *bounds);
156d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
1579fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    void setFontColor(float r, float g, float b, float a);
158ca5a454e022caec6c6d3cbb404cc09ea095ba97aAlex Sakhartchouk    void getFontColor(float *r, float *g, float *b, float *a) const;
1599fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk
160d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukprotected:
161d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
162d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    friend class Font;
163d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
164d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    struct CacheTextureLine
165d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    {
166d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mMaxHeight;
167d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mMaxWidth;
168d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mCurrentRow;
169d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        uint32_t mCurrentCol;
17001bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk        bool mDirty;
171d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
172d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        CacheTextureLine(uint32_t maxHeight, uint32_t maxWidth, uint32_t currentRow, uint32_t currentCol) :
17301bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk            mMaxHeight(maxHeight), mMaxWidth(maxWidth), mCurrentRow(currentRow), mCurrentCol(currentCol),
17401bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk            mDirty(false)  {
175d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        }
176d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
177d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        bool fitBitmap(FT_Bitmap *bitmap, uint32_t *retOriginX, uint32_t *retOriginY) {
178d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk            if((uint32_t)bitmap->rows > mMaxHeight) {
179d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk                return false;
180d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk            }
181d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
182d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk            if(mCurrentCol + (uint32_t)bitmap->width < mMaxWidth) {
183d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk               *retOriginX = mCurrentCol;
184d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk               *retOriginY = mCurrentRow;
185d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk               mCurrentCol += bitmap->width;
18601bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk               mDirty = true;
187d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk               return true;
188d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk            }
189d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
190d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk            return false;
191d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        }
192d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    };
193d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
194d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Vector<CacheTextureLine*> mCacheLines;
19501bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk    uint32_t getRemainingCacheCapacity();
19601bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk
19701bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk    void precacheLatin(Font *font);
19801bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk    String8 mLatinPrecache;
199d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
200d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Context *mRSC;
201d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
202c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    struct {
203c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk        float mFontColor[4];
204c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk        float mGamma;
205c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    } mConstants;
206c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    bool mConstantsDirty;
207c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk
208c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    float mBlackGamma;
209c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    float mWhiteGamma;
210c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk
211c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    float mBlackThreshold;
212c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk    float mWhiteThreshold;
2139fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk
214d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Free type library, we only need one copy
215d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    FT_Library mLibrary;
216a1ccecd965c07c2739f1258989526051a010bdabAlex Sakhartchouk    FT_Library getLib();
217d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Vector<Font*> mActiveFonts;
218d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
219d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Render state for the font
220e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    ObjectBaseRef<Allocation> mFontShaderFConstant;
221d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<ProgramFragment> mFontShaderF;
222d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<Sampler> mFontSampler;
223d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<ProgramStore> mFontProgramStore;
224d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void initRenderState();
225d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
226d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Texture to cache glyph bitmaps
227d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<Allocation> mTextTexture;
228d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void initTextTexture();
22909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    const uint8_t* getTextTextureData() const {
23009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        return (uint8_t*)mTextTexture->getPtr();
23109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
232d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
233d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    bool cacheBitmap(FT_Bitmap *bitmap, uint32_t *retOriginX, uint32_t *retOriginY);
234d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    const Type* getCacheTextureType() {
235d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        return mTextTexture->getType();
236d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    }
237d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
238d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void flushAllAndInvalidate();
239d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
240d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    // Pointer to vertex data to speed up frame to frame work
241d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    float *mTextMeshPtr;
242d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    uint32_t mCurrentQuadIndex;
243d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    uint32_t mMaxNumberOfQuads;
244d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
245d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void initVertexArrayBuffers();
246d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<Allocation> mIndexBuffer;
247d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    ObjectBaseRef<Allocation> mVertexArray;
248d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
249d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
250d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    bool mInitialized;
251d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
252d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void checkInit();
253d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
254d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void issueDrawCommand();
255d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
256d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    void appendMeshQuad(float x1, float y1, float z1,
257d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk                          float u1, float v1,
258d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk                          float x2, float y2, float z2,
259d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk                          float u2, float v2,
260d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk                          float x3, float y3, float z3,
261d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk                          float u3, float v3,
262d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk                          float x4, float y4, float z4,
263d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk                          float u4, float v4);
264d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
265d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk};
266d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
267d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
268d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
269d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
270d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
271d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk#endif
272