Removing font initialization on startup

Change-Id: I6f28204c3d431955fbf0f2f74dde09012bba0a4d
This commit is contained in:
Alex Sakhartchouk
2010-06-30 12:49:27 -07:00
parent e519b37f5a
commit 071508d9f3
2 changed files with 57 additions and 46 deletions

View File

@@ -35,6 +35,8 @@ using namespace android::renderscript;
Font::Font(Context *rsc) : ObjectBase(rsc), mCachedGlyphs(NULL)
{
mAllocFile = __FILE__;
mAllocLine = __LINE__;
mInitialized = false;
mHasKerning = false;
}
@@ -51,7 +53,7 @@ bool Font::init(const char *name, uint32_t fontSize, uint32_t dpi)
fullPath += fontsDir;
fullPath += name;
FT_Error error = FT_New_Face(mRSC->mStateFont.mLibrary, fullPath.string(), 0, &mFace);
FT_Error error = FT_New_Face(mRSC->mStateFont.getLib(), fullPath.string(), 0, &mFace);
if(error) {
LOGE("Unable to initialize font %s", fullPath.string());
return false;
@@ -70,7 +72,6 @@ bool Font::init(const char *name, uint32_t fontSize, uint32_t dpi)
}
mHasKerning = FT_HAS_KERNING(mFace);
LOGE("Kerning: %i", mHasKerning);
mInitialized = true;
return true;
@@ -156,45 +157,37 @@ void Font::renderUTF(const char *text, uint32_t len, uint32_t start, int numGlyp
void Font::updateGlyphCache(CachedGlyphInfo *glyph)
{
if(!glyph->mBitmapValid) {
FT_Error error = FT_Load_Glyph( mFace, glyph->mGlyphIndex, FT_LOAD_RENDER );
if(error) {
LOGE("Couldn't load glyph.");
return;
}
glyph->mAdvance = mFace->glyph->advance;
glyph->mBitmapLeft = mFace->glyph->bitmap_left;
glyph->mBitmapTop = mFace->glyph->bitmap_top;
FT_Bitmap *bitmap = &mFace->glyph->bitmap;
FT_Bitmap_New(&glyph->mBitmap);
FT_Bitmap_Copy(mRSC->mStateFont.mLibrary, bitmap, &glyph->mBitmap);
glyph->mBitmapValid = true;
FT_Error error = FT_Load_Glyph( mFace, glyph->mGlyphIndex, FT_LOAD_RENDER );
if(error) {
LOGE("Couldn't load glyph.");
return;
}
glyph->mAdvance = mFace->glyph->advance;
glyph->mBitmapLeft = mFace->glyph->bitmap_left;
glyph->mBitmapTop = mFace->glyph->bitmap_top;
FT_Bitmap *bitmap = &mFace->glyph->bitmap;
// Now copy the bitmap into the cache texture
uint32_t startX = 0;
uint32_t startY = 0;
// Let the font state figure out where to put the bitmap
FontState *state = &mRSC->mStateFont;
glyph->mIsValid = state->cacheBitmap(&glyph->mBitmap, &startX, &startY);
glyph->mIsValid = state->cacheBitmap(bitmap, &startX, &startY);
if(!glyph->mIsValid) {
return;
}
uint32_t endX = startX + glyph->mBitmap.width;
uint32_t endY = startY + glyph->mBitmap.rows;
uint32_t endX = startX + bitmap->width;
uint32_t endY = startY + bitmap->rows;
glyph->mBitmapMinX = startX;
glyph->mBitmapMinY = startY;
glyph->mBitmapWidth = glyph->mBitmap.width;
glyph->mBitmapHeight = glyph->mBitmap.rows;
glyph->mBitmapWidth = bitmap->width;
glyph->mBitmapHeight = bitmap->rows;
uint32_t cacheWidth = state->getCacheTextureType()->getDimX();
uint32_t cacheHeight = state->getCacheTextureType()->getDimY();
@@ -212,7 +205,6 @@ Font::CachedGlyphInfo *Font::cacheGlyph(uint32_t glyph)
newGlyph->mGlyphIndex = FT_Get_Char_Index(mFace, glyph);
newGlyph->mIsValid = false;
newGlyph->mBitmapValid = false;
//LOGE("Glyph = %c, face index: %u", (unsigned char)glyph, newGlyph->mGlyphIndex);
@@ -228,7 +220,6 @@ Font * Font::create(Context *rsc, const char *name, uint32_t fontSize, uint32_t
for(uint32_t i = 0; i < activeFonts.size(); i ++) {
Font *ithFont = activeFonts[i];
if(ithFont->mFontName == name && ithFont->mFontSize == fontSize && ithFont->mDpi == dpi) {
ithFont->incUserRef();
return ithFont;
}
}
@@ -236,7 +227,6 @@ Font * Font::create(Context *rsc, const char *name, uint32_t fontSize, uint32_t
Font *newFont = new Font(rsc);
bool isInitialized = newFont->init(name, fontSize, dpi);
if(isInitialized) {
newFont->incUserRef();
activeFonts.push(newFont);
return newFont;
}
@@ -261,9 +251,6 @@ Font::~Font()
for(uint32_t i = 0; i < mCachedGlyphs.size(); i ++) {
CachedGlyphInfo *glyph = mCachedGlyphs.valueAt(i);
if(glyph->mBitmapValid) {
FT_Bitmap_Done(mRSC->mStateFont.mLibrary, &glyph->mBitmap);
}
delete glyph;
}
}
@@ -285,21 +272,23 @@ FontState::~FontState()
rsAssert(!mActiveFonts.size());
}
void FontState::init(Context *rsc)
FT_Library FontState::getLib()
{
FT_Error error;
if(!mLibrary) {
error = FT_Init_FreeType(&mLibrary);
FT_Error error = FT_Init_FreeType(&mLibrary);
if(error) {
LOGE("Unable to initialize freetype");
return;
return NULL;
}
}
return mLibrary;
}
void FontState::init(Context *rsc)
{
//getLib();
mRSC = rsc;
mDefault.set(Font::create(rsc, "DroidSans.ttf", 16, 96));
}
void FontState::flushAllAndInvalidate()
@@ -627,10 +616,16 @@ void FontState::renderText(const char *text, uint32_t len, uint32_t startIndex,
{
checkInit();
String8 text8(text);
//String8 text8(text);
// Render code here
Font *currentFont = mRSC->getFont();
if(!currentFont) {
if(!mDefault.get()) {
mDefault.set(Font::create(mRSC, "DroidSans.ttf", 16, 96));
}
currentFont = mDefault.get();
}
currentFont->renderUTF(text, len, startIndex, numGlyphs, x, y);
if(mCurrentQuadIndex != 0) {
@@ -669,12 +664,26 @@ void FontState::renderText(Allocation *alloc, uint32_t start, int len, int x, in
void FontState::deinit(Context *rsc)
{
mInitialized = false;
mIndexBuffer.clear();
mVertexArray.clear();
mFontShaderF.clear();
mFontSampler.clear();
mFontProgramStore.clear();
mTextTexture.clear();
for(uint32_t i = 0; i < mCacheLines.size(); i ++) {
delete mCacheLines[i];
}
mCacheLines.clear();
mDefault.clear();
if(mLibrary) {
FT_Done_FreeType( mLibrary );
}
delete mDefault.get();
mDefault.clear();
}
namespace android {
@@ -682,7 +691,11 @@ namespace renderscript {
RsFont rsi_FontCreateFromFile(Context *rsc, char const *name, uint32_t fontSize, uint32_t dpi)
{
return Font::create(rsc, name, fontSize, dpi);
Font *newFont = Font::create(rsc, name, fontSize, dpi);
if(newFont) {
newFont->incUserRef();
}
return newFont;
}
} // renderscript

View File

@@ -79,9 +79,6 @@ protected:
// Values below contain a glyph's origin in the bitmap
FT_Int mBitmapLeft;
FT_Int mBitmapTop;
// Hold on to the bitmap in case cache is invalidated
FT_Bitmap mBitmap;
bool mBitmapValid;
};
String8 mFontName;
@@ -156,6 +153,7 @@ protected:
// Free type library, we only need one copy
FT_Library mLibrary;
FT_Library getLib();
Vector<Font*> mActiveFonts;
// Render state for the font