/** * This function parses the given filename and stores the results in the given * families array. */ static void parseConfigFile(const char *filename, SkTDArray<FontFamily*> &families) { FILE* file = NULL; #if !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) // if we are using a version of Android prior to Android 4.2 (JellyBean MR1 // at API Level 17) then we need to look for files with a different suffix. char sdkVersion[PROP_VALUE_MAX]; __system_property_get("ro.build.version.sdk", sdkVersion); const int sdkVersionInt = atoi(sdkVersion); if (0 != *sdkVersion && sdkVersionInt < 17) { SkString basename; SkString updatedFilename; SkString locale = SkFontConfigParser::GetLocale(); basename.set(filename); // Remove the .xml suffix. We'll add it back in a moment. if (basename.endsWith(".xml")) { basename.resize(basename.size()-4); } // Try first with language and region updatedFilename.printf("%s-%s.xml", basename.c_str(), locale.c_str()); file = fopen(updatedFilename.c_str(), "r"); if (!file) { // If not found, try next with just language updatedFilename.printf("%s-%.2s.xml", basename.c_str(), locale.c_str()); file = fopen(updatedFilename.c_str(), "r"); } } #endif if (NULL == file) { file = fopen(filename, "r"); } // Some of the files we attempt to parse (in particular, /vendor/etc/fallback_fonts.xml) // are optional - failure here is okay because one of these optional files may not exist. if (NULL == file) { return; } XML_Parser parser = XML_ParserCreate(NULL); FamilyData *familyData = new FamilyData(&parser, families); XML_SetUserData(parser, familyData); XML_SetElementHandler(parser, startElementHandler, endElementHandler); char buffer[512]; bool done = false; while (!done) { fgets(buffer, sizeof(buffer), file); int len = strlen(buffer); if (feof(file) != 0) { done = true; } XML_Parse(parser, buffer, len, done); } XML_ParserFree(parser); fclose(file); }
/** * Use the current system locale (language and region) to open the best matching * customization. For example, when the language is Japanese, the sequence might be: * /system/etc/fallback_fonts-ja-JP.xml * /system/etc/fallback_fonts-ja.xml * /system/etc/fallback_fonts.xml */ FILE* openLocalizedFile(const char* origname) { FILE* file = 0; #if !defined(SK_BUILD_FOR_ANDROID_NDK) SkString basename; SkString filename; char language[3] = ""; char region[3] = ""; basename.set(origname); // Remove the .xml suffix. We'll add it back in a moment. if (basename.endsWith(".xml")) { basename.resize(basename.size()-4); } getLocale(language, region); // Try first with language and region filename.printf("%s-%s-%s.xml", basename.c_str(), language, region); file = fopen(filename.c_str(), "r"); if (!file) { // If not found, try next with just language filename.printf("%s-%s.xml", basename.c_str(), language); file = fopen(filename.c_str(), "r"); } #endif if (!file) { // If still not found, try just the original name file = fopen(origname, "r"); } return file; }
SkTypeface* SkFontHost::Deserialize(SkStream* stream) { load_system_fonts(); int style = stream->readU8(); int len = stream->readPackedUInt(); if (len > 0) { SkString str; str.resize(len); stream->read(str.writable_str(), len); const FontInitRec* rec = gSystemFonts; for (size_t i = 0; i < SK_ARRAY_COUNT(gSystemFonts); i++) { if (strcmp(rec[i].fFileName, str.c_str()) == 0) { // backup until we hit the fNames for (int j = i; j >= 0; --j) { if (rec[j].fNames != NULL) { return SkFontHost::CreateTypeface(NULL, rec[j].fNames[0], (SkTypeface::Style)style); } } } } } return NULL; }
/** * Use the current system locale (language and region) to open the best matching * customization. For example, when the language is Japanese, the sequence might be: * /system/etc/fallback_fonts-ja-JP.xml * /system/etc/fallback_fonts-ja.xml * /system/etc/fallback_fonts.xml */ FILE* openLocalizedFile(const char* origname) { FILE* file = 0; SkString basename; SkString filename; AndroidLocale locale; basename.set(origname); // Remove the .xml suffix. We'll add it back in a moment. if (basename.endsWith(".xml")) { basename.resize(basename.size()-4); } getLocale(locale); // Try first with language and region filename.printf("%s-%s-%s.xml", basename.c_str(), locale.language, locale.region); file = fopen(filename.c_str(), "r"); if (!file) { // If not found, try next with just language filename.printf("%s-%s.xml", basename.c_str(), locale.language); file = fopen(filename.c_str(), "r"); if (!file) { // If still not found, try just the original name file = fopen(origname, "r"); } } return file; }
bool SkCLImageDiffer::loadKernelStream(SkStream* stream, const char name[], cl_kernel* kernel) { // Read the kernel source into memory SkString sourceString; sourceString.resize(stream->getLength()); size_t bytesRead = stream->read(sourceString.writable_str(), sourceString.size()); if (bytesRead != sourceString.size()) { SkDebugf("Failed to read kernel source file"); return false; } return loadKernelSource(sourceString.c_str(), name, kernel); }
void SkXMLWriter::addAttributeLen(const char name[], const char value[], size_t length) { SkString valueStr; if (fDoEscapeMarkup) { size_t extra = escape_markup(nullptr, value, length); if (extra) { valueStr.resize(length + extra); (void)escape_markup(valueStr.writable_str(), value, length); value = valueStr.c_str(); length += extra; } } this->onAddAttributeLen(name, value, length); }
void SkDebugCanvas::outputScalar(SkScalar num) { if (num == (int) num) { fClipStackData.appendf("%d", (int) num); } else { SkString str; str.printf("%1.9g", num); int width = (int) str.size(); const char* cStr = str.c_str(); while (cStr[width - 1] == '0') { --width; } str.resize(width); fClipStackData.appendf("%sf", str.c_str()); } }
static void output_scalar(SkScalar num) { if (num == (int) num) { SkDebugf("%d", (int) num); } else { SkString str; str.printf("%1.9g", num); int width = (int) str.size(); const char* cStr = str.c_str(); while (cStr[width - 1] == '0') { --width; } str.resize(width); SkDebugf("%sf", str.c_str()); } }
static SkTypeface* deserializeLocked(SkStream* stream) { loadSystemFontsLocked(); // check if the font is a custom or system font bool isCustomFont = stream->readBool(); if (isCustomFont) { // read the length of the custom font from the stream uint32_t len = stream->readU32(); // generate a new stream to store the custom typeface SkMemoryStream* fontStream = new SkMemoryStream(len); stream->read((void*)fontStream->getMemoryBase(), len); SkTypeface* face = createTypefaceFromStreamLocked(fontStream); fontStream->unref(); // SkDebugf("--- fonthost custom deserialize %d %d\n", face->style(), len); return face; } else { int style = stream->readU8(); int len = stream->readPackedUInt(); if (len > 0) { SkString str; str.resize(len); stream->read(str.writable_str(), len); // Embedded fonts. for (int i = 0; i < gSystemFonts.count(); i++) { SkString fullpath; getFullPathForSysFonts( &fullpath, gSystemFonts[i].fFileName ); const char * name = fullpath.c_str(); if (strcmp(name, str.c_str()) == 0) { // backup until we hit the fNames for (int j = i; j >= 0; --j) { if (gSystemFonts[j].fNames != NULL) { return createTypefaceLocked(NULL, gSystemFonts[j].fNames[0], NULL, 0, (SkTypeface::Style)style); } } } } // Download fonts. SkFontManager * fmg = getInstance(); uint32_t numAllFonts = fmg->getFamilyCount(); uint32_t numEmbeddedFonts = fmg->getEmbeddedFamilyCount(); for (int i = numEmbeddedFonts; i < numAllFonts; i++) { SkFontData * font = fmg->getFont( i ); const char * name = font->getFontFullPath(); if (strcmp(name, str.c_str()) == 0) { // backup until we hit the fNames return createTypefaceLocked(NULL, font->getWebFaceName(), NULL, 0, (SkTypeface::Style)style); } } } } return NULL; }