From 6fd1fb5c1b23671134c9cc253c27446c9658780f Mon Sep 17 00:00:00 2001 From: Dmitry Kazakov Date: Fri, 8 Dec 2017 22:07:03 +0300 Subject: [PATCH] PSD: Implement loading and saving of layer styles for group layers Photoshop seem to use a special tag for layer styles when used in the group layers. --- plugins/impex/psd/psd_additional_layer_info_block.cpp | 9 ++++++--- plugins/impex/psd/psd_additional_layer_info_block.h | 2 +- plugins/impex/psd/psd_layer_record.cpp | 5 +++-- plugins/impex/psd/psd_layer_record.h | 2 +- plugins/impex/psd/psd_layer_section.cpp | 3 ++- plugins/impex/psd/psd_loader.cpp | 6 ++++++ 6 files changed, 19 insertions(+), 8 deletions(-) diff --git a/plugins/impex/psd/psd_additional_layer_info_block.cpp b/plugins/impex/psd/psd_additional_layer_info_block.cpp index c217f75..f83def9 100644 --- a/plugins/impex/psd/psd_additional_layer_info_block.cpp +++ b/plugins/impex/psd/psd_additional_layer_info_block.cpp @@ -177,7 +177,9 @@ void PsdAdditionalLayerInfoBlock::readImpl(QIODevice* io) else if (key == "lyid") { } - else if (key == "lfx2") { + else if (key == "lfx2" || key == "lfxs") { + // lfxs is a special variant of layer styles for group layers + KisAslReader reader; layerStyleXml = reader.readLfx2PsdSection(io); } @@ -376,10 +378,11 @@ void PsdAdditionalLayerInfoBlock::writeLsctBlockEx(QIODevice* io, psd_section_ty KisAslWriterUtils::writeFixedString(realBlendModeKey, io); } -void PsdAdditionalLayerInfoBlock::writeLfx2BlockEx(QIODevice* io, const QDomDocument &stylesXmlDoc) +void PsdAdditionalLayerInfoBlock::writeLfx2BlockEx(QIODevice* io, const QDomDocument &stylesXmlDoc, bool useLfxsLayerStyleFormat) { KisAslWriterUtils::writeFixedString("8BIM", io); - KisAslWriterUtils::writeFixedString("lfx2", io); + // 'lfxs' format is used for Group layers in PS + KisAslWriterUtils::writeFixedString(!useLfxsLayerStyleFormat ? "lfx2" : "lfxs", io); KisAslWriterUtils::OffsetStreamPusher lfx2SizeTag(io, 2); try { diff --git a/plugins/impex/psd/psd_additional_layer_info_block.h b/plugins/impex/psd/psd_additional_layer_info_block.h index 72a6374..4dc020a 100644 --- a/plugins/impex/psd/psd_additional_layer_info_block.h +++ b/plugins/impex/psd/psd_additional_layer_info_block.h @@ -268,7 +268,7 @@ public: void writeLuniBlockEx(QIODevice* io, const QString &layerName); void writeLsctBlockEx(QIODevice* io, psd_section_type sectionType, bool isPassThrough, const QString &blendModeKey); - void writeLfx2BlockEx(QIODevice* io, const QDomDocument &stylesXmlDoc); + void writeLfx2BlockEx(QIODevice* io, const QDomDocument &stylesXmlDoc, bool useLfxsLayerStyleFormat); void writePattBlockEx(QIODevice* io, const QDomDocument &patternsXmlDoc); diff --git a/plugins/impex/psd/psd_layer_record.cpp b/plugins/impex/psd/psd_layer_record.cpp index 594d87d..314355f 100644 --- a/plugins/impex/psd/psd_layer_record.cpp +++ b/plugins/impex/psd/psd_layer_record.cpp @@ -446,7 +446,8 @@ void PSDLayerRecord::write(QIODevice* io, KisNodeSP onlyTransparencyMask, const QRect &maskRect, psd_section_type sectionType, - const QDomDocument &stylesXmlDoc) + const QDomDocument &stylesXmlDoc, + bool useLfxsLayerStyleFormat) { dbgFile << "writing layer info record" << "at" << io->pos(); @@ -568,7 +569,7 @@ void PSDLayerRecord::write(QIODevice* io, // write 'lfx2' data block if (!stylesXmlDoc.isNull()) { - additionalInfoBlock.writeLfx2BlockEx(io, stylesXmlDoc); + additionalInfoBlock.writeLfx2BlockEx(io, stylesXmlDoc, useLfxsLayerStyleFormat); } } } catch (KisAslWriterUtils::ASLWriteException &e) { diff --git a/plugins/impex/psd/psd_layer_record.h b/plugins/impex/psd/psd_layer_record.h index 0024119..3ccb038 100644 --- a/plugins/impex/psd/psd_layer_record.h +++ b/plugins/impex/psd/psd_layer_record.h @@ -97,7 +97,7 @@ public: bool readPixelData(QIODevice* io, KisPaintDeviceSP device); bool readMask(QIODevice* io, KisPaintDeviceSP dev, ChannelInfo *channel); - void write(QIODevice* io, KisPaintDeviceSP layerContentDevice, KisNodeSP onlyTransparencyMask, const QRect &maskRect, psd_section_type sectionType, const QDomDocument &stylesXmlDoc); + void write(QIODevice* io, KisPaintDeviceSP layerContentDevice, KisNodeSP onlyTransparencyMask, const QRect &maskRect, psd_section_type sectionType, const QDomDocument &stylesXmlDoc, bool useLfxsLayerStyleFormat); void writePixelData(QIODevice* io); bool valid(); diff --git a/plugins/impex/psd/psd_layer_section.cpp b/plugins/impex/psd/psd_layer_section.cpp index a9efb0a..2c064a5 100644 --- a/plugins/impex/psd/psd_layer_section.cpp +++ b/plugins/impex/psd/psd_layer_section.cpp @@ -562,7 +562,8 @@ void PSDLayerMaskSection::writeImpl(QIODevice* io, KisNodeSP rootLayer) onlyTransparencyMask, maskRect, sectionType, - stylesXmlDoc); + stylesXmlDoc, + node->inherits("KisGroupLayer")); } dbgFile << "start writing layer pixel data" << io->pos(); diff --git a/plugins/impex/psd/psd_loader.cpp b/plugins/impex/psd/psd_loader.cpp index e4ef769..981a7f6 100644 --- a/plugins/impex/psd/psd_loader.cpp +++ b/plugins/impex/psd/psd_loader.cpp @@ -225,6 +225,12 @@ KisImageBuilder_Result PSDLoader::decode(QIODevice *io) groupLayer = groupStack.pop(); } + const QDomDocument &styleXml = layerRecord->infoBlocks.layerStyleXml; + + if (!styleXml.isNull()) { + allStylesXml << LayerStyleMapping(styleXml, groupLayer); + } + groupLayer->setName(layerRecord->layerName); groupLayer->setVisible(layerRecord->visible); -- 2.7.4