| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 The Android Open Source Project | 2 * Copyright 2011 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkFontConfigParser_android.h" | 8 #include "SkFontConfigParser_android.h" |
| 9 #include "SkFontMgr_android.h" | 9 #include "SkFontMgr_android.h" |
| 10 #include "SkStream.h" | 10 #include "SkStream.h" |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 | 119 |
| 120 #define SK_FONTCONFIGPARSER_WARNING(message, ...) SkDebugf( \ | 120 #define SK_FONTCONFIGPARSER_WARNING(message, ...) SkDebugf( \ |
| 121 SK_FONTCONFIGPARSER_PREFIX "%s:%d:%d: warning: " message "\n", \ | 121 SK_FONTCONFIGPARSER_PREFIX "%s:%d:%d: warning: " message "\n", \ |
| 122 self->fFilename, \ | 122 self->fFilename, \ |
| 123 XML_GetCurrentLineNumber(self->fParser), \ | 123 XML_GetCurrentLineNumber(self->fParser), \ |
| 124 XML_GetCurrentColumnNumber(self->fParser), \ | 124 XML_GetCurrentColumnNumber(self->fParser), \ |
| 125 ##__VA_ARGS__); | 125 ##__VA_ARGS__); |
| 126 | 126 |
| 127 namespace lmpParser { | 127 namespace lmpParser { |
| 128 | 128 |
| 129 static void family_element_handler(FontFamily* family, const char** attributes)
{ | 129 static void family_element_handler(FamilyData* self, const char** attributes) { |
| 130 // A <family> element without a 'name' (string) attribute is a fallback font
. | 130 // A <family> element without a 'name' (string) attribute is a fallback font
. |
| 131 // The element may have 'lang' (string) and 'variant' ("elegant", "compact")
attributes. | 131 // The element may have 'lang' (string) and 'variant' ("elegant", "compact")
attributes. |
| 132 // The element should contain <font> elements. | 132 // The element should contain <font> elements. |
| 133 family->fIsFallbackFont = true; | 133 FontFamily* family = new FontFamily(self->fBasePath, true); |
| 134 self->fCurrentFamily.reset(family); |
| 134 for (size_t i = 0; ATTS_NON_NULL(attributes, i); i += 2) { | 135 for (size_t i = 0; ATTS_NON_NULL(attributes, i); i += 2) { |
| 135 const char* name = attributes[i]; | 136 const char* name = attributes[i]; |
| 136 const char* value = attributes[i+1]; | 137 const char* value = attributes[i+1]; |
| 137 size_t nameLen = strlen(name); | 138 size_t nameLen = strlen(name); |
| 138 size_t valueLen = strlen(value); | 139 size_t valueLen = strlen(value); |
| 139 if (MEMEQ("name", name, nameLen)) { | 140 if (MEMEQ("name", name, nameLen)) { |
| 140 SkAutoAsciiToLC tolc(value); | 141 SkAutoAsciiToLC tolc(value); |
| 141 family->fNames.push_back().set(tolc.lc()); | 142 family->fNames.push_back().set(tolc.lc()); |
| 142 family->fIsFallbackFont = false; | 143 family->fIsFallbackFont = false; |
| 143 } else if (MEMEQ("lang", name, nameLen)) { | 144 } else if (MEMEQ("lang", name, nameLen)) { |
| 144 family->fLanguage = SkLanguage(value, valueLen); | 145 family->fLanguage = SkLanguage(value, valueLen); |
| 145 } else if (MEMEQ("variant", name, nameLen)) { | 146 } else if (MEMEQ("variant", name, nameLen)) { |
| 146 if (MEMEQ("elegant", value, valueLen)) { | 147 if (MEMEQ("elegant", value, valueLen)) { |
| 147 family->fVariant = kElegant_FontVariant; | 148 family->fVariant = kElegant_FontVariant; |
| 148 } else if (MEMEQ("compact", value, valueLen)) { | 149 } else if (MEMEQ("compact", value, valueLen)) { |
| 149 family->fVariant = kCompact_FontVariant; | 150 family->fVariant = kCompact_FontVariant; |
| 150 } | 151 } |
| 151 } | 152 } |
| 152 } | 153 } |
| 153 } | 154 } |
| 154 | 155 |
| 155 static void XMLCALL font_file_name_handler(void* data, const char* s, int len) { | 156 static void XMLCALL font_file_name_handler(void* data, const char* s, int len) { |
| 156 FamilyData* self = static_cast<FamilyData*>(data); | 157 FamilyData* self = static_cast<FamilyData*>(data); |
| 157 self->fCurrentFontInfo->fFileName.append(s, len); | 158 self->fCurrentFontInfo->fFileName.append(s, len); |
| 158 } | 159 } |
| 159 | 160 |
| 160 static void font_element_handler(FamilyData* self, FontFileInfo* file, const cha
r** attributes) { | 161 static void font_element_handler(FamilyData* self, const char** attributes) { |
| 161 // A <font> element should be contained in a <family> element. | 162 // A <font> element should be contained in a <family> element. |
| 162 // The element may have 'weight' (non-negative integer), 'style' ("normal",
"italic"), | 163 // The element may have 'weight' (non-negative integer), 'style' ("normal",
"italic"), |
| 163 // and 'index' (non-negative integer) attributes. | 164 // and 'index' (non-negative integer) attributes. |
| 164 // The element should contain a filename. | 165 // The element should contain a filename. |
| 166 FontFileInfo& file = self->fCurrentFamily->fFonts.push_back(); |
| 167 self->fCurrentFontInfo = &file; |
| 165 for (size_t i = 0; ATTS_NON_NULL(attributes, i); i += 2) { | 168 for (size_t i = 0; ATTS_NON_NULL(attributes, i); i += 2) { |
| 166 const char* name = attributes[i]; | 169 const char* name = attributes[i]; |
| 167 const char* value = attributes[i+1]; | 170 const char* value = attributes[i+1]; |
| 168 size_t nameLen = strlen(name); | 171 size_t nameLen = strlen(name); |
| 169 if (MEMEQ("weight", name, nameLen)) { | 172 if (MEMEQ("weight", name, nameLen)) { |
| 170 if (!parse_non_negative_integer(value, &file->fWeight)) { | 173 if (!parse_non_negative_integer(value, &file.fWeight)) { |
| 171 SK_FONTCONFIGPARSER_WARNING("'%s' is an invalid weight", value); | 174 SK_FONTCONFIGPARSER_WARNING("'%s' is an invalid weight", value); |
| 172 } | 175 } |
| 173 } else if (MEMEQ("style", name, nameLen)) { | 176 } else if (MEMEQ("style", name, nameLen)) { |
| 174 size_t valueLen = strlen(value); | 177 size_t valueLen = strlen(value); |
| 175 if (MEMEQ("normal", value, valueLen)) { | 178 if (MEMEQ("normal", value, valueLen)) { |
| 176 file->fStyle = FontFileInfo::Style::kNormal; | 179 file.fStyle = FontFileInfo::Style::kNormal; |
| 177 } else if (MEMEQ("italic", value, valueLen)) { | 180 } else if (MEMEQ("italic", value, valueLen)) { |
| 178 file->fStyle = FontFileInfo::Style::kItalic; | 181 file.fStyle = FontFileInfo::Style::kItalic; |
| 179 } | 182 } |
| 180 } else if (MEMEQ("index", name, nameLen)) { | 183 } else if (MEMEQ("index", name, nameLen)) { |
| 181 if (!parse_non_negative_integer(value, &file->fIndex)) { | 184 if (!parse_non_negative_integer(value, &file.fIndex)) { |
| 182 SK_FONTCONFIGPARSER_WARNING("'%s' is an invalid index", value); | 185 SK_FONTCONFIGPARSER_WARNING("'%s' is an invalid index", value); |
| 183 } | 186 } |
| 184 } | 187 } |
| 185 } | 188 } |
| 186 XML_SetCharacterDataHandler(self->fParser, font_file_name_handler); | 189 XML_SetCharacterDataHandler(self->fParser, font_file_name_handler); |
| 187 } | 190 } |
| 188 | 191 |
| 189 static FontFamily* find_family(FamilyData* self, const SkString& familyName) { | 192 static FontFamily* find_family(FamilyData* self, const SkString& familyName) { |
| 190 for (int i = 0; i < self->fFamilies.count(); i++) { | 193 for (int i = 0; i < self->fFamilies.count(); i++) { |
| 191 FontFamily* candidate = self->fFamilies[i]; | 194 FontFamily* candidate = self->fFamilies[i]; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 *self->fFamilies.append() = family; | 248 *self->fFamilies.append() = family; |
| 246 } else { | 249 } else { |
| 247 targetFamily->fNames.push_back().set(aliasName); | 250 targetFamily->fNames.push_back().set(aliasName); |
| 248 } | 251 } |
| 249 } | 252 } |
| 250 | 253 |
| 251 static void XMLCALL start_element_handler(void* data, const char* tag, const cha
r** attributes) { | 254 static void XMLCALL start_element_handler(void* data, const char* tag, const cha
r** attributes) { |
| 252 FamilyData* self = static_cast<FamilyData*>(data); | 255 FamilyData* self = static_cast<FamilyData*>(data); |
| 253 size_t len = strlen(tag); | 256 size_t len = strlen(tag); |
| 254 if (MEMEQ("family", tag, len)) { | 257 if (MEMEQ("family", tag, len)) { |
| 255 self->fCurrentFamily.reset(new FontFamily(self->fBasePath, self->fIsFall
back)); | 258 family_element_handler(self, attributes); |
| 256 family_element_handler(self->fCurrentFamily, attributes); | |
| 257 } else if (MEMEQ("font", tag, len)) { | 259 } else if (MEMEQ("font", tag, len)) { |
| 258 FontFileInfo* file = &self->fCurrentFamily->fFonts.push_back(); | 260 font_element_handler(self, attributes); |
| 259 self->fCurrentFontInfo = file; | |
| 260 font_element_handler(self, file, attributes); | |
| 261 } else if (MEMEQ("alias", tag, len)) { | 261 } else if (MEMEQ("alias", tag, len)) { |
| 262 alias_element_handler(self, attributes); | 262 alias_element_handler(self, attributes); |
| 263 } | 263 } |
| 264 } | 264 } |
| 265 | 265 |
| 266 static void XMLCALL end_element_handler(void* data, const char* tag) { | 266 static void XMLCALL end_element_handler(void* data, const char* tag) { |
| 267 FamilyData* self = static_cast<FamilyData*>(data); | 267 FamilyData* self = static_cast<FamilyData*>(data); |
| 268 size_t len = strlen(tag); | 268 size_t len = strlen(tag); |
| 269 if (MEMEQ("family", tag, len)) { | 269 if (MEMEQ("family", tag, len)) { |
| 270 *self->fFamilies.append() = self->fCurrentFamily.detach(); | 270 *self->fFamilies.append() = self->fCurrentFamily.detach(); |
| (...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 650 const char* tag = fTag.c_str(); | 650 const char* tag = fTag.c_str(); |
| 651 | 651 |
| 652 // strip off the rightmost "-.*" | 652 // strip off the rightmost "-.*" |
| 653 const char* parentTagEnd = strrchr(tag, '-'); | 653 const char* parentTagEnd = strrchr(tag, '-'); |
| 654 if (parentTagEnd == NULL) { | 654 if (parentTagEnd == NULL) { |
| 655 return SkLanguage(); | 655 return SkLanguage(); |
| 656 } | 656 } |
| 657 size_t parentTagLen = parentTagEnd - tag; | 657 size_t parentTagLen = parentTagEnd - tag; |
| 658 return SkLanguage(tag, parentTagLen); | 658 return SkLanguage(tag, parentTagLen); |
| 659 } | 659 } |
| OLD | NEW |