FontFace * FontImporter::loadFont(const std::string & filename) { std::ifstream in(filename, std::ios::in | std::ios::binary); if (!in) { return nullptr; } FontFace * font = new FontFace(); std::string line; std::string identifier; while (std::getline(in, line)) { std::stringstream ss(line); if (std::getline(ss, identifier, ' ')) { if (identifier == "info") { handleInfo(ss, font); } else if (identifier == "common") { handleCommon(ss, font); } else if (identifier == "page") { handlePage(ss, font, filename); } else if (identifier == "chars") { handleChars(ss, font); } else if (identifier == "char") { handleChar(ss, font); } else if (identifier == "kernings") { handleKernings(ss, font); } else if (identifier == "kerning") { handleKerning(ss, font); } else { assert(false); } } else { assert(false); } } if (!font->glyphTexture()) { delete font; return nullptr; } return font; }
void GrimEngine::mainLoop() { _movieTime = 0; _frameTime = 0; _frameStart = g_system->getMillis(); _frameCounter = 0; _timeAccum = 0; _frameTimeCollection = 0; _prevSmushFrame = 0; _savegameLoadRequest = false; _savegameSaveRequest = false; _savegameFileName = NULL; _refreshShadowMask = false; for (;;) { uint32 startTime = g_system->getMillis(); if (_savegameLoadRequest) { savegameRestore(); } if (_savegameSaveRequest) { savegameSave(); } g_imuse->flushTracks(); g_imuse->refreshScripts(); if (_mode == ENGINE_MODE_IDLE) { // don't kill CPU g_system->delayMillis(10); continue; } // Process events Common::Event event; while (g_system->getEventManager()->pollEvent(event)) { // Handle any buttons, keys and joystick operations if (event.type == Common::EVENT_KEYDOWN) { if (_mode != ENGINE_MODE_DRAW && _mode != ENGINE_MODE_SMUSH && (event.kbd.ascii == 'q')) { handleExit(); break; } else { handleChars(event.type, event.kbd.keycode, event.kbd.flags, event.kbd.ascii); } } if (event.type == Common::EVENT_KEYDOWN || event.type == Common::EVENT_KEYUP) { handleControls(event.type, event.kbd.keycode, event.kbd.flags, event.kbd.ascii); } // Check for "Hard" quit" if (event.type == Common::EVENT_QUIT) return; if (event.type == Common::EVENT_SCREEN_CHANGED) _refreshDrawNeeded = true; } luaUpdate(); if (_mode != ENGINE_MODE_PAUSE) { updateDisplayScene(); doFlip(); } if (g_imuseState != -1) { g_imuse->setMusicState(g_imuseState); g_imuseState = -1; } uint32 endTime = g_system->getMillis(); if (startTime > endTime) continue; uint32 diffTime = endTime - startTime; if (_speedLimitMs == 0) continue; if (diffTime < _speedLimitMs) { uint32 delayTime = _speedLimitMs - diffTime; g_system->delayMillis(delayTime); } } }