/** * 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(); }
/** * 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); }
/** * 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); }
/** * 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(); }