Krita Source Code Documentation
Loading...
Searching...
No Matches
KisAslLayerStyleSerializer Class Reference

#include <kis_asl_layer_style_serializer.h>

Public Member Functions

void assignAllLayerStylesToLayers (KisNodeSP root, const QString &storageLocation)
 
QDomDocument formPsdXmlDocument () const
 
QDomDocument formXmlDocument () const
 
QVector< KoAbstractGradientSPgradients () const
 
bool isInitialized ()
 
bool isValid ()
 
 KisAslLayerStyleSerializer ()
 
QHash< QString, KoPatternSPpatterns () const
 
void readFromDevice (QIODevice &device)
 
bool readFromFile (const QString &filename)
 
void readFromPSDXML (const QDomDocument &doc)
 
void registerPSDPattern (const QDomDocument &doc)
 
void saveToDevice (QIODevice &device)
 
bool saveToFile (const QString &filename)
 
void setStyles (const QVector< KisPSDLayerStyleSP > &styles)
 
QVector< KisPSDLayerStyleSPstyles () const
 
QHash< QString, KisPSDLayerStyleSPstylesHash ()
 
 ~KisAslLayerStyleSerializer ()
 

Static Public Member Functions

static QVector< KisPSDLayerStyleSPcollectAllLayerStyles (KisNodeSP root)
 
static QVector< KoResourceSignaturefetchLinkedResourceSignatures (const KisPSDLayerStyle *style)
 
static void sideLoadLinkedResources (KisPSDLayerStyle *style, KisResourcesInterfaceSP resourcesInterface)
 

Private Member Functions

void assignGradientObject (KoAbstractGradientSP gradient, std::function< void(KoAbstractGradientSP)> setGradient)
 
void assignPatternObject (const QString &patternUuid, const QString &patternName, std::function< void(KoPatternSP)> setPattern)
 
void connectCatcherToStyle (KisPSDLayerStyle *style, const QString &prefix)
 
void newStyleStarted (bool isPsdStructure)
 
void registerPatternObject (const KoPatternSP pattern, const QString &patternUuid)
 

Static Private Member Functions

static QVector< KoResourceSignaturefetchAllPatternLinks (const KisPSDLayerStyle *style)
 
static QVector< KoPatternSPfetchAllPatterns (const KisPSDLayerStyle *style, KisResourcesInterfaceSP resourcesInterface)
 

Private Attributes

KisAslCallbackObjectCatcher m_catcher
 
QVector< KoAbstractGradientSPm_gradientsStore
 
bool m_initialized {false}
 
bool m_isValid {true}
 
QSharedPointer< KisLocalStrokeResourcesm_localResourcesInterface
 
QHash< QString, KoPatternSPm_patternsStore
 
QHash< QString, KisPSDLayerStyleSPm_stylesHash
 
QVector< KisPSDLayerStyleSPm_stylesVector
 

Detailed Description

Definition at line 20 of file kis_asl_layer_style_serializer.h.

Constructor & Destructor Documentation

◆ KisAslLayerStyleSerializer()

KisAslLayerStyleSerializer::KisAslLayerStyleSerializer ( )

Definition at line 45 of file kis_asl_layer_style_serializer.cpp.

47{
48}
QSharedPointer< KisLocalStrokeResources > m_localResourcesInterface
a KisResourcesInterface-like resources storage for preloaded resources

◆ ~KisAslLayerStyleSerializer()

KisAslLayerStyleSerializer::~KisAslLayerStyleSerializer ( )

Definition at line 50 of file kis_asl_layer_style_serializer.cpp.

51{
52}

Member Function Documentation

◆ assignAllLayerStylesToLayers()

void KisAslLayerStyleSerializer::assignAllLayerStylesToLayers ( KisNodeSP root,
const QString & storageLocation )

Definition at line 1325 of file kis_asl_layer_style_serializer.cpp.

1326{
1327 if (!storageLocation.isEmpty()) {
1329 Q_FOREACH (KisPSDLayerStyleSP style, m_stylesVector) {
1330 KisPSDLayerStyleSP newStyle = style->clone().dynamicCast<KisPSDLayerStyle>();
1332 style->setResourcesInterface(KisGlobalResourcesInterface::instance());
1333
1334 stylesModel.addResourceDeduplicateFileName(newStyle, storageLocation);
1335 }
1336 }
1337
1338 // we iterate over non-uploaded styles which store all the dependent resources
1339 // internally
1341 KisLayer* layer = qobject_cast<KisLayer*>(node.data());
1342
1343 if (layer && layer->layerStyle()) {
1344 QUuid uuid = layer->layerStyle()->uuid();
1345
1346 bool found = false;
1347
1348 Q_FOREACH (KisPSDLayerStyleSP style, styles) {
1349 if (style->uuid() == uuid) {
1350 layer->setLayerStyle(style->cloneWithResourcesSnapshot(style->resourcesInterface(), 0));
1351 found = true;
1352 break;
1353 }
1354 }
1355
1356 if (!found) {
1357 warnKrita << "WARNING: loading layer style for" << layer->name() << "failed! It requests inexistent style:" << uuid;
1358 }
1359 }
1360 });
1361}
QVector< KisPSDLayerStyleSP > styles() const
static void sideLoadLinkedResources(KisPSDLayerStyle *style, KisResourcesInterfaceSP resourcesInterface)
QVector< KisPSDLayerStyleSP > m_stylesVector
static KisResourcesInterfaceSP instance()
The KisResourceModel class provides the main access to resources. It is possible to filter the resour...
#define warnKrita
Definition kis_debug.h:87
void recursiveApplyNodes(NodePointer node, Functor func)
const QString LayerStyles
QString name() const
KisPSDLayerStyleSP layerStyle
Definition kis_layer.cc:171
void setLayerStyle(KisPSDLayerStyleSP layerStyle)
Definition kis_layer.cc:254
The KisPSDLayerStyle class implements loading, saving and applying the PSD layer effects.

References KisResourceModel::addResourceDeduplicateFileName(), KisSharedPtr< T >::data(), KisGlobalResourcesInterface::instance(), KisLayer::layerStyle, ResourceType::LayerStyles, m_localResourcesInterface, m_stylesVector, KisBaseNode::name(), KisLayerUtils::recursiveApplyNodes(), KisLayer::setLayerStyle(), sideLoadLinkedResources(), styles(), and warnKrita.

◆ assignGradientObject()

void KisAslLayerStyleSerializer::assignGradientObject ( KoAbstractGradientSP gradient,
std::function< void(KoAbstractGradientSP)> setGradient )
private

Definition at line 969 of file kis_asl_layer_style_serializer.cpp.

970{
971 m_gradientsStore.append(gradient);
972 m_localResourcesInterface->addResource(gradient);
973 setGradient(gradient);
974}
QVector< KoAbstractGradientSP > m_gradientsStore

References m_gradientsStore, and m_localResourcesInterface.

◆ assignPatternObject()

void KisAslLayerStyleSerializer::assignPatternObject ( const QString & patternUuid,
const QString & patternName,
std::function< void(KoPatternSP)> setPattern )
private

Definition at line 947 of file kis_asl_layer_style_serializer.cpp.

948{
949 Q_UNUSED(patternName);
950
951 KoPatternSP pattern;
952
953 if (!m_patternsStore.contains(patternUuid)) {
954 warnKrita << "WARNING: ASL style contains non-existent pattern reference! Searching for uuid: "
955 << patternUuid << " (name: " << patternName << ")";
956
957 QImage dumbImage(32, 32, QImage::Format_ARGB32);
958 dumbImage.fill(Qt::red);
959 KoPatternSP dumbPattern(new KoPattern(dumbImage, "invalid", ""));
960 registerPatternObject(dumbPattern, patternUuid + QString("_invalid"));
961 pattern = dumbPattern;
962 } else {
963 pattern = m_patternsStore[patternUuid];
964 }
965
966 setPattern(pattern);
967}
void registerPatternObject(const KoPatternSP pattern, const QString &patternUuid)
QHash< QString, KoPatternSP > m_patternsStore
Write API docs here.
Definition KoPattern.h:21

References m_patternsStore, registerPatternObject(), and warnKrita.

◆ collectAllLayerStyles()

QVector< KisPSDLayerStyleSP > KisAslLayerStyleSerializer::collectAllLayerStyles ( KisNodeSP root)
static

Definition at line 1281 of file kis_asl_layer_style_serializer.cpp.

1282{
1283 KisLayer* layer = qobject_cast<KisLayer*>(root.data());
1284 QVector<KisPSDLayerStyleSP> layerStyles;
1285
1286 if (layer && layer->layerStyle()) {
1287 KisPSDLayerStyleSP clone = layer->layerStyle()->clone().dynamicCast<KisPSDLayerStyle>();
1288 clone->setName(i18nc("Auto-generated layer style name for embedded styles (style itself)", "<%1> (embedded)", layer->name()));
1289 layerStyles << clone;
1290 }
1291
1292 KisNodeSP child = root->firstChild();
1293 while (child) {
1294 layerStyles += collectAllLayerStyles(child);
1295 child = child->nextSibling();
1296 }
1297
1298 return layerStyles;
1299}
static QVector< KisPSDLayerStyleSP > collectAllLayerStyles(KisNodeSP root)
KisNodeSP firstChild() const
Definition kis_node.cpp:361
KisNodeSP nextSibling() const
Definition kis_node.cpp:408

References collectAllLayerStyles(), KisSharedPtr< T >::data(), KisNode::firstChild(), KisLayer::layerStyle, KisBaseNode::name(), and KisNode::nextSibling().

◆ connectCatcherToStyle()

void KisAslLayerStyleSerializer::connectCatcherToStyle ( KisPSDLayerStyle * style,
const QString & prefix )
private

Definition at line 1008 of file kis_asl_layer_style_serializer.cpp.

