Mercurial > hg > openjdk > jdk7 > jdk
changeset 1286:9cf4ef04d9a7
6806822: Font.getFontName() is slow in Java5 and 6
Reviewed-by: igor, jgodinez
author | prr |
---|---|
date | Wed, 06 May 2009 14:14:54 -0700 |
parents | f8b061ea131c |
children | ec0a8acd4737 |
files | src/share/classes/sun/font/TrueTypeFont.java |
diffstat | 1 files changed, 45 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/sun/font/TrueTypeFont.java Tue May 05 09:09:24 2009 -0700 +++ b/src/share/classes/sun/font/TrueTypeFont.java Wed May 06 14:14:54 2009 -0700 @@ -160,6 +160,13 @@ private boolean supportsJA; private boolean supportsCJK; + /* These are for faster access to the name of the font as + * typically exposed via API to applications. + */ + private Locale nameLocale; + private String localeFamilyName; + private String localeFullName; + /** * - does basic verification of the file * - reads the header table for this font (within a collection) @@ -1092,6 +1099,10 @@ * greater than 32767, so read and store those as ints */ int stringPtr = sbuffer.get() & 0xffff; + + nameLocale = sun.awt.SunToolkit.getStartupLocale(); + short nameLocaleID = FontManager.getLCIDFromLocale(nameLocale); + for (int i=0; i<numRecords; i++) { short platformID = sbuffer.get(); if (platformID != MS_PLATFORM_ID) { @@ -1103,15 +1114,24 @@ short nameID = sbuffer.get(); int nameLen = ((int) sbuffer.get()) & 0xffff; int namePtr = (((int) sbuffer.get()) & 0xffff) + stringPtr; - + String tmpName = null; switch (nameID) { case FAMILY_NAME_ID: - if (familyName == null || langID == ENGLISH_LOCALE_ID) { + if (familyName == null || langID == ENGLISH_LOCALE_ID || + langID == nameLocaleID) + { buffer.position(namePtr); buffer.get(name, 0, nameLen); - familyName = makeString(name, nameLen, encodingID); + tmpName = makeString(name, nameLen, encodingID); + + if (familyName == null || langID == ENGLISH_LOCALE_ID){ + familyName = tmpName; + } + if (langID == nameLocaleID) { + localeFamilyName = tmpName; + } } /* for (int ii=0;ii<nameLen;ii++) { @@ -1129,15 +1149,29 @@ case FULL_NAME_ID: - if (fullName == null || langID == ENGLISH_LOCALE_ID) { + if (fullName == null || langID == ENGLISH_LOCALE_ID || + langID == nameLocaleID) + { buffer.position(namePtr); buffer.get(name, 0, nameLen); - fullName = makeString(name, nameLen, encodingID); + tmpName = makeString(name, nameLen, encodingID); + + if (fullName == null || langID == ENGLISH_LOCALE_ID) { + fullName = tmpName; + } + if (langID == nameLocaleID) { + localeFullName = tmpName; + } } break; - } } + if (localeFamilyName == null) { + localeFamilyName = familyName; + } + if (localeFullName == null) { + localeFullName = fullName; + } } } @@ -1220,6 +1254,8 @@ public String getFontName(Locale locale) { if (locale == null) { return fullName; + } else if (locale.equals(nameLocale) && localeFullName != null) { + return localeFullName; } else { short localeID = FontManager.getLCIDFromLocale(locale); String name = lookupName(localeID, FULL_NAME_ID); @@ -1234,11 +1270,13 @@ public String getFamilyName(Locale locale) { if (locale == null) { return familyName; + } else if (locale.equals(nameLocale) && localeFamilyName != null) { + return localeFamilyName; } else { short localeID = FontManager.getLCIDFromLocale(locale); String name = lookupName(localeID, FAMILY_NAME_ID); if (name == null) { - return familyName; + return familyName; } else { return name; }