PsdStatus PsdFile::readLayers() { if (!mIsOpen) return PsdStatusNoInit; PsdStatus status; const uint8_t *ptr, *end = mLayersBlock.getEndAddress(); if (mLayersCount > 0 && mLayersInfoBlock.mLength) { ptr = mLayersBlock.mAddress + 6; status = readLayers(ptr, end); if (status != PsdStatusOK) return status; } else ptr = mLayersInfoBlock.getEndAddress(); if (((ptrdiff_t) ptr - (ptrdiff_t) mMapped.get().mAddress) & 1) // global layer mask info is 2 bytes aligned ptr++; if (ptr + 4 > end) return PsdStatusFileOutOfRange; mGlobalLayerMaskBlock.assign(ptr); LOG_DEBUG_BLOCK(mGlobalLayerMaskBlock); mAdditionalInfoBlock.mAddress = mGlobalLayerMaskBlock.getEndAddress(); mAdditionalInfoBlock.mLength = (ptrdiff_t) mLayersBlock.getEndAddress() - (ptrdiff_t) mAdditionalInfoBlock.mAddress; LOG_DEBUG_BLOCK(mAdditionalInfoBlock); return readAdditionalInfo(); }
bool LevelReader::readLevel(const std::string& fileName, LevelData& data) { XMLDocument xmlDoc; XMLError result = xmlDoc.LoadFile(fileName.c_str()); XMLCheckResult(result); XMLElement* map = xmlDoc.FirstChildElement("map"); if (map == nullptr) { g_logger->logError("LevelReader", "XML file could not be read, no map node found."); return false; } if (!readLevelProperties(map, data)) return false; if (!readFirstGridIDs(map, data)) return false; if (!readLayers(map, data)) return false; if (!readObjects(map, data)) return false; updateData(data); if (!checkData(data)) return false; return true; }
PsdStatus PsdFile::readAdditionalInfo() { assert(mAdditionalInfoBlock.mAddress != NULL); if (mAdditionalInfoBlock.mLength == 0) return PsdStatusOK; const uint8_t *ptr = mAdditionalInfoBlock.mAddress, *end = mAdditionalInfoBlock.getEndAddress() - 4; const uint8_t *key; uint32_t length; PsdStatus status; while (ptr < end) { if (!CHECK_FOUR_CHAR(ptr, '8', 'B', 'I', 'M') && !CHECK_FOUR_CHAR(ptr, '8', 'B', '6', '4')) { LOG_ALWAYS("Global addtional info signature is not found. (%u)", uint32_t(ptr - mMapped.get().mAddress)); return PsdStatusOK; } key = ptr + 4; length = PsdUtils::fetch32(ptr + 8); ptr += 12; if (CHECK_FOUR_CHAR(key, 'L', 'r', '1', '6')) { LOG_DEBUG("Layers are stored in global additional info."); readLayerCount(ptr); if (mLayersCount > 0) { const uint8_t *data = ptr + 2; status = readLayers(data, ptr + length); if (status != PsdStatusOK) return status; } } // XXX test shows it should be pad by 4, psdparse is not able to parse this though ptr += PAD4(length); } return PsdStatusOK; }
PsdLayers PsdFile::getLayers() { if (!mLayers) readLayers(); return mLayers; }