Common::HashMap<Common::String, uint32> DefaultSaveFileManager::loadTimestamps() { Common::HashMap<Common::String, uint32> timestamps; //refresh the files list Common::Array<Common::String> files; g_system->getSavefileManager()->updateSavefilesList(files); //start with listing all the files in saves/ directory and setting invalid timestamp to them Common::StringArray localFiles = g_system->getSavefileManager()->listSavefiles("*"); for (uint32 i = 0; i < localFiles.size(); ++i) timestamps[localFiles[i]] = INVALID_TIMESTAMP; //now actually load timestamps from file Common::InSaveFile *file = g_system->getSavefileManager()->openRawFile(TIMESTAMPS_FILENAME); if (!file) { warning("DefaultSaveFileManager: failed to open '%s' file to load timestamps", TIMESTAMPS_FILENAME); return timestamps; } while (!file->eos()) { //read filename into buffer (reading until the first ' ') Common::String buffer; while (!file->eos()) { byte b = file->readByte(); if (b == ' ') break; buffer += (char)b; } //read timestamp info buffer (reading until ' ' or some line ending char) Common::String filename = buffer; while (true) { bool lineEnded = false; buffer = ""; while (!file->eos()) { byte b = file->readByte(); if (b == ' ' || b == '\n' || b == '\r') { lineEnded = (b == '\n'); break; } buffer += (char)b; } if (buffer == "" && file->eos()) break; if (!lineEnded) filename += " " + buffer; else break; } //parse timestamp uint32 timestamp = buffer.asUint64(); if (buffer == "" || timestamp == 0) break; if (timestamps.contains(filename)) timestamps[filename] = timestamp; } delete file; return timestamps; }
Common::StringArray DefaultSaveFileManager::listSavefiles(const Common::String &pattern) { // Assure the savefile name cache is up-to-date. assureCached(getSavePath()); if (getError().getCode() != Common::kNoError) return Common::StringArray(); Common::HashMap<Common::String, bool> locked; for (Common::StringArray::const_iterator i = _lockedFiles.begin(), end = _lockedFiles.end(); i != end; ++i) { locked[*i] = true; } Common::StringArray results; for (SaveFileCache::const_iterator file = _saveFileCache.begin(), end = _saveFileCache.end(); file != end; ++file) { if (!locked.contains(file->_key) && file->_key.matchString(pattern, true)) { results.push_back(file->_key); } } return results; }
bool ThemeEngine::createCursor(const Common::String &filename, int hotspotX, int hotspotY, int scale) { if (!_system->hasFeature(OSystem::kFeatureCursorPalette)) return true; // Try to locate the specified file among all loaded bitmaps const Graphics::Surface *cursor = _bitmaps[filename]; if (!cursor) return false; #ifdef USE_RGB_COLOR _cursorFormat.bytesPerPixel = 1; _cursorFormat.rLoss = _cursorFormat.gLoss = _cursorFormat.bLoss = _cursorFormat.aLoss = 8; _cursorFormat.rShift = _cursorFormat.gShift = _cursorFormat.bShift = _cursorFormat.aShift = 0; #endif // Set up the cursor parameters _cursorHotspotX = hotspotX; _cursorHotspotY = hotspotY; _cursorTargetScale = scale; _cursorWidth = cursor->w; _cursorHeight = cursor->h; // Allocate a new buffer for the cursor delete[] _cursor; _cursor = new byte[_cursorWidth * _cursorHeight]; assert(_cursor); memset(_cursor, 0xFF, sizeof(byte) * _cursorWidth * _cursorHeight); // the transparent color is 0xFF00FF const int colTransparent = _overlayFormat.RGBToColor(0xFF, 0, 0xFF); // Now, scan the bitmap. We have to convert it from 16 bit color mode // to 8 bit mode, and have to create a suitable palette on the fly. uint colorsFound = 0; Common::HashMap<int, int> colorToIndex; const OverlayColor *src = (const OverlayColor *)cursor->pixels; for (uint y = 0; y < _cursorHeight; ++y) { for (uint x = 0; x < _cursorWidth; ++x) { byte r, g, b; // Skip transparency if (src[x] == colTransparent) continue; _overlayFormat.colorToRGB(src[x], r, g, b); const int col = (r << 16) | (g << 8) | b; // If there is no entry yet for this color in the palette: Add one if (!colorToIndex.contains(col)) { const int index = colorsFound++; colorToIndex[col] = index; _cursorPal[index * 3 + 0] = r; _cursorPal[index * 3 + 1] = g; _cursorPal[index * 3 + 2] = b; if (colorsFound > MAX_CURS_COLORS) { warning("Cursor contains too many colors (%d, but only %d are allowed)", colorsFound, MAX_CURS_COLORS); return false; } } // Copy pixel from the 16 bit source surface to the 8bit target surface const int index = colorToIndex[col]; _cursor[y * _cursorWidth + x] = index; } src += _cursorWidth; } _useCursor = true; _cursorPalSize = colorsFound; return true; }