bool ThemeEngine::themeConfigUsable(const Common::FSNode &node, Common::String &themeName) { Common::File stream; bool foundHeader = false; if (node.getName().matchString("*.zip", true) && !node.isDirectory()) { Common::Archive *zipArchive = Common::makeZipArchive(node); if (zipArchive && zipArchive->hasFile("THEMERC")) { // Open THEMERC from the ZIP file. stream.open("THEMERC", *zipArchive); } // Delete the ZIP archive again. Note: This only works because // stream.open() only uses ZipArchive::createReadStreamForMember, // and that in turn happens to read all the data for a given // archive member into a memory block. So there will be no dangling // reference to zipArchive anywhere. This could change if we // ever modify ZipArchive::createReadStreamForMember. delete zipArchive; } else if (node.isDirectory()) { Common::FSNode headerfile = node.getChild("THEMERC"); if (!headerfile.exists() || !headerfile.isReadable() || headerfile.isDirectory()) return false; stream.open(headerfile); } if (stream.isOpen()) { Common::String stxHeader = stream.readLine(); foundHeader = themeConfigParseHeader(stxHeader, themeName); } return foundHeader; }
bool ThemeEngine::themeConfigUsable(const Common::ArchiveMember &member, Common::String &themeName) { Common::File stream; bool foundHeader = false; if (member.getName().matchString("*.zip", true)) { Common::Archive *zipArchive = Common::makeZipArchive(member.createReadStream()); if (zipArchive && zipArchive->hasFile("THEMERC")) { stream.open("THEMERC", *zipArchive); } delete zipArchive; } if (stream.isOpen()) { Common::String stxHeader = stream.readLine(); foundHeader = themeConfigParseHeader(stxHeader, themeName); } return foundHeader; }
/** * Scans through the archive list for a specified file */ Common::ArchiveMemberPtr PackageManager::getArchiveMember(const Common::String &fileName) { // Loop through checking each archive Common::List<ArchiveEntry *>::iterator i; for (i = _archiveList.begin(); i != _archiveList.end(); ++i) { if (!fileName.hasPrefix((*i)->_mountPath)) { // The mount path is in different subtree. Skipping continue; } // Look into the archive for the desired file Common::Archive *archiveFolder = (*i)->archive; // Construct relative path Common::String resPath(&fileName.c_str()[(*i)->_mountPath.size()]); if (archiveFolder->hasFile(resPath)) { return archiveFolder->getMember(resPath); } } return Common::ArchiveMemberPtr(); }
/* load the keyboard into memory */ bool PSPKeyboard::load() { DEBUG_ENTER_FUNC(); if (_init) { PSP_DEBUG_PRINT("keyboard already loaded into memory\n"); return true; } // For the shell, we must use a hack #ifdef PSP_KB_SHELL Common::FSNode node(PSP_KB_SHELL_PATH); #else /* normal mode */ Common::FSNode node("."); // Look in current directory #endif PSP_DEBUG_PRINT("path[%s]\n", node.getPath().c_str()); Common::Archive *fileArchive = NULL; Common::Archive *zipArchive = NULL; Common::SeekableReadStream * file = 0; if (node.getChild("kbd").exists() && node.getChild("kbd").isDirectory()) { PSP_DEBUG_PRINT("found directory ./kbd\n"); fileArchive = new Common::FSDirectory(node.getChild("kbd")); } if (node.getChild("kbd.zip").exists()) { PSP_DEBUG_PRINT("found kbd.zip\n"); zipArchive = Common::makeZipArchive(node.getChild("kbd.zip")); } int i; // Loop through all png images for (i = 0; i < guiStringsSize; i++) { PSP_DEBUG_PRINT("Opening %s.\n", _guiStrings[i]); // Look for the file in the kbd directory if (fileArchive && fileArchive->hasFile(_guiStrings[i])) { PSP_DEBUG_PRINT("found it in kbd directory.\n"); file = fileArchive->createReadStreamForMember(_guiStrings[i]); if (!file) { PSP_ERROR("Can't open kbd/%s for keyboard. No keyboard will load.\n", _guiStrings[i]); goto ERROR; } } // We didn't find it. Look for it in the zip file else if (zipArchive && zipArchive->hasFile(_guiStrings[i])) { PSP_DEBUG_PRINT("found it in kbd.zip.\n"); file = zipArchive->createReadStreamForMember(_guiStrings[i]); if (!file) { PSP_ERROR("Can't open %s in kbd.zip for keyboard. No keyboard will load.\n", _guiStrings[i]); goto ERROR; } } else { // Couldn't find the file PSP_ERROR("Can't find %s for keyboard. No keyboard will load.\n", _guiStrings[i]); goto ERROR; } PngLoader image(file, _buffers[i], _palettes[i]); if (image.allocate() != PngLoader::OK) { PSP_ERROR("Failed to allocate memory for keyboard image %s\n", _guiStrings[i]); goto ERROR; } if (!image.load()) { PSP_ERROR("Failed to load image from file %s\n", _guiStrings[i]); goto ERROR; } delete file; } /* for loop */ _init = true; delete fileArchive; delete zipArchive; return true; ERROR: delete file; delete fileArchive; delete zipArchive; for (int j = 0; j < i; j++) { _buffers[j].deallocate(); _palettes[j].deallocate(); } _init = false; return false; }
bool StyledTTFont::loadFont(const Common::String &fontName, int32 point) { Common::String newFontName; if (fontName.matchString("*times new roman*", true) || fontName.matchString("*times*", true)) { if ((_style & (STTF_BOLD | STTF_ITALIC)) == (STTF_BOLD | STTF_ITALIC)) newFontName = "timesbi.ttf"; else if (_style & STTF_BOLD) newFontName = "timesbd.ttf"; else if (_style & STTF_ITALIC) newFontName = "timesi.ttf"; else newFontName = "times.ttf"; } else if (fontName.matchString("*courier new*", true) || fontName.matchString("*courier*", true) || fontName.matchString("*ZorkDeath*", true)) { if ((_style & (STTF_BOLD | STTF_ITALIC)) == (STTF_BOLD | STTF_ITALIC)) newFontName = "courbi.ttf"; else if (_style & STTF_BOLD) newFontName = "courbd.ttf"; else if (_style & STTF_ITALIC) newFontName = "couri.ttf"; else newFontName = "cour.ttf"; } else if (fontName.matchString("*century schoolbook*", true)) { if ((_style & (STTF_BOLD | STTF_ITALIC)) == (STTF_BOLD | STTF_ITALIC)) newFontName = "censcbkbi.ttf"; else if (_style & STTF_BOLD) newFontName = "censcbkbd.ttf"; else if (_style & STTF_ITALIC) newFontName = "censcbki.ttf"; else newFontName = "censcbk.ttf"; } else if (fontName.matchString("*garamond*", true)) { if ((_style & (STTF_BOLD | STTF_ITALIC)) == (STTF_BOLD | STTF_ITALIC)) newFontName = "garabi.ttf"; else if (_style & STTF_BOLD) newFontName = "garabd.ttf"; else if (_style & STTF_ITALIC) newFontName = "garai.ttf"; else newFontName = "gara.ttf"; } else if (fontName.matchString("*arial*", true) || fontName.matchString("*ZorkNormal*", true)) { if ((_style & (STTF_BOLD | STTF_ITALIC)) == (STTF_BOLD | STTF_ITALIC)) newFontName = "arialbi.ttf"; else if (_style & STTF_BOLD) newFontName = "arialbd.ttf"; else if (_style & STTF_ITALIC) newFontName = "ariali.ttf"; else newFontName = "arial.ttf"; } else { debug("Could not identify font: %s. Reverting to Arial", fontName.c_str()); newFontName = "arial.ttf"; } bool sharp = (_style & STTF_SHARP) == STTF_SHARP; Common::File *file = _engine->getSearchManager()->openFile(newFontName); if (!file) { Common::SeekableReadStream *themeFile = nullptr; if (ConfMan.hasKey("themepath")) { Common::FSNode themePath(ConfMan.get("themepath")); if (themePath.exists()) { Common::FSNode scummModern = themePath.getChild("scummmodern.zip"); if (scummModern.exists()) { themeFile = scummModern.createReadStream(); } } } if (!themeFile) { // Fallback : Search for ScummModern.zip in SearchMan. themeFile = SearchMan.createReadStreamForMember("scummmodern.zip"); } if (themeFile) { Common::Archive *themeArchive = Common::makeZipArchive(themeFile); if (themeArchive->hasFile("FreeSans.ttf")) { Common::SeekableReadStream *stream = nullptr; stream = themeArchive->createReadStreamForMember("FreeSans.ttf"); Graphics::Font *_newFont = Graphics::loadTTFFont(*stream, point, 60, (sharp ? Graphics::kTTFRenderModeMonochrome : Graphics::kTTFRenderModeNormal)); // 66 dpi for 640 x 480 on 14" display if (_newFont) { if (!_font) delete _font; _font = _newFont; } if (stream) delete stream; } delete themeArchive; themeArchive = nullptr; } } else { Graphics::Font *_newFont = Graphics::loadTTFFont(*file, point, 60, (sharp ? Graphics::kTTFRenderModeMonochrome : Graphics::kTTFRenderModeNormal)); // 66 dpi for 640 x 480 on 14" display if (_newFont) { if (!_font) delete _font; _font = _newFont; } delete file; } _fntName = fontName; _lineHeight = point; if (_font) return true; return false; }