Paste P143

Masterwork From Distant Lands
ActivePublic

Authored by dkazakov on Dec 8 2017, 7:09 PM.
From 6fd1fb5c1b23671134c9cc253c27446c9658780f Mon Sep 17 00:00:00 2001
From: Dmitry Kazakov <dimula73@gmail.com>
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<quint32> 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
dkazakov edited the content of this paste. (Show Details)Dec 8 2017, 7:09 PM
dkazakov changed the title of this paste from untitled to Masterwork From Distant Lands.
dkazakov updated the paste's language from autodetect to autodetect.