void RivenGraphics::updateCredits() { if ((_creditsImage == 303 || _creditsImage == 304) && _creditsPos == 0) fadeToBlack(); if (_creditsImage < 304) { // For the first two credit images, they are faded from black to the image and then out again scheduleTransition(16); Graphics::Surface *frame = findImage(_creditsImage++)->getSurface(); for (int y = 0; y < frame->h; y++) memcpy(_mainScreen->getBasePtr(124, y), frame->getBasePtr(0, y), frame->pitch); runScheduledTransition(); } else { // Otheriwse, we're scrolling // Move the screen up one row memmove(_mainScreen->pixels, _mainScreen->getBasePtr(0, 1), _mainScreen->pitch * (_mainScreen->h - 1)); // Only update as long as we're not before the last frame // Otherwise, we're just moving up a row (which we already did) if (_creditsImage <= 320) { // Copy the next row to the bottom of the screen Graphics::Surface *frame = findImage(_creditsImage)->getSurface(); memcpy(_mainScreen->getBasePtr(124, _mainScreen->h - 1), frame->getBasePtr(0, _creditsPos), frame->pitch); _creditsPos++; if (_creditsPos == _mainScreen->h) { _creditsImage++; _creditsPos = 0; } } // Now flush the new screen _vm->_system->copyRectToScreen((byte *)_mainScreen->pixels, _mainScreen->pitch, 0, 0, _mainScreen->w, _mainScreen->h); _vm->_system->updateScreen(); } }
/** Play FLA movies @param flaName FLA movie name */ void playFlaMovie(int8 *flaName) { int32 i; int32 quit = 0; int32 currentFrame; int16 tmpValue; int8 fileNamePath[256]; stopSamples(); // Play FLA PCX instead of movies if (cfgfile.Movie == CONF_MOVIE_FLAPCX) { fla_pcxList(flaName); return; } stopMusic(); // take extension if movie name has it for (i = 0; i < (int32)strlen(flaName); i++) { if(flaName[i] == '.') { flaName[i] = 0; } } sprintf(fileNamePath, FLA_DIR); strcat(fileNamePath, flaName); strcat(fileNamePath, FLA_EXT); _fadeOut = -1; fadeOutFrames = 0; if (!fropen2(&frFla, fileNamePath, "rb")) return; workVideoBufferCopy = workVideoBuffer; frread(&frFla, &flaHeaderData.version, 6); frread(&frFla, &flaHeaderData.numOfFrames, 4); frread(&frFla, &flaHeaderData.speed, 1); frread(&frFla, &flaHeaderData.var1, 1); frread(&frFla, &flaHeaderData.xsize, 2); frread(&frFla, &flaHeaderData.ysize, 2); frread(&frFla, &samplesInFla, 2); frread(&frFla, &tmpValue, 2); for (i = 0; i < samplesInFla; i++) { int16 var0; int16 var1; frread(&frFla, &var0, 2); frread(&frFla, &var1, 2); flaSampleTable[i] = var0; } if (!strcmp(flaHeaderData.version, "V1.3")) { currentFrame = 0; if (!quit) { do { if (currentFrame == flaHeaderData.numOfFrames) quit = 1; else { processFrame(); scaleFla2x(); copyScreen(workVideoBuffer, frontVideoBuffer); // Only blit to screen if isn't a fade if (_fadeOut == -1) { convertPalToRGBA(palette, paletteRGBACustom); if (!currentFrame) // fade in the first frame fadeIn(paletteRGBACustom); else setPalette(paletteRGBACustom); } // TRICKY: fade in tricky if (fadeOutFrames >= 2) { flip(); convertPalToRGBA(palette, paletteRGBACustom); fadeToPal(paletteRGBACustom); _fadeOut = -1; fadeOutFrames = 0; } currentFrame++; fpsCycles(flaHeaderData.speed + 1); readKeys(); if (skipIntro) break; } } while (!quit); } } if (cfgfile.CrossFade) { crossFade(frontVideoBuffer, paletteRGBACustom); } else { fadeToBlack(paletteRGBACustom); } stopSamples(); }
/** FLA movie process frame */ void processFrame() { FLASampleStruct sample; uint32 opcodeBlockSize; uint8 opcode; int32 aux = 0; uint8 * ptr; frread(&frFla, &frameData.videoSize, 1); frread(&frFla, &frameData.dummy, 1); frread(&frFla, &frameData.frameVar0, 4); frread(&frFla, workVideoBufferCopy, frameData.frameVar0); if ((int32)frameData.videoSize <= 0) return; ptr = workVideoBufferCopy; do { opcode = *((uint8*)ptr); ptr += 2; opcodeBlockSize = *((uint16*)ptr); ptr += 2; switch (opcode - 1) { case kLoadPalette: { int16 numOfColor = *((int16*)ptr); int16 startColor = *((int16*)(ptr + 2)); memcpy((palette + (startColor*3)), (ptr + 4), numOfColor*3); break; } case kFade: { // FLA movies don't use cross fade // fade out tricky if (_fadeOut != 1) { convertPalToRGBA(palette, paletteRGBACustom); fadeToBlack(paletteRGBACustom); _fadeOut = 1; } break; } case kPlaySample: { memcpy(&sample, ptr, sizeof(FLASampleStruct)); playFlaSample(sample.sampleNum, sample.freq, sample.repeat, sample.x, sample.y); break; } case kStopSample: { stopSample(sample.sampleNum); break; } case kDeltaFrame: { drawDeltaFrame(ptr, FLASCREEN_WIDTH); if (_fadeOut == 1) fadeOutFrames++; break; } case kKeyFrame: { drawKeyFrame(ptr, FLASCREEN_WIDTH, FLASCREEN_HEIGHT); break; } default: { return; } } aux++; ptr += opcodeBlockSize; } while (aux < (int32)frameData.videoSize); //free(workVideoBufferCopy); }