rsFont.h revision afb743aca56c18beb7ab924e75cb6e070ef3e55a
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 45afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukclass Font : public ObjectBase { 46d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukpublic: 4709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk enum RenderMode { 4809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk FRAMEBUFFER, 4909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk BITMAP, 5009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk MEASURE, 5109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk }; 52d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 5309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk struct Rect { 5409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk int32_t left; 5509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk int32_t top; 5609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk int32_t right; 5709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk int32_t bottom; 5809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk void set(int32_t l, int32_t r, int32_t t, int32_t b) { 5909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk left = l; 6009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk right = r; 6109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk top = t; 6209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk bottom = b; 6309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 6409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk }; 6509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 6609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk ~Font(); 67d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 68d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk // Currently files do not get serialized, 69d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk // but we need to inherit from ObjectBase for ref tracking 70d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk virtual void serialize(OStream *stream) const { 71d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk } 72d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk virtual RsA3DClassID getClassId() const { 73d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk return RS_A3D_CLASS_ID_UNKNOWN; 74d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk } 75d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 76d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk static Font * create(Context *rsc, const char *name, uint32_t fontSize, uint32_t dpi); 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, 8709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk RenderMode mode = FRAMEBUFFER, Rect *bounds = NULL, 8809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk uint8_t *bitmap = NULL, 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 107d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk FT_UInt mGlyphIndex; 108d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk FT_Vector mAdvance; 109d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk // Values below contain a glyph's origin in the bitmap 110d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk FT_Int mBitmapLeft; 111d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk FT_Int mBitmapTop; 112d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk }; 113d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 114d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk String8 mFontName; 115d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk uint32_t mFontSize; 116d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk uint32_t mDpi; 117d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 118d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk Font(Context *rsc); 119d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk bool init(const char *name, uint32_t fontSize, uint32_t dpi); 120d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 121d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk FT_Face mFace; 122d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk bool mInitialized; 123d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk bool mHasKerning; 124d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 125d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk DefaultKeyedVector<uint32_t, CachedGlyphInfo* > mCachedGlyphs; 12601bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk CachedGlyphInfo* getCachedUTFChar(int32_t utfChar); 127d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 128d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk CachedGlyphInfo *cacheGlyph(uint32_t glyph); 129d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk void updateGlyphCache(CachedGlyphInfo *glyph); 13009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk void measureCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y, Rect *bounds); 13109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk void drawCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y); 13209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk void drawCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y, 13309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH); 134d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}; 135d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 136afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukclass FontState { 137d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukpublic: 138d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk FontState(); 139d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk ~FontState(); 140d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 141d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk void init(Context *rsc); 142d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk void deinit(Context *rsc); 143d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 144d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk ObjectBaseRef<Font> mDefault; 145d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk ObjectBaseRef<Font> mLast; 146d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 14709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk void renderText(const char *text, uint32_t len, int32_t x, int32_t y, 14809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk uint32_t startIndex = 0, int numGlyphs = -1, 14909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk Font::RenderMode mode = Font::FRAMEBUFFER, 15009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk Font::Rect *bounds = NULL, 15109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk uint8_t *bitmap = NULL, uint32_t bitmapW = 0, uint32_t bitmapH = 0); 15209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 15309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk void measureText(const char *text, uint32_t len, Font::Rect *bounds); 154d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 1559fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk void setFontColor(float r, float g, float b, float a); 156ca5a454e022caec6c6d3cbb404cc09ea095ba97aAlex Sakhartchouk void getFontColor(float *r, float *g, float *b, float *a) const; 1579fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk 158d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukprotected: 159d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 160d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk friend class Font; 161d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 162afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk struct CacheTextureLine { 163d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk uint32_t mMaxHeight; 164d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk uint32_t mMaxWidth; 165d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk uint32_t mCurrentRow; 166d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk uint32_t mCurrentCol; 16701bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk bool mDirty; 168d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 169afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk CacheTextureLine(uint32_t maxHeight, uint32_t maxWidth, uint32_t currentRow, uint32_t currentCol) 170afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk : mMaxHeight(maxHeight), mMaxWidth(maxWidth), mCurrentRow(currentRow), 171afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk mCurrentCol(currentCol), mDirty(false) { 172d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk } 173d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 174d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk bool fitBitmap(FT_Bitmap *bitmap, uint32_t *retOriginX, uint32_t *retOriginY) { 175afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if ((uint32_t)bitmap->rows > mMaxHeight) { 176d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk return false; 177d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk } 178d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 179afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mCurrentCol + (uint32_t)bitmap->width < mMaxWidth) { 180afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk *retOriginX = mCurrentCol; 181afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk *retOriginY = mCurrentRow; 182afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk mCurrentCol += bitmap->width; 183afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk mDirty = true; 184d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk return true; 185d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk } 186d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 187d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk return false; 188d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk } 189d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk }; 190d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 191d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk Vector<CacheTextureLine*> mCacheLines; 19201bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk uint32_t getRemainingCacheCapacity(); 19301bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk 19401bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk void precacheLatin(Font *font); 19501bcef6115dc6230b16d9d8e120e35279f46cfd5Alex Sakhartchouk String8 mLatinPrecache; 196d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 197d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk Context *mRSC; 198d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 199c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk struct { 200c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk float mFontColor[4]; 201c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk float mGamma; 202c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk } mConstants; 203c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk bool mConstantsDirty; 204c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk 205c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk float mBlackGamma; 206c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk float mWhiteGamma; 207c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk 208c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk float mBlackThreshold; 209c9fa30536fb41f0166153561388b7c42f7cb85a0Alex Sakhartchouk float mWhiteThreshold; 2109fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk 211d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk // Free type library, we only need one copy 212d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk FT_Library mLibrary; 213a1ccecd965c07c2739f1258989526051a010bdabAlex Sakhartchouk FT_Library getLib(); 214d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk Vector<Font*> mActiveFonts; 215d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 216d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk // Render state for the font 217e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk ObjectBaseRef<Allocation> mFontShaderFConstant; 218d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk ObjectBaseRef<ProgramFragment> mFontShaderF; 219d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk ObjectBaseRef<Sampler> mFontSampler; 220d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk ObjectBaseRef<ProgramStore> mFontProgramStore; 221d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk void initRenderState(); 222d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 223d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk // Texture to cache glyph bitmaps 224d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk ObjectBaseRef<Allocation> mTextTexture; 225d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk void initTextTexture(); 22609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk const uint8_t* getTextTextureData() const { 22709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk return (uint8_t*)mTextTexture->getPtr(); 22809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 229d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 230d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk bool cacheBitmap(FT_Bitmap *bitmap, uint32_t *retOriginX, uint32_t *retOriginY); 231d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk const Type* getCacheTextureType() { 232d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk return mTextTexture->getType(); 233d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk } 234d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 235d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk void flushAllAndInvalidate(); 236d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 237d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk // Pointer to vertex data to speed up frame to frame work 238d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk float *mTextMeshPtr; 239d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk uint32_t mCurrentQuadIndex; 240d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk uint32_t mMaxNumberOfQuads; 241d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 242d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk void initVertexArrayBuffers(); 243d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk ObjectBaseRef<Allocation> mIndexBuffer; 244d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk ObjectBaseRef<Allocation> mVertexArray; 245d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 246d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 247d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk bool mInitialized; 248d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 249d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk void checkInit(); 250d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 251d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk void issueDrawCommand(); 252d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 253d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk void appendMeshQuad(float x1, float y1, float z1, 254afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk float u1, float v1, 255afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk float x2, float y2, float z2, 256afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk float u2, float v2, 257afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk float x3, float y3, float z3, 258afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk float u3, float v3, 259afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk float x4, float y4, float z4, 260afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk float u4, float v4); 261d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}; 262d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 263d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 264d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 265d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 266d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk#endif 267