Version 7.6.3.2-android, tag libreoffice-7.6.3.2-android
[LibreOffice.git] / oox / source / drawingml / texteffectscontext.cxx
blob0e33a4c3c13b8ad81f9edcf4165a5b482d885793
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 */
11 #include <drawingml/texteffectscontext.hxx>
12 #include <oox/helper/attributelist.hxx>
13 #include <oox/token/namespaces.hxx>
15 #include <map>
17 namespace oox::drawingml {
19 namespace
22 OUString const & lclGetNameForElementId(sal_uInt32 aId)
24 static std::map<sal_uInt32, OUString> const aIdMap
26 { OOX_TOKEN(w14, srgbClr) , "srgbClr" },
27 { OOX_TOKEN(w14, schemeClr) , "schemeClr" },
28 { OOX_TOKEN(w14, tint) , "tint" },
29 { OOX_TOKEN(w14, shade) , "shade" },
30 { OOX_TOKEN(w14, alpha) , "alpha" },
31 { OOX_TOKEN(w14, hueMod) , "hueMod" },
32 { OOX_TOKEN(w14, sat) , "sat" },
33 { OOX_TOKEN(w14, satOff) , "satOff" },
34 { OOX_TOKEN(w14, satMod) , "satMod" },
35 { OOX_TOKEN(w14, lum) , "lum" },
36 { OOX_TOKEN(w14, lumOff) , "lumOff" },
37 { OOX_TOKEN(w14, lumMod) , "lumMod" },
38 { OOX_TOKEN(w14, noFill) , "noFill" },
39 { OOX_TOKEN(w14, solidFill) , "solidFill" },
40 { OOX_TOKEN(w14, gradFill) , "gradFill" },
41 { OOX_TOKEN(w14, gsLst) , "gsLst" },
42 { OOX_TOKEN(w14, gs) , "gs" },
43 { OOX_TOKEN(w14, pos) , "pos" },
44 { OOX_TOKEN(w14, lin) , "lin" },
45 { OOX_TOKEN(w14, path) , "path" },
46 { OOX_TOKEN(w14, fillToRect) , "fillToRect" },
47 { OOX_TOKEN(w14, prstDash) , "prstDash" },
48 { OOX_TOKEN(w14, round) , "round" },
49 { OOX_TOKEN(w14, bevel) , "bevel" },
50 { OOX_TOKEN(w14, miter) , "miter" },
51 { OOX_TOKEN(w14, camera) , "camera" },
52 { OOX_TOKEN(w14, lightRig) , "lightRig" },
53 { OOX_TOKEN(w14, rot) , "rot" },
54 { OOX_TOKEN(w14, bevelT) , "bevelT" },
55 { OOX_TOKEN(w14, bevelB) , "bevelB" },
56 { OOX_TOKEN(w14, extrusionClr) , "extrusionClr" },
57 { OOX_TOKEN(w14, contourClr) , "contourClr"} ,
58 { OOX_TOKEN(w14, styleSet) , "styleSet" },
60 { OOX_TOKEN(w14, glow) , "glow" },
61 { OOX_TOKEN(w14, shadow) , "shadow" },
62 { OOX_TOKEN(w14, reflection) , "reflection" },
63 { OOX_TOKEN(w14, textOutline) , "textOutline" },
64 { OOX_TOKEN(w14, textFill) , "textFill" },
65 { OOX_TOKEN(w14, scene3d) , "scene3d" },
66 { OOX_TOKEN(w14, props3d) , "props3d" },
67 { OOX_TOKEN(w14, ligatures) , "ligatures" },
68 { OOX_TOKEN(w14, numForm) , "numForm" },
69 { OOX_TOKEN(w14, numSpacing) , "numSpacing" },
70 { OOX_TOKEN(w14, stylisticSets), "stylisticSets" },
71 { OOX_TOKEN(w14, cntxtAlts) , "cntxtAlts" },
74 return aIdMap.find(aId)->second;
77 OUString const & lclGetGrabBagName(sal_uInt32 aId)
79 static std::map<sal_uInt32, OUString> const aGrabBagNameMap
81 { OOX_TOKEN(w14, glow) , "CharGlowTextEffect" },
82 { OOX_TOKEN(w14, shadow) , "CharShadowTextEffect" },
83 { OOX_TOKEN(w14, reflection) , "CharReflectionTextEffect" },
84 { OOX_TOKEN(w14, textOutline) , "CharTextOutlineTextEffect" },
85 { OOX_TOKEN(w14, textFill) , "CharTextFillTextEffect" },
86 { OOX_TOKEN(w14, scene3d) , "CharScene3DTextEffect" },
87 { OOX_TOKEN(w14, props3d) , "CharProps3DTextEffect" },
88 { OOX_TOKEN(w14, ligatures) , "CharLigaturesTextEffect" },
89 { OOX_TOKEN(w14, numForm) , "CharNumFormTextEffect" },
90 { OOX_TOKEN(w14, numSpacing) , "CharNumSpacingTextEffect" },
91 { OOX_TOKEN(w14, stylisticSets), "CharStylisticSetsTextEffect" },
92 { OOX_TOKEN(w14, cntxtAlts) , "CharCntxtAltsTextEffect" },
95 return aGrabBagNameMap.find(aId)->second;
100 using namespace oox::core;
101 using namespace com::sun::star::uno;
102 using namespace com::sun::star::beans;
104 TextEffectsContext::TextEffectsContext(
105 ContextHandler2Helper const & rParent,
106 sal_Int32 aElementToken,
107 std::vector<PropertyValue>& rTextEffectsProperties)
108 : ContextHandler2(rParent)
109 , mrTextEffectsProperties(rTextEffectsProperties)
110 , mnCurrentElement(aElementToken)
114 TextEffectsContext::~TextEffectsContext()
118 void TextEffectsContext::pushAttributeToGrabBag (sal_Int32 aAttributeId, const OUString& rElementName, const AttributeList& rAttribs)
120 if (!rAttribs.hasAttribute(aAttributeId))
121 return;
122 OUString aString = rAttribs.getStringDefaulted(aAttributeId);
123 mpGrabBagStack->addString(rElementName, aString);
126 void TextEffectsContext::processAttributes(const AttributeList& rAttribs)
128 mpGrabBagStack->push("attributes");
129 switch(mnCurrentElement)
131 case OOX_TOKEN(w14, glow):
133 pushAttributeToGrabBag(OOX_TOKEN(w14, rad), "rad", rAttribs);
135 break;
136 case OOX_TOKEN(w14, srgbClr):
137 case OOX_TOKEN(w14, schemeClr):
138 case OOX_TOKEN(w14, tint):
139 case OOX_TOKEN(w14, shade):
140 case OOX_TOKEN(w14, alpha):
141 case OOX_TOKEN(w14, hueMod):
142 case OOX_TOKEN(w14, sat):
143 case OOX_TOKEN(w14, satOff):
144 case OOX_TOKEN(w14, satMod):
145 case OOX_TOKEN(w14, lum):
146 case OOX_TOKEN(w14, lumOff):
147 case OOX_TOKEN(w14, lumMod):
149 pushAttributeToGrabBag(OOX_TOKEN(w14, val), "val", rAttribs);
151 break;
152 case OOX_TOKEN(w14, shadow):
154 pushAttributeToGrabBag(OOX_TOKEN(w14, blurRad), "blurRad", rAttribs);
155 pushAttributeToGrabBag(OOX_TOKEN(w14, dist), "dist", rAttribs);
156 pushAttributeToGrabBag(OOX_TOKEN(w14, dir), "dir", rAttribs);
157 pushAttributeToGrabBag(OOX_TOKEN(w14, sx), "sx", rAttribs);
158 pushAttributeToGrabBag(OOX_TOKEN(w14, sy), "sy", rAttribs);
159 pushAttributeToGrabBag(OOX_TOKEN(w14, kx), "kx", rAttribs);
160 pushAttributeToGrabBag(OOX_TOKEN(w14, ky), "ky", rAttribs);
161 pushAttributeToGrabBag(OOX_TOKEN(w14, algn), "algn", rAttribs);
163 break;
164 case OOX_TOKEN(w14, reflection):
166 pushAttributeToGrabBag(OOX_TOKEN(w14, blurRad), "blurRad", rAttribs);
167 pushAttributeToGrabBag(OOX_TOKEN(w14, stA), "stA", rAttribs);
168 pushAttributeToGrabBag(OOX_TOKEN(w14, stPos), "stPos", rAttribs);
169 pushAttributeToGrabBag(OOX_TOKEN(w14, endA), "endA", rAttribs);
170 pushAttributeToGrabBag(OOX_TOKEN(w14, endPos), "endPos", rAttribs);
171 pushAttributeToGrabBag(OOX_TOKEN(w14, dist), "dist", rAttribs);
172 pushAttributeToGrabBag(OOX_TOKEN(w14, dir), "dir", rAttribs);
173 pushAttributeToGrabBag(OOX_TOKEN(w14, fadeDir), "fadeDir", rAttribs);
174 pushAttributeToGrabBag(OOX_TOKEN(w14, sx), "sx", rAttribs);
175 pushAttributeToGrabBag(OOX_TOKEN(w14, sy), "sy", rAttribs);
176 pushAttributeToGrabBag(OOX_TOKEN(w14, kx), "kx", rAttribs);
177 pushAttributeToGrabBag(OOX_TOKEN(w14, ky), "ky", rAttribs);
178 pushAttributeToGrabBag(OOX_TOKEN(w14, algn), "algn", rAttribs);
180 break;
181 case OOX_TOKEN(w14, textOutline):
183 pushAttributeToGrabBag(OOX_TOKEN(w14, w), "w", rAttribs);
184 pushAttributeToGrabBag(OOX_TOKEN(w14, cap), "cap", rAttribs);
185 pushAttributeToGrabBag(OOX_TOKEN(w14, cmpd), "cmpd", rAttribs);
186 pushAttributeToGrabBag(OOX_TOKEN(w14, algn), "algn", rAttribs);
188 break;
189 case OOX_TOKEN(w14, prstDash):
191 pushAttributeToGrabBag(OOX_TOKEN(w14, val), "val", rAttribs);
193 break;
194 case OOX_TOKEN(w14, gs):
196 pushAttributeToGrabBag(OOX_TOKEN(w14, pos), "pos", rAttribs);
198 break;
199 case OOX_TOKEN(w14, lin):
201 pushAttributeToGrabBag(OOX_TOKEN(w14, ang), "ang", rAttribs);
202 pushAttributeToGrabBag(OOX_TOKEN(w14, scaled), "scaled", rAttribs);
204 break;
205 case OOX_TOKEN(w14, path):
207 pushAttributeToGrabBag(OOX_TOKEN(w14, path), "path", rAttribs);
209 break;
210 case OOX_TOKEN(w14, fillToRect):
212 pushAttributeToGrabBag(OOX_TOKEN(w14, l), "l", rAttribs);
213 pushAttributeToGrabBag(OOX_TOKEN(w14, t), "t", rAttribs);
214 pushAttributeToGrabBag(OOX_TOKEN(w14, r), "r", rAttribs);
215 pushAttributeToGrabBag(OOX_TOKEN(w14, b), "b", rAttribs);
217 break;
218 case OOX_TOKEN(w14, miter):
220 pushAttributeToGrabBag(OOX_TOKEN(w14, lim), "lim", rAttribs);
222 break;
223 case OOX_TOKEN(w14, camera):
225 pushAttributeToGrabBag(OOX_TOKEN(w14, prst), "prst", rAttribs);
227 break;
228 case OOX_TOKEN(w14, lightRig):
230 pushAttributeToGrabBag(OOX_TOKEN(w14, rig), "rig", rAttribs);
231 pushAttributeToGrabBag(OOX_TOKEN(w14, dir), "dir", rAttribs);
233 break;
234 case OOX_TOKEN(w14, rot):
236 pushAttributeToGrabBag(OOX_TOKEN(w14, lat), "lat", rAttribs);
237 pushAttributeToGrabBag(OOX_TOKEN(w14, lon), "lon", rAttribs);
238 pushAttributeToGrabBag(OOX_TOKEN(w14, rev), "rev", rAttribs);
240 break;
241 case OOX_TOKEN(w14, props3d):
243 pushAttributeToGrabBag(OOX_TOKEN(w14, extrusionH), "extrusionH", rAttribs);
244 pushAttributeToGrabBag(OOX_TOKEN(w14, contourW), "contourW", rAttribs);
245 pushAttributeToGrabBag(OOX_TOKEN(w14, prstMaterial), "prstMaterial", rAttribs);
247 break;
248 case OOX_TOKEN(w14, bevelT):
249 case OOX_TOKEN(w14, bevelB):
251 pushAttributeToGrabBag(OOX_TOKEN(w14, w), "w", rAttribs);
252 pushAttributeToGrabBag(OOX_TOKEN(w14, h), "h", rAttribs);
253 pushAttributeToGrabBag(OOX_TOKEN(w14, prst), "prst", rAttribs);
255 break;
256 case OOX_TOKEN(w14, ligatures):
257 case OOX_TOKEN(w14, numForm):
258 case OOX_TOKEN(w14, numSpacing):
260 pushAttributeToGrabBag(OOX_TOKEN(w14, val), "val", rAttribs);
262 break;
263 case OOX_TOKEN(w14, styleSet):
265 pushAttributeToGrabBag(OOX_TOKEN(w14, id), "id", rAttribs);
266 pushAttributeToGrabBag(OOX_TOKEN(w14, val), "val", rAttribs);
268 break;
269 case OOX_TOKEN(w14, cntxtAlts):
271 pushAttributeToGrabBag(OOX_TOKEN(w14, val), "val", rAttribs);
273 break;
274 default:
275 break;
278 mpGrabBagStack->pop();
281 void TextEffectsContext::onStartElement(const oox::AttributeList& rAttribs)
283 if (mpGrabBagStack == nullptr)
285 OUString aGrabBagName = lclGetGrabBagName(mnCurrentElement);
286 mpGrabBagStack.reset(new GrabBagStack(aGrabBagName));
289 OUString aElementName = lclGetNameForElementId(mnCurrentElement);
290 mpGrabBagStack->push(aElementName);
291 processAttributes(rAttribs);
294 void TextEffectsContext::onEndElement()
296 mpGrabBagStack->pop();
298 if (mpGrabBagStack->isStackEmpty())
300 Sequence<PropertyValue> aSeq;
301 PropertyValue aPropertyValue = mpGrabBagStack->getRootProperty();
302 aPropertyValue.Value >>= aSeq;
303 aPropertyValue.Value <<= aSeq[0];
305 mrTextEffectsProperties.push_back(aPropertyValue);
310 ContextHandlerRef TextEffectsContext::onCreateContext(sal_Int32 aElementToken, const AttributeList& /*rAttribs*/)
312 mnCurrentElement = aElementToken;
313 return this;
318 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */