void Screen::randomTransition() { Events &events = *_vm->_events; const int TRANSITION_MULTIPLIER = 0x15a4e35; clearDirtyRects(); assert(IS_SERRATED_SCALPEL); for (int idx = 0; idx <= 65535 && !_vm->shouldQuit(); ++idx) { _transitionSeed = _transitionSeed * TRANSITION_MULTIPLIER + 1; int offset = _transitionSeed & 0xFFFF; if (offset < (this->width() * this->height())) *((byte *)getPixels() + offset) = *((const byte *)_backBuffer.getPixels() + offset); if (idx != 0 && (idx % 300) == 0) { // Ensure there's a full screen dirty rect for the next frame update if (!isDirty()) addDirtyRect(Common::Rect(0, 0, this->w, this->h)); events.pollEvents(); events.delay(1); } } // Make sure everything has been transferred SHblitFrom(_backBuffer); }
void FlicDecoder::FlicVideoTrack::copyDirtyRectsToBuffer(uint8 *dst, uint pitch) { for (Common::List<Common::Rect>::const_iterator it = _dirtyRects.begin(); it != _dirtyRects.end(); ++it) { for (int y = (*it).top; y < (*it).bottom; ++y) { const int x = (*it).left; memcpy(dst + y * pitch + x, (byte *)_surface->getBasePtr(x, y), (*it).right - x); } } clearDirtyRects(); }
void Scalpel3DOScreen::fadeIntoScreen3DO(int speed) { Events &events = *_vm->_events; uint16 *currentScreenBasePtr = (uint16 *)getPixels(); uint16 *targetScreenBasePtr = (uint16 *)_backBuffer.getPixels(); uint16 currentScreenPixel = 0; uint16 targetScreenPixel = 0; uint16 currentScreenPixelRed = 0; uint16 currentScreenPixelGreen = 0; uint16 currentScreenPixelBlue = 0; uint16 targetScreenPixelRed = 0; uint16 targetScreenPixelGreen = 0; uint16 targetScreenPixelBlue = 0; uint16 screenWidth = SHERLOCK_SCREEN_WIDTH; uint16 screenHeight = SHERLOCK_SCREEN_HEIGHT; uint16 screenX = 0; uint16 screenY = 0; uint16 pixelsChanged = 0; clearDirtyRects(); do { pixelsChanged = 0; uint16 *currentScreenPtr = currentScreenBasePtr; uint16 *targetScreenPtr = targetScreenBasePtr; for (screenY = 0; screenY < screenHeight; screenY++) { for (screenX = 0; screenX < screenWidth; screenX++) { currentScreenPixel = *currentScreenPtr; targetScreenPixel = *targetScreenPtr; if (currentScreenPixel != targetScreenPixel) { // pixel doesn't match, adjust accordingly currentScreenPixelRed = currentScreenPixel & 0xF800; currentScreenPixelGreen = currentScreenPixel & 0x07E0; currentScreenPixelBlue = currentScreenPixel & 0x001F; targetScreenPixelRed = targetScreenPixel & 0xF800; targetScreenPixelGreen = targetScreenPixel & 0x07E0; targetScreenPixelBlue = targetScreenPixel & 0x001F; if (currentScreenPixelRed != targetScreenPixelRed) { if (currentScreenPixelRed < targetScreenPixelRed) { currentScreenPixelRed += 0x0800; } else { currentScreenPixelRed -= 0x0800; } } if (currentScreenPixelGreen != targetScreenPixelGreen) { // Adjust +2/-2 because we are running RGB555 at RGB565 if (currentScreenPixelGreen < targetScreenPixelGreen) { currentScreenPixelGreen += 0x0040; } else { currentScreenPixelGreen -= 0x0040; } } if (currentScreenPixelBlue != targetScreenPixelBlue) { if (currentScreenPixelBlue < targetScreenPixelBlue) { currentScreenPixelBlue += 0x0001; } else { currentScreenPixelBlue -= 0x0001; } } uint16 v = currentScreenPixelRed | currentScreenPixelGreen | currentScreenPixelBlue; *currentScreenPtr = v; if (_vm->_isScreenDoubled) { *(currentScreenPtr + 1) = v; *(currentScreenPtr + 640) = v; *(currentScreenPtr + 640 + 1) = v; } pixelsChanged++; } currentScreenPtr += _vm->_isScreenDoubled ? 2 : 1; targetScreenPtr++; } if (_vm->_isScreenDoubled) currentScreenPtr += 640; } // Too much considered dirty at the moment if (_vm->_isScreenDoubled) addDirtyRect(Common::Rect(0, 0, screenWidth * 2, screenHeight * 2)); else addDirtyRect(Common::Rect(0, 0, screenWidth, screenHeight)); events.pollEvents(); events.delay(10 * speed); } while ((pixelsChanged) && (!_vm->shouldQuit())); }
void ToucheEngine::loadGameStateData(Common::ReadStream *stream) { setKeyCharMoney(); clearDirtyRects(); _flagsTable[115] = 0; clearRoomArea(); _currentEpisodeNum = stream->readUint16LE(); _newMusicNum = stream->readUint16LE(); _currentRoomNum = stream->readUint16LE(); res_loadRoom(_currentRoomNum); int16 roomOffsX = _flagsTable[614] = stream->readUint16LE(); int16 roomOffsY = _flagsTable[615] = stream->readUint16LE(); _disabledInputCounter = stream->readUint16LE(); res_loadProgram(_currentEpisodeNum); setupEpisode(-1); saveOrLoadCommonArray(*stream, _programHitBoxTable); saveOrLoadCommonArray(*stream, _programBackgroundTable); saveOrLoadCommonArray(*stream, _programAreaTable); saveOrLoadCommonArray(*stream, _programWalkTable); saveOrLoadCommonArray(*stream, _programPointsTable); stream->read(_updatedRoomAreasTable, 200); for (uint i = 1; i < _updatedRoomAreasTable[0]; ++i) { updateRoomAreas(_updatedRoomAreasTable[i], -1); } saveOrLoadStaticArray(*stream, _sequenceEntryTable, NUM_SEQUENCES); saveOrLoadStaticArray(*stream, _flagsTable, 1024); saveOrLoadStaticArray(*stream, _inventoryList1, 100); saveOrLoadStaticArray(*stream, _inventoryList2, 100); saveOrLoadStaticArray(*stream, _inventoryList3, 6); saveOrLoadStaticArray(*stream, _keyCharsTable, NUM_KEYCHARS); saveOrLoadStaticArray(*stream, _inventoryItemsInfoTable, NUM_INVENTORY_ITEMS); saveOrLoadStaticArray(*stream, _talkTable, NUM_TALK_ENTRIES); _talkListEnd = stream->readUint16LE(); _talkListCurrent = stream->readUint16LE(); if (stream->readUint32LE() != saveLoadEndMarker) { warning("Corrupted gamestate data"); // if that ever happens, exit the game quitGame(); } _flagsTable[614] = roomOffsX; _flagsTable[615] = roomOffsY; for (uint i = 0; i < NUM_SEQUENCES; ++i) { if (_sequenceEntryTable[i].seqNum != -1) { res_loadSequence(_sequenceEntryTable[i].seqNum, i); } if (_sequenceEntryTable[i].sprNum != -1) { res_loadSprite(_sequenceEntryTable[i].sprNum, i); } } _currentKeyCharNum = _flagsTable[104]; _inventoryStateTable[0].displayOffset = 0; _inventoryStateTable[1].displayOffset = 0; _inventoryStateTable[2].displayOffset = 0; drawInventory(_currentKeyCharNum, 1); Graphics::copyRect(_offscreenBuffer, kScreenWidth, 0, 0, _backdropBuffer, _currentBitmapWidth, _flagsTable[614], _flagsTable[615], kScreenWidth, kRoomHeight); updateRoomRegions(); _fullRedrawCounter = 1; _roomNeedRedraw = false; if (_flagsTable[617] != 0) { res_loadSpeech(_flagsTable[617]); } debug(0, "Loaded state, current episode %d", _currentEpisodeNum); }