Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1219)

Unified Diff: src/utils/SkWhitelistTypefaces.cpp

Issue 1327683002: use otutil to get font names (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: address feedback Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/utils/SkWhitelistTypefaces.cpp
diff --git a/src/utils/SkWhitelistTypefaces.cpp b/src/utils/SkWhitelistTypefaces.cpp
index 99f3644a97f6ef6376739ae761e039fe9ef4c5b6..db15ee2f5a920c23b6b61508f119db92ee2f4f5b 100644
--- a/src/utils/SkWhitelistTypefaces.cpp
+++ b/src/utils/SkWhitelistTypefaces.cpp
@@ -11,6 +11,7 @@
#include "SkString.h"
#include "SkTypeface.h"
#include "SkUtils.h"
+#include "../sfnt/SkOTUtils.h"
#include "SkWhitelistChecksums.cpp"
@@ -25,28 +26,8 @@ extern bool GenerateChecksums();
static bool timesNewRomanSerializedNameOnly = false;
#endif
-struct NameRecord {
- unsigned short fPlatformID;
- unsigned short fEncodingID;
- unsigned short fLanguageID;
- unsigned short fNameID;
- unsigned short fLength;
- unsigned short fOffset;
-};
-
-struct NameTable {
- unsigned short fFormat;
- unsigned short fCount;
- unsigned short fStringOffset;
- NameRecord fRecord[1];
-};
-
#define SUBNAME_PREFIX "sk_"
-static unsigned short swizzle(unsigned short x) {
- return x << 8 | (x >> 8 & 0xff);
-}
-
static bool font_name_is_local(const char* fontName, SkTypeface::Style style) {
if (!strcmp(fontName, "DejaVu Sans")) {
return true;
@@ -56,75 +37,27 @@ static bool font_name_is_local(const char* fontName, SkTypeface::Style style) {
return defaultFace != foundFace;
}
-static int name_table(const NameTable* nameTable, int tableIndex, const char** stringLocPtr) {
- int nameTableCount = swizzle(nameTable->fCount);
- for (int i = 0; i < nameTableCount; ++i) {
- const NameRecord* nameRecord = &nameTable->fRecord[i];
- int recordNameID = swizzle(nameRecord->fNameID);
- if (recordNameID != tableIndex) {
- continue;
- }
- int stringLen = swizzle(nameRecord->fLength);
- if (!stringLen) {
- break;
- }
- int recordOffset = swizzle(nameRecord->fOffset);
- const char* stringLoc = (const char* ) nameTable + swizzle(nameTable->fStringOffset);
- stringLoc += recordOffset;
- *stringLocPtr = stringLoc;
- return stringLen;
- }
- return -1;
-}
-
static int whitelist_name_index(const SkTypeface* tf) {
- static const SkFontTableTag nameTag = SkSetFourByteTag('n', 'a', 'm', 'e');
- size_t nameSize = tf->getTableSize(nameTag);
- if (!nameSize) {
- return -1;
- }
- SkTDArray<char> name;
- name.setCount((int) nameSize);
- tf->getTableData(nameTag, 0, nameSize, name.begin());
- const NameTable* nameTable = (const NameTable* ) name.begin();
- const char* stringLoc;
- int stringLen = name_table(nameTable, 1, &stringLoc);
- if (stringLen < 0) {
- stringLen = name_table(nameTable, 16, &stringLoc);
- }
- if (stringLen < 0) {
- stringLen = name_table(nameTable, 21, &stringLoc);
- }
- if (stringLen < 0) {
- return -1;
- }
+
SkString fontNameStr;
- if (!*stringLoc) {
- stringLen /= 2;
- for (int i = 0; i < stringLen; ++i) {
- fontNameStr.appendUnichar(swizzle(((const uint16_t*) stringLoc)[i]));
- }
- } else {
- fontNameStr.resize(stringLen);
- strncpy(fontNameStr.writable_str(), stringLoc, stringLen);
- }
- // check against permissible list of names
- for (int i = 0; i < whitelistCount; ++i) {
- if (fontNameStr.equals(whitelist[i].fFontName)) {
- return i;
+ SkAutoTUnref<SkTypeface::LocalizedStrings> nameIter(
+ SkOTUtils::LocalizedStrings_NameTable::CreateForFamilyNames(*tf));
+ SkTypeface::LocalizedString familyNameLocalized;
+ while (nameIter->next(&familyNameLocalized)) {
+ fontNameStr = familyNameLocalized.fString;
+ // check against permissible list of names
+ for (int i = 0; i < whitelistCount; ++i) {
+ if (fontNameStr.equals(whitelist[i].fFontName)) {
+ return i;
+ }
}
}
- for (int i = 0; i < whitelistCount; ++i) {
- if (fontNameStr.startsWith(whitelist[i].fFontName)) {
#if WHITELIST_DEBUG
- SkDebugf("partial match whitelist=\"%s\" fontName=\"%s\"\n", whitelist[i].fFontName,
- fontNameStr.c_str());
-#endif
- return -1;
- }
+ SkAutoTUnref<SkTypeface::LocalizedStrings> debugIter(
+ SkOTUtils::LocalizedStrings_NameTable::CreateForFamilyNames(*tf));
+ while (debugIter->next(&familyNameLocalized)) {
+ SkDebugf("no match fontName=\"%s\"\n", familyNameLocalized.fString.c_str());
}
-#if WHITELIST_DEBUG
- SkDebugf("no match fontName=\"%s\"\n", fontNameStr.c_str());
#endif
return -1;
}
@@ -263,7 +196,7 @@ SkTypeface* WhitelistDeserializeTypeface(SkStream* stream) {
if (!strncmp(SUBNAME_PREFIX, familyName, sizeof(SUBNAME_PREFIX) - 1)) {
familyName += sizeof(SUBNAME_PREFIX) - 1;
}
- return SkTypeface::CreateFromName(desc.getFamilyName(), desc.getStyle());
+ return SkTypeface::CreateFromName(familyName, desc.getStyle());
}
bool CheckChecksums() {
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698