1009{
1010 CONN_TEXT_RADDR("/null/Nm ", setName, style, KisPSDLayerStyle);
1011 CONN_TEXT_RADDR("/null/Idnt", setPsdUuid, style, KisPSDLayerStyle);
1012
1013 CONN_BOOL("/masterFXSwitch", setEnabled, style, KisPSDLayerStyle, prefix);
1014
1015 psd_layer_effects_drop_shadow *dropShadow = style->dropShadow();
1016
1017 CONN_COMPOSITE_OP("/DrSh/Md ", setBlendMode, dropShadow, psd_layer_effects_drop_shadow, prefix);
1018 CONN_COLOR("/DrSh/Clr ", setColor, dropShadow, psd_layer_effects_drop_shadow, prefix);
1019 CONN_UNITF("/DrSh/Opct", "#Prc", setOpacity, dropShadow, psd_layer_effects_drop_shadow, prefix);
1020 CONN_UNITF("/DrSh/lagl", "#Ang", setAngle, dropShadow, psd_layer_effects_drop_shadow, prefix);
1021 CONN_UNITF("/DrSh/Dstn", "#Pxl", setDistance, dropShadow, psd_layer_effects_drop_shadow, prefix);
1022 CONN_UNITF("/DrSh/Ckmt", "#Pxl", setSpread, dropShadow, psd_layer_effects_drop_shadow, prefix);
1023 CONN_UNITF("/DrSh/blur", "#Pxl", setSize, dropShadow, psd_layer_effects_drop_shadow, prefix);
1024 CONN_UNITF("/DrSh/Nose", "#Prc", setNoise, dropShadow, psd_layer_effects_drop_shadow, prefix);
1025 CONN_BOOL("/DrSh/enab", setEffectEnabled, dropShadow, psd_layer_effects_drop_shadow, prefix);
1026 CONN_BOOL("/DrSh/uglg", setUseGlobalLight, dropShadow, psd_layer_effects_drop_shadow, prefix);
1027 CONN_BOOL("/DrSh/AntA", setAntiAliased, dropShadow, psd_layer_effects_drop_shadow, prefix);
1028 CONN_BOOL("/DrSh/layerConceals", setKnocksOut, dropShadow, psd_layer_effects_drop_shadow, prefix);
1029 CONN_CURVE("/DrSh/TrnS", setContourLookupTable, dropShadow, psd_layer_effects_drop_shadow, prefix);
1030
1031 psd_layer_effects_inner_shadow *innerShadow = style->innerShadow();
1032
1033 CONN_COMPOSITE_OP("/IrSh/Md ", setBlendMode, innerShadow, psd_layer_effects_inner_shadow, prefix);
1034 CONN_COLOR("/IrSh/Clr ", setColor, innerShadow, psd_layer_effects_inner_shadow, prefix);
1035 CONN_UNITF("/IrSh/Opct", "#Prc", setOpacity, innerShadow, psd_layer_effects_inner_shadow, prefix);
1036 CONN_UNITF("/IrSh/lagl", "#Ang", setAngle, innerShadow, psd_layer_effects_inner_shadow, prefix);
1037 CONN_UNITF("/IrSh/Dstn", "#Pxl", setDistance, innerShadow, psd_layer_effects_inner_shadow, prefix);
1038 CONN_UNITF("/IrSh/Ckmt", "#Pxl", setSpread, innerShadow, psd_layer_effects_inner_shadow, prefix);
1039 CONN_UNITF("/IrSh/blur", "#Pxl", setSize, innerShadow, psd_layer_effects_inner_shadow, prefix);
1040 CONN_UNITF("/IrSh/Nose", "#Prc", setNoise, innerShadow, psd_layer_effects_inner_shadow, prefix);
1041 CONN_BOOL("/IrSh/enab", setEffectEnabled, innerShadow, psd_layer_effects_inner_shadow, prefix);
1042 CONN_BOOL("/IrSh/uglg", setUseGlobalLight, innerShadow, psd_layer_effects_inner_shadow, prefix);
1043 CONN_BOOL("/IrSh/AntA", setAntiAliased, innerShadow, psd_layer_effects_inner_shadow, prefix);
1044 CONN_CURVE("/IrSh/TrnS", setContourLookupTable, innerShadow, psd_layer_effects_inner_shadow, prefix);
1045
1046 psd_layer_effects_outer_glow *outerGlow = style->outerGlow();
1047
1048 CONN_COMPOSITE_OP("/OrGl/Md ", setBlendMode, outerGlow, psd_layer_effects_outer_glow, prefix);
1049 CONN_COLOR("/OrGl/Clr ", setColor, outerGlow, psd_layer_effects_outer_glow, prefix);
1050 CONN_UNITF("/OrGl/Opct", "#Prc", setOpacity, outerGlow, psd_layer_effects_outer_glow, prefix);
1051 CONN_UNITF("/OrGl/Ckmt", "#Pxl", setSpread, outerGlow, psd_layer_effects_outer_glow, prefix);
1052 CONN_UNITF("/OrGl/blur", "#Pxl", setSize, outerGlow, psd_layer_effects_outer_glow, prefix);
1053 CONN_UNITF("/OrGl/Nose", "#Prc", setNoise, outerGlow, psd_layer_effects_outer_glow, prefix);
1054 CONN_BOOL("/OrGl/enab", setEffectEnabled, outerGlow, psd_layer_effects_outer_glow, prefix);
1055 CONN_BOOL("/OrGl/AntA", setAntiAliased, outerGlow, psd_layer_effects_outer_glow, prefix);
1056 CONN_CURVE("/OrGl/TrnS", setContourLookupTable, outerGlow, psd_layer_effects_outer_glow, prefix);
1057
1058 QMap<QString, psd_technique_type> fillTechniqueMap;
1059 fillTechniqueMap.insert("PrBL", psd_technique_precise);
1060 fillTechniqueMap.insert("SfBL", psd_technique_softer);
1061 CONN_ENUM("/OrGl/GlwT", "BETE", setTechnique, fillTechniqueMap, psd_technique_type, outerGlow, psd_layer_effects_outer_glow, prefix);
1062
1063 CONN_GRADIENT("/OrGl/Grad", setGradient, outerGlow, psd_layer_effects_outer_glow, prefix);
1064
1065 CONN_UNITF("/OrGl/Inpr", "#Prc", setRange, outerGlow, psd_layer_effects_outer_glow, prefix);
1066 CONN_UNITF("/OrGl/ShdN", "#Prc", setJitter, outerGlow, psd_layer_effects_outer_glow, prefix);
1067
1068
1069 psd_layer_effects_inner_glow *innerGlow = style->innerGlow();
1070
1071 CONN_COMPOSITE_OP("/IrGl/Md ", setBlendMode, innerGlow, psd_layer_effects_inner_glow, prefix);
1072 CONN_COLOR("/IrGl/Clr ", setColor, innerGlow, psd_layer_effects_inner_glow, prefix);
1073 CONN_UNITF("/IrGl/Opct", "#Prc", setOpacity, innerGlow, psd_layer_effects_inner_glow, prefix);
1074 CONN_UNITF("/IrGl/Ckmt", "#Pxl", setSpread, innerGlow, psd_layer_effects_inner_glow, prefix);
1075 CONN_UNITF("/IrGl/blur", "#Pxl", setSize, innerGlow, psd_layer_effects_inner_glow, prefix);
1076 CONN_UNITF("/IrGl/Nose", "#Prc", setNoise, innerGlow, psd_layer_effects_inner_glow, prefix);
1077 CONN_BOOL("/IrGl/enab", setEffectEnabled, innerGlow, psd_layer_effects_inner_glow, prefix);
1078 CONN_BOOL("/IrGl/AntA", setAntiAliased, innerGlow, psd_layer_effects_inner_glow, prefix);
1079 CONN_CURVE("/IrGl/TrnS", setContourLookupTable, innerGlow, psd_layer_effects_inner_glow, prefix);
1080
1081 CONN_ENUM("/IrGl/GlwT", "BETE", setTechnique, fillTechniqueMap, psd_technique_type, innerGlow, psd_layer_effects_inner_glow, prefix);
1082
1083 CONN_GRADIENT("/IrGl/Grad", setGradient, innerGlow, psd_layer_effects_inner_glow, prefix);
1084
1085 CONN_UNITF("/IrGl/Inpr", "#Prc", setRange, innerGlow, psd_layer_effects_inner_glow, prefix);
1086 CONN_UNITF("/IrGl/ShdN", "#Prc", setJitter, innerGlow, psd_layer_effects_inner_glow, prefix);
1087
1088 QMap<QString, psd_glow_source> glowSourceMap;
1089 glowSourceMap.insert("SrcC", psd_glow_center);
1090 glowSourceMap.insert("SrcE", psd_glow_edge);
1091 CONN_ENUM("/IrGl/glwS", "IGSr", setSource, glowSourceMap, psd_glow_source, innerGlow, psd_layer_effects_inner_glow, prefix);
1092
1093
1094 psd_layer_effects_satin *satin = style->satin();
1095
1096 CONN_COMPOSITE_OP("/ChFX/Md ", setBlendMode, satin, psd_layer_effects_satin, prefix);
1097 CONN_COLOR("/ChFX/Clr ", setColor, satin, psd_layer_effects_satin, prefix);
1098
1099 CONN_UNITF("/ChFX/Opct", "#Prc", setOpacity, satin, psd_layer_effects_satin, prefix);
1100 CONN_UNITF("/ChFX/lagl", "#Ang", setAngle, satin, psd_layer_effects_satin, prefix);
1101 CONN_UNITF("/ChFX/Dstn", "#Pxl", setDistance, satin, psd_layer_effects_satin, prefix);
1102 CONN_UNITF("/ChFX/blur", "#Pxl", setSize, satin, psd_layer_effects_satin, prefix);
1103
1104 CONN_BOOL("/ChFX/enab", setEffectEnabled, satin, psd_layer_effects_satin, prefix);
1105 CONN_BOOL("/ChFX/AntA", setAntiAliased, satin, psd_layer_effects_satin, prefix);
1106 CONN_BOOL("/ChFX/Invr", setInvert, satin, psd_layer_effects_satin, prefix);
1107 CONN_CURVE("/ChFX/MpgS", setContourLookupTable, satin, psd_layer_effects_satin, prefix);
1108
1109 psd_layer_effects_color_overlay *colorOverlay = style->colorOverlay();
1110
1111 CONN_COMPOSITE_OP("/SoFi/Md ", setBlendMode, colorOverlay, psd_layer_effects_color_overlay, prefix);
1112 CONN_COLOR("/SoFi/Clr ", setColor, colorOverlay, psd_layer_effects_color_overlay, prefix);
1113 CONN_UNITF("/SoFi/Opct", "#Prc", setOpacity, colorOverlay, psd_layer_effects_color_overlay, prefix);
1114 CONN_BOOL("/SoFi/enab", setEffectEnabled, colorOverlay, psd_layer_effects_color_overlay, prefix);
1115
1116 psd_layer_effects_gradient_overlay *gradientOverlay = style->gradientOverlay();
1117
1118 CONN_COMPOSITE_OP("/GrFl/Md ", setBlendMode, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1119 CONN_UNITF("/GrFl/Opct", "#Prc", setOpacity, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1120 CONN_UNITF("/GrFl/Scl ", "#Prc", setScale, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1121 CONN_UNITF("/GrFl/Angl", "#Ang", setAngle, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1122 CONN_BOOL("/GrFl/enab", setEffectEnabled, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1123 CONN_BOOL("/GrFl/Dthr", setDither, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1124 CONN_BOOL("/GrFl/Rvrs", setReverse, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1125 CONN_BOOL("/GrFl/Algn", setAlignWithLayer, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1126 CONN_POINT("/GrFl/Ofst", setGradientOffset, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1127 CONN_GRADIENT("/GrFl/Grad", setGradient, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1128
1129
1130 QMap<QString, psd_gradient_style> gradientStyleMap;
1131 gradientStyleMap.insert("Lnr ", psd_gradient_style_linear);
1132 gradientStyleMap.insert("Rdl ", psd_gradient_style_radial);
1133 gradientStyleMap.insert("Angl", psd_gradient_style_angle);
1134 gradientStyleMap.insert("Rflc", psd_gradient_style_reflected);
1135 gradientStyleMap.insert("Dmnd", psd_gradient_style_diamond);
1136 CONN_ENUM("/GrFl/Type", "GrdT", setStyle, gradientStyleMap, psd_gradient_style, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1137
1138 psd_layer_effects_pattern_overlay *patternOverlay = style->patternOverlay();
1139
1140 CONN_BOOL("/patternFill/enab", setEffectEnabled, patternOverlay, psd_layer_effects_pattern_overlay, prefix);
1141 CONN_COMPOSITE_OP("/patternFill/Md ", setBlendMode, patternOverlay, psd_layer_effects_pattern_overlay, prefix);
1142 CONN_UNITF("/patternFill/Opct", "#Prc", setOpacity, patternOverlay, psd_layer_effects_pattern_overlay, prefix);
1143 CONN_PATTERN("/patternFill/Ptrn", setPattern, patternOverlay, psd_layer_effects_pattern_overlay, prefix);
1144 CONN_UNITF("/patternFill/Scl ", "#Prc", setScale, patternOverlay, psd_layer_effects_pattern_overlay, prefix);
1145 CONN_BOOL("/patternFill/Algn", setAlignWithLayer, patternOverlay, psd_layer_effects_pattern_overlay, prefix);
1146 CONN_POINT("/patternFill/phase", setPatternPhase, patternOverlay, psd_layer_effects_pattern_overlay, prefix);
1147
1148 psd_layer_effects_stroke *stroke = style->stroke();
1149
1150 CONN_COMPOSITE_OP("/FrFX/Md ", setBlendMode, stroke, psd_layer_effects_stroke, prefix);
1151 CONN_BOOL("/FrFX/enab", setEffectEnabled, stroke, psd_layer_effects_stroke, prefix);
1152 CONN_UNITF("/FrFX/Opct", "#Prc", setOpacity, stroke, psd_layer_effects_stroke, prefix);
1153 CONN_UNITF("/FrFX/Sz ", "#Pxl", setSize, stroke, psd_layer_effects_stroke, prefix);
1154
1155 QMap<QString, psd_stroke_position> strokeStyleMap;
1156 strokeStyleMap.insert("OutF", psd_stroke_outside);
1157 strokeStyleMap.insert("InsF", psd_stroke_inside);
1158 strokeStyleMap.insert("CtrF", psd_stroke_center);
1159 CONN_ENUM("/FrFX/Styl", "FStl", setPosition, strokeStyleMap, psd_stroke_position, stroke, psd_layer_effects_stroke, prefix);
1160
1161 QMap<QString, psd_fill_type> strokeFillType;
1162 strokeFillType.insert("SClr", psd_fill_solid_color);
1163 strokeFillType.insert("GrFl", psd_fill_gradient);
1164 strokeFillType.insert("Ptrn", psd_fill_pattern);
1165 CONN_ENUM("/FrFX/PntT", "FrFl", setFillType, strokeFillType, psd_fill_type, stroke, psd_layer_effects_stroke, prefix);
1166
1167 // Color type
1168 CONN_COLOR("/FrFX/Clr ", setColor, stroke, psd_layer_effects_stroke, prefix);
1169
1170 // Gradient Type
1171 CONN_GRADIENT("/FrFX/Grad", setGradient, stroke, psd_layer_effects_stroke, prefix);
1172 CONN_UNITF("/FrFX/Angl", "#Ang", setAngle, stroke, psd_layer_effects_stroke, prefix);
1173 CONN_UNITF("/FrFX/Scl ", "#Prc", setScale, stroke, psd_layer_effects_stroke, prefix);
1174 CONN_ENUM("/FrFX/Type", "GrdT", setStyle, gradientStyleMap, psd_gradient_style, stroke, psd_layer_effects_stroke, prefix);
1175 CONN_BOOL("/FrFX/Rvrs", setReverse, stroke, psd_layer_effects_stroke, prefix);
1176 CONN_BOOL("/FrFX/Algn", setAlignWithLayer, stroke, psd_layer_effects_stroke, prefix);
1177 CONN_POINT("/FrFX/Ofst", setGradientOffset, stroke, psd_layer_effects_stroke, prefix);
1178 CONN_BOOL("/FrFX/Dthr", setDither, stroke, psd_layer_effects_stroke, prefix);
1179
1180 // Pattern type
1181
1182 CONN_PATTERN("/FrFX/Ptrn", setPattern, stroke, psd_layer_effects_stroke, prefix);
1183 CONN_BOOL("/FrFX/Lnkd", setAlignWithLayer, stroke, psd_layer_effects_stroke, prefix); // yes, we share the params...
1184 CONN_POINT("/FrFX/phase", setPatternPhase, stroke, psd_layer_effects_stroke, prefix);
1185
1186
1187 psd_layer_effects_bevel_emboss *bevelAndEmboss = style->bevelAndEmboss();
1188
1189 CONN_BOOL("/ebbl/enab", setEffectEnabled, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1190
1191 CONN_COMPOSITE_OP("/ebbl/hglM", setHighlightBlendMode, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1192 CONN_COLOR("/ebbl/hglC", setHighlightColor, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1193 CONN_UNITF("/ebbl/hglO", "#Prc", setHighlightOpacity, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1194
1195 CONN_COMPOSITE_OP("/ebbl/sdwM", setShadowBlendMode, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1196 CONN_COLOR("/ebbl/sdwC", setShadowColor, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1197 CONN_UNITF("/ebbl/sdwO", "#Prc", setShadowOpacity, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1198
1199 QMap<QString, psd_technique_type> bevelTechniqueMap;
1200 bevelTechniqueMap.insert("PrBL", psd_technique_precise);
1201 bevelTechniqueMap.insert("SfBL", psd_technique_softer);
1202 bevelTechniqueMap.insert("Slmt", psd_technique_slope_limit);
1203 CONN_ENUM("/ebbl/bvlT", "bvlT", setTechnique, bevelTechniqueMap, psd_technique_type, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1204
1205 QMap<QString, psd_bevel_style> bevelStyleMap;
1206 bevelStyleMap.insert("OtrB", psd_bevel_outer_bevel);
1207 bevelStyleMap.insert("InrB", psd_bevel_inner_bevel);
1208 bevelStyleMap.insert("Embs", psd_bevel_emboss);
1209 bevelStyleMap.insert("PlEb", psd_bevel_pillow_emboss);
1210 bevelStyleMap.insert("strokeEmboss", psd_bevel_stroke_emboss);
1211 CONN_ENUM("/ebbl/bvlS", "BESl", setStyle, bevelStyleMap, psd_bevel_style, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1212
1213 CONN_BOOL("/ebbl/uglg", setUseGlobalLight, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1214
1215 CONN_UNITF("/ebbl/lagl", "#Ang", setAngle, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1216 CONN_UNITF("/ebbl/Lald", "#Ang", setAltitude, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1217
1218 CONN_UNITF("/ebbl/srgR", "#Prc", setDepth, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1219
1220 CONN_UNITF("/ebbl/blur", "#Pxl", setSize, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1221
1222
1223 QMap<QString, psd_direction> bevelDirectionMap;
1224 bevelDirectionMap.insert("In ", psd_direction_up);
1225 bevelDirectionMap.insert("Out ", psd_direction_down);
1226 CONN_ENUM("/ebbl/bvlD", "BESs", setDirection, bevelDirectionMap, psd_direction, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1227
1228 CONN_CURVE("/ebbl/TrnS", setContourLookupTable, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1229
1230 CONN_BOOL("/ebbl/antialiasGloss", setGlossAntiAliased, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1231
1232 CONN_UNITF("/ebbl/Sftn", "#Pxl", setSoften, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1233
1234 // Use shape mode
1235
1236 CONN_BOOL("/ebbl/useShape", setContourEnabled, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1237 CONN_CURVE("/ebbl/MpgS", setGlossContourLookupTable, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1238 CONN_BOOL("/ebbl/AntA", setAntiAliased, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1239 CONN_UNITF("/ebbl/Inpr", "#Prc", setContourRange, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1240
1241 // Use texture mode
1242
1243 CONN_BOOL("/ebbl/useTexture", setTextureEnabled, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1244 CONN_BOOL("/ebbl/InvT", setTextureInvert, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1245 CONN_BOOL("/ebbl/Algn", setTextureAlignWithLayer, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1246 CONN_UNITF("/ebbl/Scl ", "#Prc", setTextureScale, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1247 CONN_UNITF("/ebbl/textureDepth ", "#Prc", setTextureDepth, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1248 CONN_PATTERN("/ebbl/Ptrn", setTexturePattern, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1249 CONN_POINT("/ebbl/phase", setTexturePhase, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1250}
#define CONN_TEXT_RADDR(addr, method, object, type)
#define CONN_ENUM(addr, tag, method, map, mapped_type, object, type, prefix)
#define CONN_CURVE(addr, method, object, type, prefix)
#define CONN_COMPOSITE_OP(addr, method, object, type, prefix)
#define CONN_BOOL(addr, method, object, type, prefix)
#define CONN_UNITF(addr, unit, method, object, type, prefix)
#define CONN_GRADIENT(addr, method, object, type, prefix)
#define CONN_PATTERN(addr, method, object, type, prefix)
#define CONN_COLOR(addr, method, object, type, prefix)
#define CONN_POINT(addr, method, object, type, prefix)
psd_glow_source
Definition psd.h:129
@ psd_glow_edge
Definition psd.h:131
@ psd_glow_center
Definition psd.h:130
psd_direction
Definition psd.h:142
@ psd_direction_up
Definition psd.h:142
@ psd_direction_down
Definition psd.h:142
psd_gradient_style
Definition psd.h:101
@ psd_gradient_style_linear
Definition psd.h:102
@ psd_gradient_style_reflected
Definition psd.h:105
@ psd_gradient_style_angle
Definition psd.h:104
@ psd_gradient_style_radial
Definition psd.h:103
@ psd_gradient_style_diamond
Definition psd.h:106
psd_fill_type
Definition psd.h:123
@ psd_fill_solid_color
Definition psd.h:124
@ psd_fill_gradient
Definition psd.h:125
@ psd_fill_pattern
Definition psd.h:126
psd_technique_type
Definition psd.h:115
@ psd_technique_softer
Definition psd.h:116
@ psd_technique_precise
Definition psd.h:117
@ psd_technique_slope_limit
Definition psd.h:118
psd_bevel_style
Definition psd.h:134
@ psd_bevel_pillow_emboss
Definition psd.h:138
@ psd_bevel_inner_bevel
Definition psd.h:136
@ psd_bevel_stroke_emboss
Definition psd.h:139
@ psd_bevel_outer_bevel
Definition psd.h:135
@ psd_bevel_emboss
Definition psd.h:137
psd_stroke_position
Definition psd.h:121
@ psd_stroke_outside
Definition psd.h:121
@ psd_stroke_inside
Definition psd.h:121
@ psd_stroke_center
Definition psd.h:121
const psd_layer_effects_bevel_emboss * bevelAndEmboss() const
const psd_layer_effects_drop_shadow * dropShadow() const
const psd_layer_effects_color_overlay * colorOverlay() const
const psd_layer_effects_gradient_overlay * gradientOverlay() const
const psd_layer_effects_inner_glow * innerGlow() const
psd_layer_effects_stroke stroke
const psd_layer_effects_pattern_overlay * patternOverlay() const
const psd_layer_effects_inner_shadow * innerShadow() const
const psd_layer_effects_outer_glow * outerGlow() const
psd_layer_effects_satin satin

References KisPSDLayerStyle::bevelAndEmboss(), KisPSDLayerStyle::colorOverlay(), CONN_BOOL, CONN_COLOR, CONN_COMPOSITE_OP, CONN_CURVE, CONN_ENUM, CONN_GRADIENT, CONN_PATTERN, CONN_POINT, CONN_TEXT_RADDR, CONN_UNITF, KisPSDLayerStyle::dropShadow(), KisPSDLayerStyle::gradientOverlay(), KisPSDLayerStyle::innerGlow(), KisPSDLayerStyle::innerShadow(), KisPSDLayerStyle::outerGlow(), KisPSDLayerStyle::patternOverlay(), psd_bevel_emboss, psd_bevel_inner_bevel, psd_bevel_outer_bevel, psd_bevel_pillow_emboss, psd_bevel_stroke_emboss, psd_direction_down, psd_direction_up, psd_fill_gradient, psd_fill_pattern, psd_fill_solid_color, psd_glow_center, psd_glow_edge, psd_gradient_style_angle, psd_gradient_style_diamond, psd_gradient_style_linear, psd_gradient_style_radial, psd_gradient_style_reflected, psd_stroke_center, psd_stroke_inside, psd_stroke_outside, psd_technique_precise, psd_technique_slope_limit, psd_technique_softer, KisPSDLayerStyle::satin, and KisPSDLayerStyle::stroke.

◆ fetchAllPatternLinks()

QVector< KoResourceSignature > KisAslLayerStyleSerializer::fetchAllPatternLinks ( const KisPSDLayerStyle * style)
staticprivate

Definition at line 265 of file kis_asl_layer_style_serializer.cpp.

266{
267 QVector<KoResourceSignature> allPatternLinks;
268
269 if (style->patternOverlay()->effectEnabled()) {
270 allPatternLinks << style->patternOverlay()->patternLink();
271 }
272
273 if (style->stroke()->effectEnabled() &&
274 style->stroke()->fillType() == psd_fill_pattern) {
275
276 allPatternLinks << style->stroke()->patternLink();
277 }
278
279 if(style->bevelAndEmboss()->effectEnabled() &&
280 style->bevelAndEmboss()->textureEnabled()) {
281
282 allPatternLinks << style->bevelAndEmboss()->texturePatternLink();
283 }
284
285 return allPatternLinks;
286}
bool effectEnabled() const
Definition psd.h:261
psd_fill_type fillType() const
Definition psd.h:341
KoResourceSignature texturePatternLink() const
Definition psd.h:875
bool textureEnabled() const
Definition psd.h:866
KoResourceSignature patternLink() const
Definition psd.h:1057

References KisPSDLayerStyle::bevelAndEmboss(), psd_layer_effects_shadow_base::effectEnabled(), psd_layer_effects_shadow_base::fillType(), psd_layer_effects_overlay_base::patternLink(), KisPSDLayerStyle::patternOverlay(), psd_fill_pattern, KisPSDLayerStyle::stroke, psd_layer_effects_bevel_emboss::textureEnabled(), and psd_layer_effects_bevel_emboss::texturePatternLink().

◆ fetchAllPatterns()

QVector< KoPatternSP > KisAslLayerStyleSerializer::fetchAllPatterns ( const KisPSDLayerStyle * style,
KisResourcesInterfaceSP resourcesInterface )
staticprivate

Definition at line 287 of file kis_asl_layer_style_serializer.cpp.

288{
289 const auto allPatternLinks = fetchAllPatternLinks(style);
290 QVector <KoPatternSP> allPatterns;
291
292 Q_FOREACH(const KoResourceSignature &sig, allPatternLinks) {
293 KoPatternSP pattern = resourcesInterface->source<KoPattern>(sig.type).bestMatch(sig.md5sum, sig.filename, sig.name);
294 if (pattern) {
295 allPatterns << pattern;
296 } else {
297 warnKrita << "WARNING: failed to fetch a pattern for a layer style" << sig;
298 }
299 }
300
301 return allPatterns;
302}
static QVector< KoResourceSignature > fetchAllPatternLinks(const KisPSDLayerStyle *style)
A simple wrapper object for the main information about the resource.

References fetchAllPatternLinks(), KoResourceSignature::filename, KoResourceSignature::md5sum, KoResourceSignature::name, KoResourceSignature::type, and warnKrita.

◆ fetchLinkedResourceSignatures()

QVector< KoResourceSignature > KisAslLayerStyleSerializer::fetchLinkedResourceSignatures ( const KisPSDLayerStyle * style)
static

Definition at line 764 of file kis_asl_layer_style_serializer.cpp.

765{
766 QVector<KoResourceSignature> embeddedResourceLinks = fetchAllPatternLinks(style);
767
768 if (style->gradientOverlay()->effectEnabled()) {
769 embeddedResourceLinks << style->gradientOverlay()->gradientLink();
770 }
771
772 if (style->innerGlow()->effectEnabled() && style->innerGlow()->fillType() == psd_fill_gradient) {
773 embeddedResourceLinks << style->innerGlow()->gradientLink();
774 }
775
776 if (style->outerGlow()->effectEnabled() && style->outerGlow()->fillType() == psd_fill_gradient) {
777 embeddedResourceLinks << style->outerGlow()->gradientLink();
778 }
779
780 if (style->stroke()->effectEnabled() && style->stroke()->fillType() == psd_fill_gradient) {
781 embeddedResourceLinks << style->stroke()->gradientLink();
782 }
783
784 return embeddedResourceLinks;
785}
KoResourceSignature gradientLink() const
Definition psd.h:361

References psd_layer_effects_shadow_base::effectEnabled(), fetchAllPatternLinks(), psd_layer_effects_shadow_base::fillType(), psd_layer_effects_shadow_base::gradientLink(), KisPSDLayerStyle::gradientOverlay(), KisPSDLayerStyle::innerGlow(), KisPSDLayerStyle::outerGlow(), psd_fill_gradient, and KisPSDLayerStyle::stroke.

◆ formPsdXmlDocument()

QDomDocument KisAslLayerStyleSerializer::formPsdXmlDocument ( ) const

Definition at line 751 of file kis_asl_layer_style_serializer.cpp.

752{
753 QDomDocument doc = formXmlDocument();
754
755 QDomNode nullNode = findNodeByClassId("null", doc.documentElement());
756 QDomNode stylNode = findNodeByClassId("Styl", doc.documentElement());
757 QDomNode lefxNode = findNodeByClassId("Lefx", stylNode);
758
759 replaceAllChildren(lefxNode, nullNode);
760
761 return doc;
762}
void replaceAllChildren(QDomNode src, QDomNode dst)
QDomNode findNodeByClassId(const QString &classId, QDomNode parent)

References findNodeByClassId(), formXmlDocument(), and replaceAllChildren().

◆ formXmlDocument()

QDomDocument KisAslLayerStyleSerializer::formXmlDocument ( ) const

the duplicated patterns will be resolved later at the uuid generation stage

Definition at line 314 of file kis_asl_layer_style_serializer.cpp.

315{
316 KIS_ASSERT_RECOVER(!m_stylesVector.isEmpty()) { return QDomDocument(); }
317
318 QVector<KoPatternSP> allPatterns;
319
322 Q_FOREACH (KisPSDLayerStyleSP style, m_stylesVector) {
323 allPatterns += fetchAllPatterns(style.data(), style->resourcesInterface());
324 }
325
326 QHash<KoPatternSP, QString> patternToUuidMap;
327
329
330 if (!allPatterns.isEmpty()) {
331 w.enterList(ResourceType::Patterns);
332
333 Q_FOREACH (KoPatternSP pattern, allPatterns) {
334 if (pattern) {
335 if (!patternToUuidMap.contains(pattern)) {
336 QString uuid = w.writePattern("", pattern);
337 patternToUuidMap.insert(pattern, uuid);
338 }
339 } else {
340 warnKrita << "WARNING: KisAslLayerStyleSerializer::saveToDevice: saved pattern is null!";
341 }
342 }
343
344 w.leaveList();
345 }
346
347 Q_FOREACH (KisPSDLayerStyleSP style, m_stylesVector) {
348
349 w.enterDescriptor("", "", "null");
350 w.writeText("Nm ", style->name());
351 w.writeText("Idnt", style->psdUuid());
352 w.leaveDescriptor();
353
354 w.enterDescriptor("", "", "Styl");
355
356 w.enterDescriptor("documentMode", "", "documentMode");
357 w.leaveDescriptor();
358
359 w.enterDescriptor("Lefx", "", "Lefx");
360
361 w.writeUnitFloat("Scl ", "#Prc", 100);
362 w.writeBoolean("masterFXSwitch", style->isEnabled());
363
364
365 // Drop Shadow
366 const psd_layer_effects_drop_shadow *dropShadow = style->dropShadow();
367 if (dropShadow->effectEnabled()) {
368 w.enterDescriptor("DrSh", "", "DrSh");
369
370 w.writeBoolean("enab", dropShadow->effectEnabled());
371 w.writeEnum("Md ", "BlnM", compositeOpToBlendMode(dropShadow->blendMode()));
372 w.writeColor("Clr ", dropShadow->color());
373
374 w.writeUnitFloat("Opct", "#Prc", dropShadow->opacity());
375 w.writeBoolean("uglg", dropShadow->useGlobalLight());
376 w.writeUnitFloat("lagl", "#Ang", dropShadow->angle());
377 w.writeUnitFloat("Dstn", "#Pxl", dropShadow->distance());
378 w.writeUnitFloat("Ckmt", "#Pxl", dropShadow->spread());
379 w.writeUnitFloat("blur", "#Pxl", dropShadow->size());
380 w.writeUnitFloat("Nose", "#Prc", dropShadow->noise());
381
382 w.writeBoolean("AntA", dropShadow->antiAliased());
383
384 // FIXME: save curves
385 w.writeCurve("TrnS",
386 "Linear",
387 QVector<QPointF>() << QPointF() << QPointF(255, 255));
388
389 w.writeBoolean("layerConceals", dropShadow->knocksOut());
390 w.leaveDescriptor();
391 }
392
393 // Inner Shadow
394 const psd_layer_effects_inner_shadow *innerShadow = style->innerShadow();
395 if (innerShadow->effectEnabled()) {
396 w.enterDescriptor("IrSh", "", "IrSh");
397
398 w.writeBoolean("enab", innerShadow->effectEnabled());
399 w.writeEnum("Md ", "BlnM", compositeOpToBlendMode(innerShadow->blendMode()));
400 w.writeColor("Clr ", innerShadow->color());
401
402 w.writeUnitFloat("Opct", "#Prc", innerShadow->opacity());
403 w.writeBoolean("uglg", innerShadow->useGlobalLight());
404 w.writeUnitFloat("lagl", "#Ang", innerShadow->angle());
405 w.writeUnitFloat("Dstn", "#Pxl", innerShadow->distance());
406 w.writeUnitFloat("Ckmt", "#Pxl", innerShadow->spread());
407 w.writeUnitFloat("blur", "#Pxl", innerShadow->size());
408 w.writeUnitFloat("Nose", "#Prc", innerShadow->noise());
409
410 w.writeBoolean("AntA", innerShadow->antiAliased());
411
412 // FIXME: save curves
413 w.writeCurve("TrnS",
414 "Linear",
415 QVector<QPointF>() << QPointF() << QPointF(255, 255));
416
417 w.leaveDescriptor();
418 }
419
420 // Outer Glow
421 const psd_layer_effects_outer_glow *outerGlow = style->outerGlow();
422 if (outerGlow->effectEnabled()) {
423 w.enterDescriptor("OrGl", "", "OrGl");
424
425 w.writeBoolean("enab", outerGlow->effectEnabled());
426 w.writeEnum("Md ", "BlnM", compositeOpToBlendMode(outerGlow->blendMode()));
427
428 if (outerGlow->fillType() == psd_fill_gradient && outerGlow->gradient(style->resourcesInterface())) {
429 KoSegmentGradient *segmentGradient = dynamic_cast<KoSegmentGradient*>(outerGlow->gradient(style->resourcesInterface()).data());
430 KoStopGradient *stopGradient = dynamic_cast<KoStopGradient*>(outerGlow->gradient(style->resourcesInterface()).data());
431
432 if (segmentGradient && segmentGradient->valid()) {
433 w.writeSegmentGradient("Grad", *segmentGradient);
434 } else if (stopGradient && stopGradient->valid()) {
435 w.writeStopGradient("Grad", *stopGradient);
436 } else {
437 warnKrita << "WARNING: OG: Unknown gradient type!";
438 w.writeColor("Clr ", outerGlow->color());
439 }
440
441 } else {
442 w.writeColor("Clr ", outerGlow->color());
443 }
444
445 w.writeUnitFloat("Opct", "#Prc", outerGlow->opacity());
446
447 w.writeEnum("GlwT", "BETE", techniqueToString(outerGlow->technique(), "BETE"));
448
449 w.writeUnitFloat("Ckmt", "#Pxl", outerGlow->spread());
450 w.writeUnitFloat("blur", "#Pxl", outerGlow->size());
451 w.writeUnitFloat("Nose", "#Prc", outerGlow->noise());
452
453 w.writeUnitFloat("ShdN", "#Prc", outerGlow->jitter());
454
455 w.writeBoolean("AntA", outerGlow->antiAliased());
456
457 // FIXME: save curves
458 w.writeCurve("TrnS",
459 "Linear",
460 QVector<QPointF>() << QPointF() << QPointF(255, 255));
461
462 w.writeUnitFloat("Inpr", "#Prc", outerGlow->range());
463
464 w.leaveDescriptor();
465 }
466
467 // Inner Glow
468 const psd_layer_effects_inner_glow *innerGlow = style->innerGlow();
469 if (innerGlow->effectEnabled()) {
470 w.enterDescriptor("IrGl", "", "IrGl");
471
472 w.writeBoolean("enab", innerGlow->effectEnabled());
473 w.writeEnum("Md ", "BlnM", compositeOpToBlendMode(innerGlow->blendMode()));
474
475 if (innerGlow->fillType() == psd_fill_gradient && innerGlow->gradient(style->resourcesInterface())) {
476 KoSegmentGradient *segmentGradient = dynamic_cast<KoSegmentGradient*>(innerGlow->gradient(style->resourcesInterface()).data());
477 KoStopGradient *stopGradient = dynamic_cast<KoStopGradient*>(innerGlow->gradient(style->resourcesInterface()).data());
478
479 if (segmentGradient && innerGlow->gradient(style->resourcesInterface())->valid()) {
480 w.writeSegmentGradient("Grad", *segmentGradient);
481 } else if (stopGradient && innerGlow->gradient(style->resourcesInterface())->valid()) {
482 w.writeStopGradient("Grad", *stopGradient);
483 } else {
484 warnKrita << "WARNING: IG: Unknown gradient type!";
485 w.writeColor("Clr ", innerGlow->color());
486 }
487
488 } else {
489 w.writeColor("Clr ", innerGlow->color());
490 }
491
492 w.writeUnitFloat("Opct", "#Prc", innerGlow->opacity());
493
494 w.writeEnum("GlwT", "BETE", techniqueToString(innerGlow->technique(), "BETE"));
495
496 w.writeUnitFloat("Ckmt", "#Pxl", innerGlow->spread());
497 w.writeUnitFloat("blur", "#Pxl", innerGlow->size());
498
499 // NOTE: order is swapped in ASL!
500 w.writeUnitFloat("ShdN", "#Prc", innerGlow->jitter());
501 w.writeUnitFloat("Nose", "#Prc", innerGlow->noise());
502
503 w.writeBoolean("AntA", innerGlow->antiAliased());
504
505 w.writeEnum("glwS", "IGSr", innerGlow->source() == psd_glow_center ? "SrcC" : "SrcE");
506
507 // FIXME: save curves
508 w.writeCurve("TrnS",
509 "Linear",
510 QVector<QPointF>() << QPointF() << QPointF(255, 255));
511
512 w.writeUnitFloat("Inpr", "#Prc", innerGlow->range());
513
514 w.leaveDescriptor();
515 }
516
517 // Bevel and Emboss
518 const psd_layer_effects_bevel_emboss *bevelAndEmboss = style->bevelAndEmboss();
519 if (bevelAndEmboss->effectEnabled()) {
520 w.enterDescriptor("ebbl", "", "ebbl");
521
522 w.writeBoolean("enab", bevelAndEmboss->effectEnabled());
523
524 w.writeEnum("hglM", "BlnM", compositeOpToBlendMode(bevelAndEmboss->highlightBlendMode()));
525 w.writeColor("hglC", bevelAndEmboss->highlightColor());
526 w.writeUnitFloat("hglO", "#Prc", bevelAndEmboss->highlightOpacity());
527
528 w.writeEnum("sdwM", "BlnM", compositeOpToBlendMode(bevelAndEmboss->shadowBlendMode()));
529 w.writeColor("sdwC", bevelAndEmboss->shadowColor());
530 w.writeUnitFloat("sdwO", "#Prc", bevelAndEmboss->shadowOpacity());
531
532 w.writeEnum("bvlT", "bvlT", techniqueToString(bevelAndEmboss->technique(), "bvlT"));
533 w.writeEnum("bvlS", "BESl", bevelStyleToString(bevelAndEmboss->style()));
534
535 w.writeBoolean("uglg", bevelAndEmboss->useGlobalLight());
536 w.writeUnitFloat("lagl", "#Ang", bevelAndEmboss->angle());
537 w.writeUnitFloat("Lald", "#Ang", bevelAndEmboss->altitude());
538
539 w.writeUnitFloat("srgR", "#Prc", bevelAndEmboss->depth());
540 w.writeUnitFloat("blur", "#Pxl", bevelAndEmboss->size());
541 w.writeEnum("bvlD", "BESs", bevelAndEmboss->direction() == psd_direction_up ? "In " : "Out ");
542
543 // FIXME: save curves
544 w.writeCurve("TrnS",
545 "Linear",
546 QVector<QPointF>() << QPointF() << QPointF(255, 255));
547
548 w.writeBoolean("antialiasGloss", bevelAndEmboss->glossAntiAliased());
549
550 w.writeUnitFloat("Sftn", "#Pxl", bevelAndEmboss->soften());
551
552 if (bevelAndEmboss->contourEnabled()) {
553 w.writeBoolean("useShape", bevelAndEmboss->contourEnabled());
554
555 // FIXME: save curves
556 w.writeCurve("MpgS",
557 "Linear",
558 QVector<QPointF>() << QPointF() << QPointF(255, 255));
559
560 w.writeBoolean("AntA", bevelAndEmboss->antiAliased());
561 w.writeUnitFloat("Inpr", "#Prc", bevelAndEmboss->contourRange());
562 }
563
564 w.writeBoolean("useTexture", bevelAndEmboss->textureEnabled());
565
566 if (bevelAndEmboss->textureEnabled()) {
567 w.writeBoolean("InvT", bevelAndEmboss->textureInvert());
568 w.writeBoolean("Algn", bevelAndEmboss->textureAlignWithLayer());
569 w.writeUnitFloat("Scl ", "#Prc", bevelAndEmboss->textureScale());
570 w.writeUnitFloat("textureDepth ", "#Prc", bevelAndEmboss->textureDepth());
571
572 KoPatternSP pattern = bevelAndEmboss->texturePattern(style->resourcesInterface());
573 w.writePatternRef("Ptrn", pattern, fetchPatternUuidSafe(pattern, patternToUuidMap));
574 w.writePhasePoint("phase", bevelAndEmboss->texturePhase());
575 }
576
577 w.leaveDescriptor();
578 }
579
580 // Satin
581 const psd_layer_effects_satin *satin = style->satin();
582 if (satin->effectEnabled()) {
583 w.enterDescriptor("ChFX", "", "ChFX");
584
585 w.writeBoolean("enab", satin->effectEnabled());
586 w.writeEnum("Md ", "BlnM", compositeOpToBlendMode(satin->blendMode()));
587 w.writeColor("Clr ", satin->color());
588
589 w.writeBoolean("AntA", satin->antiAliased());
590 w.writeBoolean("Invr", satin->invert());
591 w.writeUnitFloat("Opct", "#Prc", satin->opacity());
592 w.writeUnitFloat("lagl", "#Ang", satin->angle());
593 w.writeUnitFloat("Dstn", "#Pxl", satin->distance());
594 w.writeUnitFloat("blur", "#Pxl", satin->size());
595
596 // FIXME: save curves
597 w.writeCurve("MpgS",
598 "Linear",
599 QVector<QPointF>() << QPointF() << QPointF(255, 255));
600
601 w.leaveDescriptor();
602 }
603
604 const psd_layer_effects_color_overlay *colorOverlay = style->colorOverlay();
605 if (colorOverlay->effectEnabled()) {
606 w.enterDescriptor("SoFi", "", "SoFi");
607
608 w.writeBoolean("enab", colorOverlay->effectEnabled());
609 w.writeEnum("Md ", "BlnM", compositeOpToBlendMode(colorOverlay->blendMode()));
610 w.writeUnitFloat("Opct", "#Prc", colorOverlay->opacity());
611 w.writeColor("Clr ", colorOverlay->color());
612
613 w.leaveDescriptor();
614 }
615
616 // Gradient Overlay
617 const psd_layer_effects_gradient_overlay *gradientOverlay = style->gradientOverlay();
618 KoSegmentGradient *segmentGradient = dynamic_cast<KoSegmentGradient*>(gradientOverlay->gradient(style->resourcesInterface()).data());
619 KoStopGradient *stopGradient = dynamic_cast<KoStopGradient*>(gradientOverlay->gradient(style->resourcesInterface()).data());
620
621 if (gradientOverlay->effectEnabled() && ((segmentGradient && segmentGradient->valid()) || (stopGradient && stopGradient->valid()))) {
622 w.enterDescriptor("GrFl", "", "GrFl");
623
624 w.writeBoolean("enab", gradientOverlay->effectEnabled());
625 w.writeEnum("Md ", "BlnM", compositeOpToBlendMode(gradientOverlay->blendMode()));
626 w.writeUnitFloat("Opct", "#Prc", gradientOverlay->opacity());
627
628 if (segmentGradient && segmentGradient->valid()) {
629 w.writeSegmentGradient("Grad", *segmentGradient);
630 } else if (stopGradient && stopGradient->valid()) {
631 w.writeStopGradient("Grad", *stopGradient);
632 }
633
634 w.writeUnitFloat("Angl", "#Ang", gradientOverlay->angle());
635
636 w.writeEnum("Type", "GrdT", gradientTypeToString(gradientOverlay->style()));
637
638 w.writeBoolean("Rvrs", gradientOverlay->reverse());
639 w.writeBoolean("Algn", gradientOverlay->alignWithLayer());
640 w.writeUnitFloat("Scl ", "#Prc", gradientOverlay->scale());
641
642 w.writeOffsetPoint("Ofst", gradientOverlay->gradientOffset());
643
644 w.writeBoolean("Dthr", gradientOverlay->dither());
645
646 w.leaveDescriptor();
647 }
648
649 // Pattern Overlay
650 const psd_layer_effects_pattern_overlay *patternOverlay = style->patternOverlay();
651 if (patternOverlay->effectEnabled()) {
652 w.enterDescriptor("patternFill", "", "patternFill");
653
654 w.writeBoolean("enab", patternOverlay->effectEnabled());
655 w.writeEnum("Md ", "BlnM", compositeOpToBlendMode(patternOverlay->blendMode()));
656 w.writeUnitFloat("Opct", "#Prc", patternOverlay->opacity());
657
658 KoPatternSP pattern = patternOverlay->pattern(style->resourcesInterface());
659 w.writePatternRef("Ptrn", pattern, fetchPatternUuidSafe(pattern, patternToUuidMap));
660
661 w.writeUnitFloat("Scl ", "#Prc", patternOverlay->scale());
662 w.writeBoolean("Algn", patternOverlay->alignWithLayer());
663 w.writePhasePoint("phase", patternOverlay->patternPhase());
664
665 w.leaveDescriptor();
666 }
667
668 const psd_layer_effects_stroke *stroke = style->stroke();
669 if (stroke->effectEnabled()) {
670 w.enterDescriptor("FrFX", "", "FrFX");
671
672 w.writeBoolean("enab", stroke->effectEnabled());
673
674 w.writeEnum("Styl", "FStl", strokePositionToString(stroke->position()));
675 w.writeEnum("PntT", "FrFl", strokeFillTypeToString(stroke->fillType()));
676
677 w.writeEnum("Md ", "BlnM", compositeOpToBlendMode(stroke->blendMode()));
678 w.writeUnitFloat("Opct", "#Prc", stroke->opacity());
679
680 w.writeUnitFloat("Sz ", "#Pxl", stroke->size());
681
682 if (stroke->fillType() == psd_fill_solid_color) {
683 w.writeColor("Clr ", stroke->color());
684 }
685 else if (stroke->fillType() == psd_fill_gradient) {
686 KoSegmentGradient *segmentGradient = dynamic_cast<KoSegmentGradient*>(stroke->gradient(style->resourcesInterface()).data());
687 KoStopGradient *stopGradient = dynamic_cast<KoStopGradient*>(stroke->gradient(style->resourcesInterface()).data());
688
689 if (segmentGradient && segmentGradient->valid()) {
690 w.writeSegmentGradient("Grad", *segmentGradient);
691 } else if (stopGradient && stopGradient->valid()) {
692 w.writeStopGradient("Grad", *stopGradient);
693 } else {
694 warnKrita << "WARNING: Stroke: Unknown gradient type!";
695 w.writeColor("Clr ", stroke->color());
696 }
697
698 w.writeUnitFloat("Angl", "#Ang", stroke->angle());
699 w.writeEnum("Type", "GrdT", gradientTypeToString(stroke->style()));
700
701 w.writeBoolean("Rvrs", stroke->reverse());
702 w.writeUnitFloat("Scl ", "#Prc", stroke->scale());
703 w.writeBoolean("Algn", stroke->alignWithLayer());
704 w.writeOffsetPoint("Ofst", stroke->gradientOffset());
705
706 w.writeBoolean("Dthr", stroke->dither());
707
708 } else if (stroke->fillType() == psd_fill_pattern) {
709
710 KoPatternSP pattern = stroke->pattern(style->resourcesInterface());
711 w.writePatternRef("Ptrn", pattern, fetchPatternUuidSafe(pattern, patternToUuidMap));
712 w.writeUnitFloat("Scl ", "#Prc", stroke->scale());
713 w.writeBoolean("Lnkd", stroke->alignWithLayer());
714 w.writePhasePoint("phase", stroke->patternPhase());
715 }
716
717 w.leaveDescriptor();
718 }
719
720 w.leaveDescriptor();
721 w.leaveDescriptor();
722 }
723
724 return w.document();
725}
static QVector< KoPatternSP > fetchAllPatterns(const KisPSDLayerStyle *style, KisResourcesInterfaceSP resourcesInterface)
psd_glow_source source() const
Definition psd.h:606
qint32 opacity() const
Definition psd.h:281
qint32 range() const
Definition psd.h:351
qint32 distance() const
Definition psd.h:296
bool useGlobalLight() const
Definition psd.h:291
QString blendMode() const
Definition psd.h:266
bool knocksOut() const
Definition psd.h:326
qint32 spread() const
Definition psd.h:301
psd_technique_type technique() const
Definition psd.h:346
KoColor color() const
Definition psd.h:271
qint32 jitter() const
Definition psd.h:356
qint32 noise() const
Definition psd.h:321
qint32 angle() const
Definition psd.h:286
qint32 size() const
Definition psd.h:306
KoAbstractGradientSP gradient(KisResourcesInterfaceSP resourcesInterface) const
Definition psd.h:365
bool antiAliased() const
Definition psd.h:316
QString bevelStyleToString(psd_bevel_style style)
QString techniqueToString(psd_technique_type technique, const QString &typeId)
QString strokePositionToString(psd_stroke_position position)
QString gradientTypeToString(psd_gradient_style style)
QString fetchPatternUuidSafe(KoPatternSP pattern, QHash< KoPatternSP, QString > patternToUuid)
QString strokeFillTypeToString(psd_fill_type position)
QString compositeOpToBlendMode(const QString &compositeOp)
#define KIS_ASSERT_RECOVER(cond)
Definition kis_assert.h:55
const QString Patterns
QString shadowBlendMode() const
Definition psd.h:821
psd_technique_type technique() const
Definition psd.h:730
qint32 highlightOpacity() const
Definition psd.h:812
psd_bevel_style style() const
Definition psd.h:721
bool contourEnabled() const
Definition psd.h:848
psd_direction direction() const
Definition psd.h:748
bool glossAntiAliased() const
Definition psd.h:785
KoPatternSP texturePattern(KisResourcesInterfaceSP resourcesInterface) const
Definition psd.h:879
bool textureInvert() const
Definition psd.h:912
qint32 shadowOpacity() const
Definition psd.h:839
bool textureAlignWithLayer() const
Definition psd.h:921
QString highlightBlendMode() const
Definition psd.h:794
KoColor shadowColor() const
Definition psd.h:830
KoColor highlightColor() const
Definition psd.h:803
QPointF texturePhase() const
Definition psd.h:936
KoPatternSP pattern(KisResourcesInterfaceSP resourcesInterface) const
Definition psd.h:1061
QPointF gradientOffset() const
Definition psd.h:1110
QPointF patternPhase() const
Definition psd.h:1129
bool alignWithLayer() const
Definition psd.h:1027
psd_gradient_style style() const
Definition psd.h:1042
bool invert() const
Definition psd.h:650
psd_stroke_position position() const
Definition psd.h:1280

References psd_layer_effects_overlay_base::alignWithLayer(), psd_layer_effects_bevel_emboss::altitude(), psd_layer_effects_shadow_base::angle(), psd_layer_effects_shadow_base::antiAliased(), bevelStyleToString(), psd_layer_effects_shadow_base::blendMode(), psd_layer_effects_shadow_base::color(), compositeOpToBlendMode(), psd_layer_effects_bevel_emboss::contourEnabled(), psd_layer_effects_bevel_emboss::contourRange(), psd_layer_effects_bevel_emboss::depth(), psd_layer_effects_bevel_emboss::direction(), psd_layer_effects_shadow_base::distance(), psd_layer_effects_overlay_base::dither(), psd_layer_effects_shadow_base::effectEnabled(), fetchAllPatterns(), fetchPatternUuidSafe(), psd_layer_effects_shadow_base::fillType(), psd_layer_effects_bevel_emboss::glossAntiAliased(), psd_layer_effects_shadow_base::gradient(), psd_layer_effects_overlay_base::gradientOffset(), gradientTypeToString(), psd_layer_effects_bevel_emboss::highlightBlendMode(), psd_layer_effects_bevel_emboss::highlightColor(), psd_layer_effects_bevel_emboss::highlightOpacity(), psd_layer_effects_satin::invert(), psd_layer_effects_shadow_base::jitter(), KIS_ASSERT_RECOVER, psd_layer_effects_shadow_base::knocksOut(), m_stylesVector, psd_layer_effects_shadow_base::noise(), psd_layer_effects_shadow_base::opacity(), psd_layer_effects_overlay_base::pattern(), psd_layer_effects_overlay_base::patternPhase(), ResourceType::Patterns, psd_layer_effects_stroke::position(), psd_direction_up, psd_fill_gradient, psd_fill_pattern, psd_fill_solid_color, psd_glow_center, psd_layer_effects_shadow_base::range(), psd_layer_effects_overlay_base::reverse(), psd_layer_effects_overlay_base::scale(), psd_layer_effects_bevel_emboss::shadowBlendMode(), psd_layer_effects_bevel_emboss::shadowColor(), psd_layer_effects_bevel_emboss::shadowOpacity(), psd_layer_effects_shadow_base::size(), psd_layer_effects_bevel_emboss::soften(), psd_layer_effects_inner_glow::source(), psd_layer_effects_shadow_base::spread(), strokeFillTypeToString(), strokePositionToString(), psd_layer_effects_bevel_emboss::style(), psd_layer_effects_overlay_base::style(), psd_layer_effects_shadow_base::technique(), psd_layer_effects_bevel_emboss::technique(), techniqueToString(), psd_layer_effects_bevel_emboss::textureAlignWithLayer(), psd_layer_effects_bevel_emboss::textureDepth(), psd_layer_effects_bevel_emboss::textureEnabled(), psd_layer_effects_bevel_emboss::textureInvert(), psd_layer_effects_bevel_emboss::texturePattern(), psd_layer_effects_bevel_emboss::texturePhase(), psd_layer_effects_bevel_emboss::textureScale(), psd_layer_effects_shadow_base::useGlobalLight(), KoResource::valid, and warnKrita.

◆ gradients()

QVector< KoAbstractGradientSP > KisAslLayerStyleSerializer::gradients ( ) const

Definition at line 73 of file kis_asl_layer_style_serializer.cpp.

74{
75 return m_gradientsStore;
76}

References m_gradientsStore.

◆ isInitialized()

bool KisAslLayerStyleSerializer::isInitialized ( )
inline

Definition at line 48 of file kis_asl_layer_style_serializer.h.

◆ isValid()

bool KisAslLayerStyleSerializer::isValid ( )
inline

◆ newStyleStarted()

void KisAslLayerStyleSerializer::newStyleStarted ( bool isPsdStructure)
private

Definition at line 1252 of file kis_asl_layer_style_serializer.cpp.

1253{
1255 KisPSDLayerStyleSP currentStyleSP = m_stylesVector.last();
1256 KisPSDLayerStyle *currentStyle = currentStyleSP.data();
1257
1258 psd_layer_effects_context *context = currentStyleSP->context();
1259 context->keep_original = 0;
1260
1261 QString prefix = isPsdStructure ? "/null" : "/Styl/Lefx";
1262 connectCatcherToStyle(currentStyle, prefix);
1263}
void connectCatcherToStyle(KisPSDLayerStyle *style, const QString &prefix)
QSharedPointer< T > toQShared(T *ptr)

References connectCatcherToStyle(), psd_layer_effects_context::keep_original, m_localResourcesInterface, m_stylesVector, and toQShared().

◆ patterns()

QHash< QString, KoPatternSP > KisAslLayerStyleSerializer::patterns ( ) const

Definition at line 68 of file kis_asl_layer_style_serializer.cpp.

69{
70 return m_patternsStore;
71}

References m_patternsStore.

◆ readFromDevice()

void KisAslLayerStyleSerializer::readFromDevice ( QIODevice & device)

Definition at line 1363 of file kis_asl_layer_style_serializer.cpp.

1364{
1365 m_catcher.subscribePattern("/patterns/KisPattern", std::bind(&KisAslLayerStyleSerializer::registerPatternObject, this, _1, _2));
1366 m_catcher.subscribePattern("/Patterns/KisPattern", std::bind(&KisAslLayerStyleSerializer::registerPatternObject, this, _1, _2));
1368
1369 KisAslReader reader;
1370 const QDomDocument doc = reader.readFile(device);
1371
1372 if (doc.isNull()) {
1373 m_initialized = false;
1374 return;
1375 }
1376
1377 //dbgKrita << ppVar(doc.toString());
1378
1379 //KisAslObjectCatcher c2;
1380 KisAslXmlParser parser;
1381 parser.parseXML(doc, m_catcher);
1382
1383 QMultiHash<QString, KisPSDLayerStyleSP> allStyles;
1384 QHash<QString, KisPSDLayerStyleSP> cleanedStyles;
1385
1386 for(const auto &style : m_stylesVector)
1387 allStyles.insert(style->psdUuid(), style);
1388
1389 // correct all the layer styles
1390 for (const auto &style : allStyles) {
1391 FillStylesCorrector::correct(style.data());
1392
1393 if (allStyles.count(style->psdUuid()) > 1) {
1394 const auto &existingStyle = cleanedStyles.find(style->psdUuid());
1395
1396 if (existingStyle != cleanedStyles.end()) {
1397 if (existingStyle.value()->name() != style->name()) {
1398 qWarning() << "Duplicated UUID" << style->psdUuid() << "for styles" << style->name() << "and"
1399 << existingStyle.value()->name();
1400 style->setMD5Sum("");
1401 style->setUuid(QUuid::createUuid());
1402 } else {
1403 qWarning() << "Duplicated style" << style->name();
1404 continue;
1405 }
1406 }
1407 }
1408
1409 style->setValid(!style->isEmpty());
1410
1411 style->setFilename(style->uuid().toString());
1412
1413 cleanedStyles.insert(style->psdUuid(), style);
1414 }
1415
1416 m_stylesVector = cleanedStyles.values().toVector();
1417
1418 m_initialized = true;
1419}
static void correct(KisPSDLayerStyle *style)
void subscribeNewStyleStarted(ASLCallbackNewStyle callback)
void subscribePattern(const QString &path, ASLCallbackPattern callback)
KisAslCallbackObjectCatcher m_catcher
QDomDocument readFile(QIODevice &device)
void parseXML(const QDomDocument &doc, KisAslObjectCatcher &catcher)

References FillStylesCorrector::correct(), m_catcher, m_initialized, m_stylesVector, newStyleStarted(), KisAslXmlParser::parseXML(), KisAslReader::readFile(), registerPatternObject(), KisAslCallbackObjectCatcher::subscribeNewStyleStarted(), and KisAslCallbackObjectCatcher::subscribePattern().

◆ readFromFile()

bool KisAslLayerStyleSerializer::readFromFile ( const QString & filename)

Definition at line 1265 of file kis_asl_layer_style_serializer.cpp.

1266{
1267 QFile file(filename);
1268 if (file.size() == 0) return false;
1269
1270 if (!file.open(QIODevice::ReadOnly)) {
1271 dbgKrita << "Can't open file " << filename;
1272 return false;
1273 }
1274
1275 readFromDevice(file);
1276 file.close();
1277
1278 return m_initialized;
1279}
#define dbgKrita
Definition kis_debug.h:45

References dbgKrita, m_initialized, and readFromDevice().

◆ readFromPSDXML()

void KisAslLayerStyleSerializer::readFromPSDXML ( const QDomDocument & doc)

Definition at line 1432 of file kis_asl_layer_style_serializer.cpp.

1433{
1434 // The caller prepares the document using the following code
1435 //
1436 // KisAslReader reader;
1437 // QDomDocument doc = reader.readLfx2PsdSection(device);
1438
1439 m_stylesVector.clear();
1440
1441 //m_catcher.subscribePattern("/Patterns/KisPattern", std::bind(&KisAslLayerStyleSerializer::registerPatternObject, this, _1));
1443
1444 //KisAslObjectCatcher c2;
1445 KisAslXmlParser parser;
1446 parser.parseXML(doc, m_catcher);
1447
1448 // correct all the layer styles
1449 Q_FOREACH (KisPSDLayerStyleSP style, m_stylesVector) {
1450 FillStylesCorrector::correct(style.data());
1451 }
1452}

References FillStylesCorrector::correct(), m_catcher, m_stylesVector, newStyleStarted(), KisAslXmlParser::parseXML(), and KisAslCallbackObjectCatcher::subscribeNewStyleStarted().

◆ registerPatternObject()

void KisAslLayerStyleSerializer::registerPatternObject ( const KoPatternSP pattern,
const QString & patternUuid )
private

Definition at line 931 of file kis_asl_layer_style_serializer.cpp.

931 {
932
933 if (!pattern) {
934 warnKrita << "WARNING: got an empty pattern:" << patternUuid;
935 return;
936 }
937
938 if (m_patternsStore.contains(patternUuid)) {
939 warnKrita << "WARNING: ASL style contains a duplicated pattern!" << ppVar(pattern->name()) << ppVar(m_patternsStore[patternUuid]->name());
940 } else {
941 pattern->setFilename(patternUuid + QString(".pat"));
942 m_patternsStore.insert(patternUuid, pattern);
943 m_localResourcesInterface->addResource(pattern);
944 }
945}
#define ppVar(var)
Definition kis_debug.h:155
const char * name(StandardAction id)

References m_localResourcesInterface, m_patternsStore, ppVar, and warnKrita.

◆ registerPSDPattern()

void KisAslLayerStyleSerializer::registerPSDPattern ( const QDomDocument & doc)

Definition at line 1421 of file kis_asl_layer_style_serializer.cpp.

1422{
1424 catcher.subscribePattern("/Patterns/KisPattern", std::bind(&KisAslLayerStyleSerializer::registerPatternObject, this, _1, _2));
1425 catcher.subscribePattern("/patterns/KisPattern", std::bind(&KisAslLayerStyleSerializer::registerPatternObject, this, _1, _2));
1426
1427 //KisAslObjectCatcher c2;
1428 KisAslXmlParser parser;
1429 parser.parseXML(doc, catcher);
1430}

References KisAslXmlParser::parseXML(), registerPatternObject(), and KisAslCallbackObjectCatcher::subscribePattern().

◆ saveToDevice()

void KisAslLayerStyleSerializer::saveToDevice ( QIODevice & device)

Definition at line 787 of file kis_asl_layer_style_serializer.cpp.

788{
789 QDomDocument doc = formXmlDocument();
790 KIS_ASSERT(!doc.isNull());
791
792 KisAslWriter writer;
793 writer.writeFile(device, doc);
794}
void writeFile(QIODevice &device, const QDomDocument &doc)
#define KIS_ASSERT(cond)
Definition kis_assert.h:33

References formXmlDocument(), KIS_ASSERT, and KisAslWriter::writeFile().

◆ saveToFile()

bool KisAslLayerStyleSerializer::saveToFile ( const QString & filename)

Definition at line 796 of file kis_asl_layer_style_serializer.cpp.

797{
798 QFile file(filename);
799
800 if (!file.open(QIODevice::WriteOnly)) {
801 dbgKrita << "Can't open file " << filename;
802 return false;
803 }
804 saveToDevice(file);
805 file.close();
806
807 return true;
808}

References dbgKrita, and saveToDevice().

◆ setStyles()

void KisAslLayerStyleSerializer::setStyles ( const QVector< KisPSDLayerStyleSP > & styles)

Definition at line 59 of file kis_asl_layer_style_serializer.cpp.

60{
62 Q_FOREACH(const KisPSDLayerStyleSP style, styles) {
63 m_stylesHash.insert(style->psdUuid(), style);
64 }
65 m_initialized = true;
66}
QHash< QString, KisPSDLayerStyleSP > m_stylesHash

References m_initialized, m_stylesHash, m_stylesVector, and styles().

◆ sideLoadLinkedResources()

void KisAslLayerStyleSerializer::sideLoadLinkedResources ( KisPSDLayerStyle * style,
KisResourcesInterfaceSP resourcesInterface )
static

Definition at line 1301 of file kis_asl_layer_style_serializer.cpp.

1303{
1304 const QList<KoResourceLoadResult> linkedResources = style->linkedResources(resourcesInterface);
1305 QList<KoEmbeddedResource> sideLoadedResourcesStorage;
1306 Q_FOREACH (const KoResourceLoadResult &res, linkedResources) {
1308 qWarning() << "WARNING: failed to load layer style's embedded resource into the database"
1309 << res.signature();
1310 continue;
1311 }
1312
1313 QBuffer buffer;
1314 buffer.open(QIODevice::WriteOnly);
1315 bool result = res.resource()->saveToDevice(&buffer);
1316 buffer.close();
1317 KIS_SAFE_ASSERT_RECOVER(result) { continue; }
1318 KIS_SAFE_ASSERT_RECOVER(res.resource()->md5Sum() == KoMD5Generator::generateHash(buffer.data())) { continue; }
1319
1320 sideLoadedResourcesStorage.append(KoEmbeddedResource(res.signature(), buffer.data()));
1321 }
1322 style->setSideLoadedResources(sideLoadedResourcesStorage);
1323}
static QString generateHash(const QString &filename)
generateHash reads the given file and generates a hex-encoded md5sum for the file.
KoResourceSP resource() const noexcept
KoResourceSignature signature() const
#define KIS_SAFE_ASSERT_RECOVER(cond)
Definition kis_assert.h:126
QList< KoResourceLoadResult > linkedResources(KisResourcesInterfaceSP globalResourcesInterface) const override
void setSideLoadedResources(const QList< KoEmbeddedResource > &value)

References KoResourceLoadResult::ExistingResource, KoMD5Generator::generateHash(), KIS_SAFE_ASSERT_RECOVER, KisPSDLayerStyle::linkedResources(), KoResourceLoadResult::resource(), KisPSDLayerStyle::setSideLoadedResources(), KoResourceLoadResult::signature(), and KoResourceLoadResult::type().

◆ styles()

QVector< KisPSDLayerStyleSP > KisAslLayerStyleSerializer::styles ( ) const

Definition at line 54 of file kis_asl_layer_style_serializer.cpp.

55{
56 return m_stylesVector;
57}

References m_stylesVector.

◆ stylesHash()

QHash< QString, KisPSDLayerStyleSP > KisAslLayerStyleSerializer::stylesHash ( )

Definition at line 78 of file kis_asl_layer_style_serializer.cpp.

79{
80 if (m_stylesHash.count() == 0 && m_stylesVector.count() != 0) {
81 // build the hash
82 Q_FOREACH(KisPSDLayerStyleSP style, m_stylesVector) {
83 m_stylesHash.insert(style->psdUuid(), style);
84 }
85 }
86 return m_stylesHash;
87}

References m_stylesHash, and m_stylesVector.

Member Data Documentation

◆ m_catcher

KisAslCallbackObjectCatcher KisAslLayerStyleSerializer::m_catcher
private

Definition at line 74 of file kis_asl_layer_style_serializer.h.

◆ m_gradientsStore

QVector<KoAbstractGradientSP> KisAslLayerStyleSerializer::m_gradientsStore
private

Definition at line 76 of file kis_asl_layer_style_serializer.h.

◆ m_initialized

bool KisAslLayerStyleSerializer::m_initialized {false}
private

Definition at line 78 of file kis_asl_layer_style_serializer.h.

78{false};

◆ m_isValid

bool KisAslLayerStyleSerializer::m_isValid {true}
private

Definition at line 79 of file kis_asl_layer_style_serializer.h.

79{true};

◆ m_localResourcesInterface

QSharedPointer<KisLocalStrokeResources> KisAslLayerStyleSerializer::m_localResourcesInterface
private

Definition at line 80 of file kis_asl_layer_style_serializer.h.

◆ m_patternsStore

QHash<QString, KoPatternSP> KisAslLayerStyleSerializer::m_patternsStore
private

Definition at line 72 of file kis_asl_layer_style_serializer.h.

◆ m_stylesHash

QHash<QString, KisPSDLayerStyleSP> KisAslLayerStyleSerializer::m_stylesHash
private

Definition at line 77 of file kis_asl_layer_style_serializer.h.

◆ m_stylesVector

QVector<KisPSDLayerStyleSP> KisAslLayerStyleSerializer::m_stylesVector
private

Definition at line 75 of file kis_asl_layer_style_serializer.h.


The documentation for this class was generated from the following files: