コード例 #1
0
ファイル: riven_graphics.cpp プロジェクト: hchen1014/scummvm
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();
	}
}
コード例 #2
0
ファイル: flamovies.c プロジェクト: 2asoft/twin-e
/** 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();
}
コード例 #3
0
ファイル: flamovies.c プロジェクト: 2asoft/twin-e
/** 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);
}