Beispiel #1
0
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();
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
PsdLayers PsdFile::getLayers()
{
    if (!mLayers)
        readLayers();
    return mLayers;
}