Exemple #1
0
/**
 * Read a PCX image into dib_a
 */
void FileManager_v1d::readBackground(const int screenIndex) {
	debugC(1, kDebugFile, "readBackground(%d)", screenIndex);

	Common::String buf;
	buf = Common::String(_vm->_text->getScreenNames(screenIndex)) + ".ART";
	if (!_sceneryArchive1.open(buf))
		error("File not found: %s", buf.c_str());
	// Read the image into dummy seq and static dib_a
	seq_t *dummySeq;                                // Image sequence structure for Read_pcx
	dummySeq = readPCX(_sceneryArchive1, 0, _vm->_screen->getFrontBuffer(), true, _vm->_text->getScreenNames(screenIndex));
	free(dummySeq);
	_sceneryArchive1.close();
}
Exemple #2
0
/**
* Read a PCX image into dib_a
*/
void FileManager_v1d::readBackground(int screenIndex) {
	debugC(1, kDebugFile, "readBackground(%d)", screenIndex);

	char *buf = (char *) malloc(2048 + 1);          // Buffer for file access
	strcat(strcpy(buf, _vm->_text->getScreenNames(screenIndex)), ".ART");
	if (!_sceneryArchive1.open(buf))
		error("File not found: %s", buf);
	// Read the image into dummy seq and static dib_a
	seq_t *dummySeq;                                // Image sequence structure for Read_pcx
	dummySeq = readPCX(_sceneryArchive1, 0, _vm->_screen->getFrontBuffer(), true, _vm->_text->getScreenNames(screenIndex));
	free(dummySeq);
	_sceneryArchive1.close();
	free(buf);
}
Exemple #3
0
/**
 * Read a PCX image into dib_a
 */
void FileManager_v2d::readBackground(const int screenIndex) {
	debugC(1, kDebugFile, "readBackground(%d)", screenIndex);

	_sceneryArchive1.seek((uint32) screenIndex * sizeof(sceneBlock_t), SEEK_SET);

	sceneBlock_t sceneBlock;                        // Read a database header entry
	sceneBlock.scene_off = _sceneryArchive1.readUint32LE();
	sceneBlock.scene_len = _sceneryArchive1.readUint32LE();
	sceneBlock.b_off = _sceneryArchive1.readUint32LE();
	sceneBlock.b_len = _sceneryArchive1.readUint32LE();
	sceneBlock.o_off = _sceneryArchive1.readUint32LE();
	sceneBlock.o_len = _sceneryArchive1.readUint32LE();
	sceneBlock.ob_off = _sceneryArchive1.readUint32LE();
	sceneBlock.ob_len = _sceneryArchive1.readUint32LE();

	_sceneryArchive1.seek(sceneBlock.scene_off, SEEK_SET);

	// Read the image into dummy seq and static dib_a
	seq_t *dummySeq;                                // Image sequence structure for Read_pcx
	dummySeq = readPCX(_sceneryArchive1, 0, _vm->_screen->getFrontBuffer(), true, _vm->_text->getScreenNames(screenIndex));
	free(dummySeq);
}
Exemple #4
0
/**
 * Read object file of PCC images into object supplied
 */
void FileManager::readImage(const int objNum, Object *objPtr) {
	debugC(1, kDebugFile, "readImage(%d, Object *objPtr)", objNum);

	/**
	 * Structure of object file lookup entry
	 */
	struct objBlock_t {
		uint32 objOffset;
		uint32 objLength;
	};

	if (!objPtr->_seqNumb)                           // This object has no images
		return;

	if (_vm->isPacked()) {
		_objectsArchive.seek((uint32)objNum * sizeof(objBlock_t), SEEK_SET);

		objBlock_t objBlock;                        // Info on file within database
		objBlock.objOffset = _objectsArchive.readUint32LE();
		objBlock.objLength = _objectsArchive.readUint32LE();

		_objectsArchive.seek(objBlock.objOffset, SEEK_SET);
	} else {
		Common::String buf;
		buf = _vm->_picDir + Common::String(_vm->_text->getNoun(objPtr->_nounIndex, 0)) + ".PIX";
		if (!_objectsArchive.open(buf)) {
			buf = Common::String(_vm->_text->getNoun(objPtr->_nounIndex, 0)) + ".PIX";
			if (!_objectsArchive.open(buf))
				error("File not found: %s", buf.c_str());
		}
	}

	bool  firstImgFl = true;                        // Initializes pcx read function
	Seq *seqPtr = 0;                              // Ptr to sequence structure

	// Now read the images into an images list
	for (int j = 0; j < objPtr->_seqNumb; j++) {     // for each sequence
		for (int k = 0; k < objPtr->_seqList[j]._imageNbr; k++) { // each image
			if (k == 0) {                           // First image
				// Read this image - allocate both seq and image memory
				seqPtr = readPCX(_objectsArchive, 0, 0, firstImgFl, _vm->_text->getNoun(objPtr->_nounIndex, 0));
				objPtr->_seqList[j]._seqPtr = seqPtr;
				firstImgFl = false;
			} else {                                // Subsequent image
				// Read this image - allocate both seq and image memory
				seqPtr->_nextSeqPtr = readPCX(_objectsArchive, 0, 0, firstImgFl, _vm->_text->getNoun(objPtr->_nounIndex, 0));
				seqPtr = seqPtr->_nextSeqPtr;
			}

			// Compute the bounding box - x1, x2, y1, y2
			// Note use of x2 - marks end of valid data in row
			uint16 x2 = seqPtr->_x2;
			seqPtr->_x1 = seqPtr->_x2;
			seqPtr->_x2 = 0;
			seqPtr->_y1 = seqPtr->_lines;
			seqPtr->_y2 = 0;

			ImagePtr dibPtr = seqPtr->_imagePtr;
			for (int y = 0; y < seqPtr->_lines; y++, dibPtr += seqPtr->_bytesPerLine8 - x2) {
				for (int x = 0; x < x2; x++) {
					if (*dibPtr++) {                // Some data found
						if (x < seqPtr->_x1)
							seqPtr->_x1 = x;
						if (x > seqPtr->_x2)
							seqPtr->_x2 = x;
						if (y < seqPtr->_y1)
							seqPtr->_y1 = y;
						if (y > seqPtr->_y2)
							seqPtr->_y2 = y;
					}
				}
			}
		}
		assert(seqPtr);
		seqPtr->_nextSeqPtr = objPtr->_seqList[j]._seqPtr; // loop linked list to head
	}

	// Set the current image sequence to first or last
	switch (objPtr->_cycling) {
	case kCycleInvisible:                           // (May become visible later)
	case kCycleAlmostInvisible:
	case kCycleNotCycling:
	case kCycleForward:
		objPtr->_currImagePtr = objPtr->_seqList[0]._seqPtr;
		break;
	case kCycleBackward:
		objPtr->_currImagePtr = seqPtr;
		break;
	default:
		warning("Unexpected cycling: %d", objPtr->_cycling);
	}

	if (!_vm->isPacked())
		_objectsArchive.close();
}