Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
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/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "xexptran.hxx"
21 : #include <tools/debug.hxx>
22 : #include <rtl/ustrbuf.hxx>
23 : #include <sax/tools/converter.hxx>
24 : #include <xmloff/xmluconv.hxx>
25 : #include <xmloff/xmlexp.hxx>
26 : #include <xmloff/xmlimp.hxx>
27 : #include <tools/helpers.hxx>
28 : #include <basegfx/vector/b2dvector.hxx>
29 : #include <basegfx/matrix/b2dhommatrix.hxx>
30 : #include <basegfx/tuple/b3dtuple.hxx>
31 : #include <basegfx/matrix/b3dhommatrix.hxx>
32 : #include <basegfx/numeric/ftools.hxx>
33 : #include <basegfx/polygon/b2dpolypolygon.hxx>
34 : #include <basegfx/polygon/b2dpolypolygontools.hxx>
35 : #include <basegfx/tools/unotools.hxx>
36 :
37 : using namespace ::com::sun::star;
38 :
39 : // parsing help functions for simple chars
40 0 : void Imp_SkipSpaces(const OUString& rStr, sal_Int32& rPos, const sal_Int32 nLen)
41 : {
42 0 : while(rPos < nLen
43 0 : && ' ' == rStr[rPos])
44 0 : rPos++;
45 0 : }
46 :
47 0 : void Imp_SkipSpacesAndOpeningBraces(const OUString& rStr, sal_Int32& rPos, const sal_Int32 nLen)
48 : {
49 0 : while(rPos < nLen
50 0 : && (' ' == rStr[rPos] || '(' == rStr[rPos]))
51 0 : rPos++;
52 0 : }
53 :
54 0 : void Imp_SkipSpacesAndCommas(const OUString& rStr, sal_Int32& rPos, const sal_Int32 nLen)
55 : {
56 0 : while(rPos < nLen
57 0 : && (' ' == rStr[rPos] || ',' == rStr[rPos]))
58 0 : rPos++;
59 0 : }
60 :
61 0 : void Imp_SkipSpacesAndClosingBraces(const OUString& rStr, sal_Int32& rPos, const sal_Int32 nLen)
62 : {
63 0 : while(rPos < nLen
64 0 : && (' ' == rStr[rPos] || ')' == rStr[rPos]))
65 0 : rPos++;
66 0 : }
67 :
68 : // parsing help functions for integer numbers
69 :
70 0 : bool Imp_IsOnUnitChar(const OUString& rStr, const sal_Int32 nPos)
71 : {
72 0 : sal_Unicode aChar(rStr[nPos]);
73 :
74 0 : if(('a' <= aChar && 'z' >= aChar)
75 0 : || ('A' <= aChar && 'Z' >= aChar)
76 0 : || '%' == aChar
77 : )
78 0 : return true;
79 0 : return false;
80 : }
81 :
82 0 : double Imp_GetDoubleChar(const OUString& rStr, sal_Int32& rPos, const sal_Int32 nLen,
83 : const SvXMLUnitConverter& rConv, double fRetval, bool bLookForUnits = false)
84 : {
85 0 : sal_Unicode aChar(rStr[rPos]);
86 0 : OUStringBuffer sNumberString;
87 :
88 0 : if('+' == aChar || '-' == aChar)
89 : {
90 0 : sNumberString.append(rStr[rPos]);
91 0 : ++rPos;
92 0 : aChar = rPos >= nLen ? 0 : rStr[rPos];
93 : }
94 :
95 0 : while(('0' <= aChar && '9' >= aChar)
96 0 : || '.' == aChar)
97 : {
98 0 : sNumberString.append(rStr[rPos]);
99 0 : ++rPos;
100 0 : aChar = rPos >= nLen ? 0 : rStr[rPos];
101 : }
102 :
103 0 : if('e' == aChar || 'E' == aChar)
104 : {
105 0 : sNumberString.append(rStr[rPos]);
106 0 : ++rPos;
107 0 : aChar = rPos >= nLen ? 0 : rStr[rPos];
108 :
109 0 : if('+' == aChar || '-' == aChar)
110 : {
111 0 : sNumberString.append(rStr[rPos]);
112 0 : ++rPos;
113 0 : aChar = rPos >= nLen ? 0 : rStr[rPos];
114 : }
115 :
116 0 : while('0' <= aChar && '9' >= aChar)
117 : {
118 0 : sNumberString.append(rStr[rPos]);
119 0 : ++rPos;
120 0 : aChar = rPos >= nLen ? 0 : rStr[rPos];
121 : }
122 : }
123 :
124 0 : if(bLookForUnits)
125 : {
126 0 : Imp_SkipSpaces(rStr, rPos, nLen);
127 0 : while(rPos < nLen && Imp_IsOnUnitChar(rStr, rPos))
128 0 : sNumberString.append(rStr[rPos++]);
129 : }
130 :
131 0 : if(!sNumberString.isEmpty())
132 : {
133 0 : if(bLookForUnits)
134 0 : rConv.convertDouble(fRetval, sNumberString.makeStringAndClear(), true);
135 : else
136 : {
137 : ::sax::Converter::convertDouble(fRetval,
138 0 : sNumberString.makeStringAndClear());
139 : }
140 : }
141 :
142 0 : return fRetval;
143 : }
144 :
145 0 : void Imp_PutDoubleChar(OUString& rStr, double fValue)
146 : {
147 0 : OUStringBuffer sStringBuffer;
148 0 : ::sax::Converter::convertDouble(sStringBuffer, fValue);
149 0 : rStr += OUString(sStringBuffer.makeStringAndClear());
150 0 : }
151 :
152 0 : void Imp_PutDoubleChar(OUString& rStr, const SvXMLUnitConverter& rConv, double fValue,
153 : bool bConvertUnits = false)
154 : {
155 0 : OUStringBuffer sStringBuffer;
156 :
157 0 : if(bConvertUnits)
158 0 : rConv.convertDouble(sStringBuffer, fValue, true);
159 : else
160 : {
161 0 : ::sax::Converter::convertDouble(sStringBuffer, fValue);
162 : }
163 :
164 0 : rStr += OUString(sStringBuffer.makeStringAndClear());
165 0 : }
166 :
167 : // base class of all 2D transform objects
168 :
169 : struct ImpSdXMLExpTransObj2DBase
170 : {
171 : sal_uInt16 mnType;
172 0 : ImpSdXMLExpTransObj2DBase(sal_uInt16 nType)
173 0 : : mnType(nType) {}
174 : };
175 :
176 : // possible object types for 2D
177 :
178 : #define IMP_SDXMLEXP_TRANSOBJ2D_ROTATE 0x0000
179 : #define IMP_SDXMLEXP_TRANSOBJ2D_SCALE 0x0001
180 : #define IMP_SDXMLEXP_TRANSOBJ2D_TRANSLATE 0x0002
181 : #define IMP_SDXMLEXP_TRANSOBJ2D_SKEWX 0x0003
182 : #define IMP_SDXMLEXP_TRANSOBJ2D_SKEWY 0x0004
183 : #define IMP_SDXMLEXP_TRANSOBJ2D_MATRIX 0x0005
184 :
185 : // classes of objects, different sizes
186 :
187 : struct ImpSdXMLExpTransObj2DRotate : public ImpSdXMLExpTransObj2DBase
188 : {
189 : double mfRotate;
190 0 : ImpSdXMLExpTransObj2DRotate(double fVal)
191 0 : : ImpSdXMLExpTransObj2DBase(IMP_SDXMLEXP_TRANSOBJ2D_ROTATE), mfRotate(fVal) {}
192 : };
193 0 : struct ImpSdXMLExpTransObj2DScale : public ImpSdXMLExpTransObj2DBase
194 : {
195 : ::basegfx::B2DTuple maScale;
196 0 : ImpSdXMLExpTransObj2DScale(const ::basegfx::B2DTuple& rNew)
197 0 : : ImpSdXMLExpTransObj2DBase(IMP_SDXMLEXP_TRANSOBJ2D_SCALE), maScale(rNew) {}
198 : };
199 0 : struct ImpSdXMLExpTransObj2DTranslate : public ImpSdXMLExpTransObj2DBase
200 : {
201 : ::basegfx::B2DTuple maTranslate;
202 0 : ImpSdXMLExpTransObj2DTranslate(const ::basegfx::B2DTuple& rNew)
203 0 : : ImpSdXMLExpTransObj2DBase(IMP_SDXMLEXP_TRANSOBJ2D_TRANSLATE), maTranslate(rNew) {}
204 : };
205 : struct ImpSdXMLExpTransObj2DSkewX : public ImpSdXMLExpTransObj2DBase
206 : {
207 : double mfSkewX;
208 0 : ImpSdXMLExpTransObj2DSkewX(double fVal)
209 0 : : ImpSdXMLExpTransObj2DBase(IMP_SDXMLEXP_TRANSOBJ2D_SKEWX), mfSkewX(fVal) {}
210 : };
211 : struct ImpSdXMLExpTransObj2DSkewY : public ImpSdXMLExpTransObj2DBase
212 : {
213 : double mfSkewY;
214 0 : ImpSdXMLExpTransObj2DSkewY(double fVal)
215 0 : : ImpSdXMLExpTransObj2DBase(IMP_SDXMLEXP_TRANSOBJ2D_SKEWY), mfSkewY(fVal) {}
216 : };
217 0 : struct ImpSdXMLExpTransObj2DMatrix : public ImpSdXMLExpTransObj2DBase
218 : {
219 : ::basegfx::B2DHomMatrix maMatrix;
220 0 : ImpSdXMLExpTransObj2DMatrix(const ::basegfx::B2DHomMatrix& rNew)
221 0 : : ImpSdXMLExpTransObj2DBase(IMP_SDXMLEXP_TRANSOBJ2D_MATRIX), maMatrix(rNew) {}
222 : };
223 :
224 : // delete all entries in list
225 :
226 0 : void SdXMLImExTransform2D::EmptyList()
227 : {
228 0 : const sal_uInt32 nCount = maList.size();
229 0 : for(sal_uInt32 a(0L); a < nCount; a++)
230 : {
231 0 : ImpSdXMLExpTransObj2DBase* pObj = maList[a];
232 :
233 0 : switch(pObj->mnType)
234 : {
235 : case IMP_SDXMLEXP_TRANSOBJ2D_ROTATE :
236 : {
237 0 : delete (ImpSdXMLExpTransObj2DRotate*)pObj;
238 0 : break;
239 : }
240 : case IMP_SDXMLEXP_TRANSOBJ2D_SCALE :
241 : {
242 0 : delete (ImpSdXMLExpTransObj2DScale*)pObj;
243 0 : break;
244 : }
245 : case IMP_SDXMLEXP_TRANSOBJ2D_TRANSLATE :
246 : {
247 0 : delete (ImpSdXMLExpTransObj2DTranslate*)pObj;
248 0 : break;
249 : }
250 : case IMP_SDXMLEXP_TRANSOBJ2D_SKEWX :
251 : {
252 0 : delete (ImpSdXMLExpTransObj2DSkewX*)pObj;
253 0 : break;
254 : }
255 : case IMP_SDXMLEXP_TRANSOBJ2D_SKEWY :
256 : {
257 0 : delete (ImpSdXMLExpTransObj2DSkewY*)pObj;
258 0 : break;
259 : }
260 : case IMP_SDXMLEXP_TRANSOBJ2D_MATRIX :
261 : {
262 0 : delete (ImpSdXMLExpTransObj2DMatrix*)pObj;
263 0 : break;
264 : }
265 : default :
266 : {
267 : OSL_FAIL("SdXMLImExTransform2D: impossible entry!");
268 0 : break;
269 : }
270 : }
271 : }
272 :
273 0 : maList.clear();
274 0 : }
275 :
276 : // add members
277 :
278 0 : void SdXMLImExTransform2D::AddRotate(double fNew)
279 : {
280 0 : if(fNew != 0.0)
281 0 : maList.push_back(new ImpSdXMLExpTransObj2DRotate(fNew));
282 0 : }
283 :
284 0 : void SdXMLImExTransform2D::AddTranslate(const ::basegfx::B2DTuple& rNew)
285 : {
286 0 : if(!rNew.equalZero())
287 0 : maList.push_back(new ImpSdXMLExpTransObj2DTranslate(rNew));
288 0 : }
289 :
290 0 : void SdXMLImExTransform2D::AddSkewX(double fNew)
291 : {
292 0 : if(fNew != 0.0)
293 0 : maList.push_back(new ImpSdXMLExpTransObj2DSkewX(fNew));
294 0 : }
295 :
296 : // gen string for export
297 0 : const OUString& SdXMLImExTransform2D::GetExportString(const SvXMLUnitConverter& rConv)
298 : {
299 0 : OUString aNewString;
300 0 : OUString aClosingBrace(")");
301 0 : OUString aEmptySpace(" ");
302 :
303 0 : const sal_uInt32 nCount = maList.size();
304 0 : for(sal_uInt32 a(0L); a < nCount; a++)
305 : {
306 0 : ImpSdXMLExpTransObj2DBase* pObj = maList[a];
307 0 : switch(pObj->mnType)
308 : {
309 : case IMP_SDXMLEXP_TRANSOBJ2D_ROTATE :
310 : {
311 0 : aNewString += "rotate (";
312 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj2DRotate*)pObj)->mfRotate);
313 0 : aNewString += aClosingBrace;
314 0 : break;
315 : }
316 : case IMP_SDXMLEXP_TRANSOBJ2D_SCALE :
317 : {
318 0 : aNewString += "scale (";
319 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj2DScale*)pObj)->maScale.getX());
320 0 : aNewString += aEmptySpace;
321 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj2DScale*)pObj)->maScale.getY());
322 0 : aNewString += aClosingBrace;
323 0 : break;
324 : }
325 : case IMP_SDXMLEXP_TRANSOBJ2D_TRANSLATE :
326 : {
327 0 : aNewString += "translate (";
328 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj2DTranslate*)pObj)->maTranslate.getX(), true);
329 0 : aNewString += aEmptySpace;
330 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj2DTranslate*)pObj)->maTranslate.getY(), true);
331 0 : aNewString += aClosingBrace;
332 0 : break;
333 : }
334 : case IMP_SDXMLEXP_TRANSOBJ2D_SKEWX :
335 : {
336 0 : aNewString += "skewX (";
337 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj2DSkewX*)pObj)->mfSkewX);
338 0 : aNewString += aClosingBrace;
339 0 : break;
340 : }
341 : case IMP_SDXMLEXP_TRANSOBJ2D_SKEWY :
342 : {
343 0 : aNewString += "skewY (";
344 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj2DSkewY*)pObj)->mfSkewY);
345 0 : aNewString += aClosingBrace;
346 0 : break;
347 : }
348 : case IMP_SDXMLEXP_TRANSOBJ2D_MATRIX :
349 : {
350 0 : aNewString += "matrix (";
351 :
352 : // a
353 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj2DMatrix*)pObj)->maMatrix.get(0, 0));
354 0 : aNewString += aEmptySpace;
355 :
356 : // b
357 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj2DMatrix*)pObj)->maMatrix.get(1, 0));
358 0 : aNewString += aEmptySpace;
359 :
360 : // c
361 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj2DMatrix*)pObj)->maMatrix.get(0, 1));
362 0 : aNewString += aEmptySpace;
363 :
364 : // d
365 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj2DMatrix*)pObj)->maMatrix.get(1, 1));
366 0 : aNewString += aEmptySpace;
367 :
368 : // e
369 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj2DMatrix*)pObj)->maMatrix.get(0, 2), true);
370 0 : aNewString += aEmptySpace;
371 :
372 : // f
373 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj2DMatrix*)pObj)->maMatrix.get(1, 2), true);
374 :
375 0 : aNewString += aClosingBrace;
376 0 : break;
377 : }
378 : default :
379 : {
380 : OSL_FAIL("SdXMLImExTransform2D: impossible entry!");
381 0 : break;
382 : }
383 : }
384 :
385 : // if not the last entry, add one space to next tag
386 0 : if(a + 1UL != maList.size())
387 : {
388 0 : aNewString += aEmptySpace;
389 : }
390 : }
391 :
392 : // fill string form OUString
393 0 : msString = aNewString;
394 :
395 0 : return msString;
396 : }
397 :
398 : // sets new string, parses it and generates entries
399 0 : void SdXMLImExTransform2D::SetString(const OUString& rNew, const SvXMLUnitConverter& rConv)
400 : {
401 0 : msString = rNew;
402 0 : EmptyList();
403 :
404 0 : if(!msString.isEmpty())
405 : {
406 0 : const OUString aStr(msString.getStr(), (sal_uInt16)msString.getLength());
407 0 : const sal_Int32 nLen(aStr.getLength());
408 :
409 0 : const OUString aString_rotate( "rotate" );
410 0 : const OUString aString_scale( "scale" );
411 0 : const OUString aString_translate( "translate" );
412 0 : const OUString aString_skewX( "skewX" );
413 0 : const OUString aString_skewY( "skewY" );
414 0 : const OUString aString_matrix( "matrix" );
415 :
416 0 : sal_Int32 nPos(0);
417 :
418 0 : while(nPos < nLen)
419 : {
420 : // skip spaces
421 0 : Imp_SkipSpaces(aStr, nPos, nLen);
422 :
423 : // look for tag
424 0 : if(nPos < nLen)
425 : {
426 0 : if(nPos == aStr.indexOf(aString_rotate, nPos))
427 : {
428 0 : double fValue(0.0);
429 0 : nPos += 6;
430 0 : Imp_SkipSpacesAndOpeningBraces(aStr, nPos, nLen);
431 0 : fValue = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, fValue);
432 0 : if(fValue != 0.0)
433 0 : maList.push_back(new ImpSdXMLExpTransObj2DRotate(fValue));
434 :
435 0 : Imp_SkipSpacesAndClosingBraces(aStr, nPos, nLen);
436 : }
437 0 : else if(nPos == aStr.indexOf(aString_scale, nPos))
438 : {
439 0 : ::basegfx::B2DTuple aValue(1.0, 1.0);
440 0 : nPos += 5;
441 0 : Imp_SkipSpacesAndOpeningBraces(aStr, nPos, nLen);
442 0 : aValue.setX(Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.getX()));
443 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
444 0 : aValue.setY(Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.getY()));
445 :
446 0 : if(aValue.getX() != 1.0 || aValue.getY() != 1.0)
447 0 : maList.push_back(new ImpSdXMLExpTransObj2DScale(aValue));
448 :
449 0 : Imp_SkipSpacesAndClosingBraces(aStr, nPos, nLen);
450 : }
451 0 : else if(nPos == aStr.indexOf(aString_translate, nPos))
452 : {
453 0 : ::basegfx::B2DTuple aValue;
454 0 : nPos += 9;
455 0 : Imp_SkipSpacesAndOpeningBraces(aStr, nPos, nLen);
456 0 : aValue.setX(Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.getX(), true));
457 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
458 0 : aValue.setY(Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.getY(), true));
459 :
460 0 : if(!aValue.equalZero())
461 0 : maList.push_back(new ImpSdXMLExpTransObj2DTranslate(aValue));
462 :
463 0 : Imp_SkipSpacesAndClosingBraces(aStr, nPos, nLen);
464 : }
465 0 : else if(nPos == aStr.indexOf(aString_skewX, nPos))
466 : {
467 0 : double fValue(0.0);
468 0 : nPos += 5;
469 0 : Imp_SkipSpacesAndOpeningBraces(aStr, nPos, nLen);
470 0 : fValue = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, fValue);
471 0 : if(fValue != 0.0)
472 0 : maList.push_back(new ImpSdXMLExpTransObj2DSkewX(fValue));
473 :
474 0 : Imp_SkipSpacesAndClosingBraces(aStr, nPos, nLen);
475 : }
476 0 : else if(nPos == aStr.indexOf(aString_skewY, nPos))
477 : {
478 0 : double fValue(0.0);
479 0 : nPos += 5;
480 0 : Imp_SkipSpacesAndOpeningBraces(aStr, nPos, nLen);
481 0 : fValue = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, fValue);
482 0 : if(fValue != 0.0)
483 0 : maList.push_back(new ImpSdXMLExpTransObj2DSkewY(fValue));
484 :
485 0 : Imp_SkipSpacesAndClosingBraces(aStr, nPos, nLen);
486 : }
487 0 : else if(nPos == aStr.indexOf(aString_matrix, nPos))
488 : {
489 0 : ::basegfx::B2DHomMatrix aValue;
490 :
491 0 : nPos += 6;
492 0 : Imp_SkipSpacesAndOpeningBraces(aStr, nPos, nLen);
493 :
494 : // a
495 0 : aValue.set(0, 0, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(0, 0)));
496 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
497 :
498 : // b
499 0 : aValue.set(1, 0, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(1, 0)));
500 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
501 :
502 : // c
503 0 : aValue.set(0, 1, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(0, 1)));
504 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
505 :
506 : // d
507 0 : aValue.set(1, 1, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(1, 1)));
508 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
509 :
510 : // e
511 0 : aValue.set(0, 2, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(0, 2), true));
512 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
513 :
514 : // f
515 0 : aValue.set(1, 2, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(1, 2), true));
516 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
517 :
518 0 : if(!aValue.isIdentity())
519 0 : maList.push_back(new ImpSdXMLExpTransObj2DMatrix(aValue));
520 :
521 0 : Imp_SkipSpacesAndClosingBraces(aStr, nPos, nLen);
522 : }
523 : else
524 : {
525 0 : nPos++;
526 : }
527 : }
528 0 : }
529 : }
530 0 : }
531 :
532 0 : void SdXMLImExTransform2D::GetFullTransform(::basegfx::B2DHomMatrix& rFullTrans)
533 : {
534 0 : rFullTrans.identity();
535 :
536 0 : const sal_uInt32 nCount = maList.size();
537 0 : for(sal_uInt32 a(0L); a < nCount; a++)
538 : {
539 0 : ImpSdXMLExpTransObj2DBase* pObj = maList[a];
540 0 : switch(pObj->mnType)
541 : {
542 : case IMP_SDXMLEXP_TRANSOBJ2D_ROTATE :
543 : {
544 : // #i78696#
545 : // mfRotate is mathematically wrong oriented since we export/import the angle
546 : // values mirrored. This error is fixed in the API, but not yet in the FileFormat.
547 : // For the FileFormat there is a follow-up task (#i78698#) to fix this in the next
548 : // ODF FileFormat version. For now - to emulate the old behaviour - it is necessary
549 : // to mirror the value here
550 0 : rFullTrans.rotate(((ImpSdXMLExpTransObj2DRotate*)pObj)->mfRotate * -1.0);
551 0 : break;
552 : }
553 : case IMP_SDXMLEXP_TRANSOBJ2D_SCALE :
554 : {
555 0 : const ::basegfx::B2DTuple& rScale = ((ImpSdXMLExpTransObj2DScale*)pObj)->maScale;
556 0 : rFullTrans.scale(rScale.getX(), rScale.getY());
557 0 : break;
558 : }
559 : case IMP_SDXMLEXP_TRANSOBJ2D_TRANSLATE :
560 : {
561 0 : const ::basegfx::B2DTuple& rTranslate = ((ImpSdXMLExpTransObj2DTranslate*)pObj)->maTranslate;
562 0 : rFullTrans.translate(rTranslate.getX(), rTranslate.getY());
563 0 : break;
564 : }
565 : case IMP_SDXMLEXP_TRANSOBJ2D_SKEWX :
566 : {
567 0 : rFullTrans.shearX(tan(((ImpSdXMLExpTransObj2DSkewX*)pObj)->mfSkewX));
568 0 : break;
569 : }
570 : case IMP_SDXMLEXP_TRANSOBJ2D_SKEWY :
571 : {
572 0 : rFullTrans.shearY(tan(((ImpSdXMLExpTransObj2DSkewY*)pObj)->mfSkewY));
573 0 : break;
574 : }
575 : case IMP_SDXMLEXP_TRANSOBJ2D_MATRIX :
576 : {
577 0 : rFullTrans *= ((ImpSdXMLExpTransObj2DMatrix*)pObj)->maMatrix;
578 0 : break;
579 : }
580 : default :
581 : {
582 : OSL_FAIL("SdXMLImExTransform2D: impossible entry!");
583 0 : break;
584 : }
585 : }
586 : }
587 0 : }
588 :
589 : // base class of all 3D transform objects
590 :
591 : struct ImpSdXMLExpTransObj3DBase
592 : {
593 : sal_uInt16 mnType;
594 0 : ImpSdXMLExpTransObj3DBase(sal_uInt16 nType)
595 0 : : mnType(nType) {}
596 : };
597 :
598 : // possible object types for 3D
599 :
600 : #define IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_X 0x0000
601 : #define IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_Y 0x0001
602 : #define IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_Z 0x0002
603 : #define IMP_SDXMLEXP_TRANSOBJ3D_SCALE 0x0003
604 : #define IMP_SDXMLEXP_TRANSOBJ3D_TRANSLATE 0x0004
605 : #define IMP_SDXMLEXP_TRANSOBJ3D_MATRIX 0x0005
606 :
607 : // classes of objects, different sizes
608 :
609 : struct ImpSdXMLExpTransObj3DRotateX : public ImpSdXMLExpTransObj3DBase
610 : {
611 : double mfRotateX;
612 0 : ImpSdXMLExpTransObj3DRotateX(double fVal)
613 0 : : ImpSdXMLExpTransObj3DBase(IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_X), mfRotateX(fVal) {}
614 : };
615 : struct ImpSdXMLExpTransObj3DRotateY : public ImpSdXMLExpTransObj3DBase
616 : {
617 : double mfRotateY;
618 0 : ImpSdXMLExpTransObj3DRotateY(double fVal)
619 0 : : ImpSdXMLExpTransObj3DBase(IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_Y), mfRotateY(fVal) {}
620 : };
621 : struct ImpSdXMLExpTransObj3DRotateZ : public ImpSdXMLExpTransObj3DBase
622 : {
623 : double mfRotateZ;
624 0 : ImpSdXMLExpTransObj3DRotateZ(double fVal)
625 0 : : ImpSdXMLExpTransObj3DBase(IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_Z), mfRotateZ(fVal) {}
626 : };
627 0 : struct ImpSdXMLExpTransObj3DScale : public ImpSdXMLExpTransObj3DBase
628 : {
629 : ::basegfx::B3DTuple maScale;
630 0 : ImpSdXMLExpTransObj3DScale(const ::basegfx::B3DTuple& rNew)
631 0 : : ImpSdXMLExpTransObj3DBase(IMP_SDXMLEXP_TRANSOBJ3D_SCALE), maScale(rNew) {}
632 : };
633 0 : struct ImpSdXMLExpTransObj3DTranslate : public ImpSdXMLExpTransObj3DBase
634 : {
635 : ::basegfx::B3DTuple maTranslate;
636 0 : ImpSdXMLExpTransObj3DTranslate(const ::basegfx::B3DTuple& rNew)
637 0 : : ImpSdXMLExpTransObj3DBase(IMP_SDXMLEXP_TRANSOBJ3D_TRANSLATE), maTranslate(rNew) {}
638 : };
639 0 : struct ImpSdXMLExpTransObj3DMatrix : public ImpSdXMLExpTransObj3DBase
640 : {
641 : ::basegfx::B3DHomMatrix maMatrix;
642 0 : ImpSdXMLExpTransObj3DMatrix(const ::basegfx::B3DHomMatrix& rNew)
643 0 : : ImpSdXMLExpTransObj3DBase(IMP_SDXMLEXP_TRANSOBJ3D_MATRIX), maMatrix(rNew) {}
644 : };
645 :
646 : // delete all entries in list
647 :
648 0 : void SdXMLImExTransform3D::EmptyList()
649 : {
650 0 : const sal_uInt32 nCount = maList.size();
651 0 : for(sal_uInt32 a(0L); a < nCount; a++)
652 : {
653 0 : ImpSdXMLExpTransObj3DBase* pObj = maList[a];
654 :
655 0 : switch(pObj->mnType)
656 : {
657 : case IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_X :
658 : {
659 0 : delete (ImpSdXMLExpTransObj3DRotateX*)pObj;
660 0 : break;
661 : }
662 : case IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_Y :
663 : {
664 0 : delete (ImpSdXMLExpTransObj3DRotateY*)pObj;
665 0 : break;
666 : }
667 : case IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_Z :
668 : {
669 0 : delete (ImpSdXMLExpTransObj3DRotateZ*)pObj;
670 0 : break;
671 : }
672 : case IMP_SDXMLEXP_TRANSOBJ3D_SCALE :
673 : {
674 0 : delete (ImpSdXMLExpTransObj3DScale*)pObj;
675 0 : break;
676 : }
677 : case IMP_SDXMLEXP_TRANSOBJ3D_TRANSLATE :
678 : {
679 0 : delete (ImpSdXMLExpTransObj3DTranslate*)pObj;
680 0 : break;
681 : }
682 : case IMP_SDXMLEXP_TRANSOBJ3D_MATRIX :
683 : {
684 0 : delete (ImpSdXMLExpTransObj3DMatrix*)pObj;
685 0 : break;
686 : }
687 : default :
688 : {
689 : OSL_FAIL("SdXMLImExTransform3D: impossible entry!");
690 0 : break;
691 : }
692 : }
693 : }
694 :
695 0 : maList.clear();
696 0 : }
697 :
698 : // add members
699 :
700 0 : void SdXMLImExTransform3D::AddMatrix(const ::basegfx::B3DHomMatrix& rNew)
701 : {
702 0 : if(!rNew.isIdentity())
703 0 : maList.push_back(new ImpSdXMLExpTransObj3DMatrix(rNew));
704 0 : }
705 :
706 0 : void SdXMLImExTransform3D::AddHomogenMatrix(const drawing::HomogenMatrix& xHomMat)
707 : {
708 0 : ::basegfx::B3DHomMatrix aExportMatrix;
709 :
710 0 : aExportMatrix.set(0, 0, xHomMat.Line1.Column1);
711 0 : aExportMatrix.set(0, 1, xHomMat.Line1.Column2);
712 0 : aExportMatrix.set(0, 2, xHomMat.Line1.Column3);
713 0 : aExportMatrix.set(0, 3, xHomMat.Line1.Column4);
714 0 : aExportMatrix.set(1, 0, xHomMat.Line2.Column1);
715 0 : aExportMatrix.set(1, 1, xHomMat.Line2.Column2);
716 0 : aExportMatrix.set(1, 2, xHomMat.Line2.Column3);
717 0 : aExportMatrix.set(1, 3, xHomMat.Line2.Column4);
718 0 : aExportMatrix.set(2, 0, xHomMat.Line3.Column1);
719 0 : aExportMatrix.set(2, 1, xHomMat.Line3.Column2);
720 0 : aExportMatrix.set(2, 2, xHomMat.Line3.Column3);
721 0 : aExportMatrix.set(2, 3, xHomMat.Line3.Column4);
722 :
723 0 : AddMatrix(aExportMatrix);
724 0 : }
725 :
726 : // gen string for export
727 0 : const OUString& SdXMLImExTransform3D::GetExportString(const SvXMLUnitConverter& rConv)
728 : {
729 0 : OUString aNewString;
730 0 : OUString aClosingBrace(")");
731 0 : OUString aEmptySpace(" ");
732 :
733 0 : const sal_uInt32 nCount = maList.size();
734 0 : for(sal_uInt32 a(0L); a < nCount; a++)
735 : {
736 0 : ImpSdXMLExpTransObj3DBase* pObj = maList[a];
737 0 : switch(pObj->mnType)
738 : {
739 : case IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_X :
740 : {
741 0 : aNewString += "rotatex (";
742 0 : Imp_PutDoubleChar(aNewString, rConv, basegfx::rad2deg( ((ImpSdXMLExpTransObj3DRotateX*)pObj)->mfRotateX) );
743 0 : aNewString += aClosingBrace;
744 0 : break;
745 : }
746 : case IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_Y :
747 : {
748 0 : aNewString += "rotatey (";
749 0 : Imp_PutDoubleChar(aNewString, rConv, basegfx::rad2deg( ((ImpSdXMLExpTransObj3DRotateY*)pObj)->mfRotateY) );
750 0 : aNewString += aClosingBrace;
751 0 : break;
752 : }
753 : case IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_Z :
754 : {
755 0 : aNewString += "rotatez (";
756 0 : Imp_PutDoubleChar(aNewString, rConv, basegfx::rad2deg( ((ImpSdXMLExpTransObj3DRotateZ*)pObj)->mfRotateZ) );
757 0 : aNewString += aClosingBrace;
758 0 : break;
759 : }
760 : case IMP_SDXMLEXP_TRANSOBJ3D_SCALE :
761 : {
762 0 : aNewString += "scale (";
763 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DScale*)pObj)->maScale.getX());
764 0 : aNewString += aEmptySpace;
765 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DScale*)pObj)->maScale.getY());
766 0 : aNewString += aEmptySpace;
767 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DScale*)pObj)->maScale.getZ());
768 0 : aNewString += aClosingBrace;
769 0 : break;
770 : }
771 : case IMP_SDXMLEXP_TRANSOBJ3D_TRANSLATE :
772 : {
773 0 : aNewString += "translate (";
774 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DTranslate*)pObj)->maTranslate.getX(), true);
775 0 : aNewString += aEmptySpace;
776 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DTranslate*)pObj)->maTranslate.getY(), true);
777 0 : aNewString += aEmptySpace;
778 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DTranslate*)pObj)->maTranslate.getZ(), true);
779 0 : aNewString += aClosingBrace;
780 0 : break;
781 : }
782 : case IMP_SDXMLEXP_TRANSOBJ3D_MATRIX :
783 : {
784 0 : aNewString += "matrix (";
785 :
786 : // a
787 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(0, 0));
788 0 : aNewString += aEmptySpace;
789 :
790 : // b
791 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(1, 0));
792 0 : aNewString += aEmptySpace;
793 :
794 : // c
795 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(2, 0));
796 0 : aNewString += aEmptySpace;
797 :
798 : // d
799 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(0, 1));
800 0 : aNewString += aEmptySpace;
801 :
802 : // e
803 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(1, 1));
804 0 : aNewString += aEmptySpace;
805 :
806 : // f
807 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(2, 1));
808 0 : aNewString += aEmptySpace;
809 :
810 : // g
811 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(0, 2));
812 0 : aNewString += aEmptySpace;
813 :
814 : // h
815 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(1, 2));
816 0 : aNewString += aEmptySpace;
817 :
818 : // i
819 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(2, 2));
820 0 : aNewString += aEmptySpace;
821 :
822 : // j
823 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(0, 3), true);
824 0 : aNewString += aEmptySpace;
825 :
826 : // k
827 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(1, 3), true);
828 0 : aNewString += aEmptySpace;
829 :
830 : // l
831 0 : Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(2, 3), true);
832 :
833 0 : aNewString += aClosingBrace;
834 0 : break;
835 : }
836 : default :
837 : {
838 : OSL_FAIL("SdXMLImExTransform3D: impossible entry!");
839 0 : break;
840 : }
841 : }
842 :
843 : // if not the last entry, add one space to next tag
844 0 : if(a + 1UL != maList.size())
845 : {
846 0 : aNewString += aEmptySpace;
847 : }
848 : }
849 :
850 : // fill string form OUString
851 0 : msString = aNewString;
852 :
853 0 : return msString;
854 : }
855 :
856 : // for Import: constructor with string, parses it and generates entries
857 0 : SdXMLImExTransform3D::SdXMLImExTransform3D(const OUString& rNew, const SvXMLUnitConverter& rConv)
858 : {
859 0 : SetString(rNew, rConv);
860 0 : }
861 :
862 : // sets new string, parses it and generates entries
863 0 : void SdXMLImExTransform3D::SetString(const OUString& rNew, const SvXMLUnitConverter& rConv)
864 : {
865 0 : msString = rNew;
866 0 : EmptyList();
867 :
868 0 : if(!msString.isEmpty())
869 : {
870 0 : const OUString aStr(msString.getStr(), (sal_uInt16)msString.getLength());
871 0 : const sal_Int32 nLen(aStr.getLength());
872 :
873 0 : const OUString aString_rotatex( "rotatex" );
874 0 : const OUString aString_rotatey( "rotatey" );
875 0 : const OUString aString_rotatez( "rotatez" );
876 0 : const OUString aString_scale( "scale" );
877 0 : const OUString aString_translate( "translate" );
878 0 : const OUString aString_matrix( "matrix" );
879 :
880 0 : sal_Int32 nPos(0);
881 :
882 0 : while(nPos < nLen)
883 : {
884 : // skip spaces
885 0 : Imp_SkipSpaces(aStr, nPos, nLen);
886 :
887 : // look for tag
888 0 : if(nPos < nLen)
889 : {
890 0 : if(nPos == aStr.indexOf(aString_rotatex, nPos))
891 : {
892 0 : double fValue(0.0);
893 :
894 0 : nPos += 7;
895 0 : Imp_SkipSpacesAndOpeningBraces(aStr, nPos, nLen);
896 0 : fValue = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, fValue);
897 0 : if(fValue != 0.0)
898 0 : maList.push_back(new ImpSdXMLExpTransObj3DRotateX(basegfx::deg2rad(fValue)));
899 :
900 0 : Imp_SkipSpacesAndClosingBraces(aStr, nPos, nLen);
901 : }
902 0 : else if(nPos == aStr.indexOf(aString_rotatey, nPos))
903 : {
904 0 : double fValue(0.0);
905 :
906 0 : nPos += 7;
907 0 : Imp_SkipSpacesAndOpeningBraces(aStr, nPos, nLen);
908 0 : fValue = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, fValue);
909 0 : if(fValue != 0.0)
910 0 : maList.push_back(new ImpSdXMLExpTransObj3DRotateY(basegfx::deg2rad(fValue)));
911 :
912 0 : Imp_SkipSpacesAndClosingBraces(aStr, nPos, nLen);
913 : }
914 0 : else if(nPos == aStr.indexOf(aString_rotatez, nPos))
915 : {
916 0 : double fValue(0.0);
917 :
918 0 : nPos += 7;
919 0 : Imp_SkipSpacesAndOpeningBraces(aStr, nPos, nLen);
920 0 : fValue = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, fValue);
921 0 : if(fValue != 0.0)
922 0 : maList.push_back(new ImpSdXMLExpTransObj3DRotateZ(basegfx::deg2rad(fValue)));
923 :
924 0 : Imp_SkipSpacesAndClosingBraces(aStr, nPos, nLen);
925 : }
926 0 : else if(nPos == aStr.indexOf(aString_scale, nPos))
927 : {
928 0 : ::basegfx::B3DTuple aValue(1.0, 1.0, 1.0);
929 :
930 0 : nPos += 5;
931 0 : Imp_SkipSpacesAndOpeningBraces(aStr, nPos, nLen);
932 0 : aValue.setX(Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.getX()));
933 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
934 0 : aValue.setY(Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.getY()));
935 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
936 0 : aValue.setZ(Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.getZ()));
937 :
938 0 : if(1.0 != aValue.getX() || 1.0 != aValue.getY() || 1.0 != aValue.getZ())
939 0 : maList.push_back(new ImpSdXMLExpTransObj3DScale(aValue));
940 :
941 0 : Imp_SkipSpacesAndClosingBraces(aStr, nPos, nLen);
942 : }
943 0 : else if(nPos == aStr.indexOf(aString_translate, nPos))
944 : {
945 0 : ::basegfx::B3DTuple aValue;
946 :
947 0 : nPos += 9;
948 0 : Imp_SkipSpacesAndOpeningBraces(aStr, nPos, nLen);
949 0 : aValue.setX(Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.getX(), true));
950 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
951 0 : aValue.setY(Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.getY(), true));
952 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
953 0 : aValue.setZ(Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.getZ(), true));
954 :
955 0 : if(!aValue.equalZero())
956 0 : maList.push_back(new ImpSdXMLExpTransObj3DTranslate(aValue));
957 :
958 0 : Imp_SkipSpacesAndClosingBraces(aStr, nPos, nLen);
959 : }
960 0 : else if(nPos == aStr.indexOf(aString_matrix, nPos))
961 : {
962 0 : ::basegfx::B3DHomMatrix aValue;
963 :
964 0 : nPos += 6;
965 0 : Imp_SkipSpacesAndOpeningBraces(aStr, nPos, nLen);
966 :
967 : // a
968 0 : aValue.set(0, 0, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(0, 0)));
969 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
970 :
971 : // b
972 0 : aValue.set(1, 0, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(1, 0)));
973 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
974 :
975 : // c
976 0 : aValue.set(2, 0, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(2, 0)));
977 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
978 :
979 : // d
980 0 : aValue.set(0, 1, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(0, 1)));
981 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
982 :
983 : // e
984 0 : aValue.set(1, 1, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(1, 1)));
985 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
986 :
987 : // f
988 0 : aValue.set(2, 1, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(2, 1)));
989 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
990 :
991 : // g
992 0 : aValue.set(0, 2, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(0, 2)));
993 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
994 :
995 : // h
996 0 : aValue.set(1, 2, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(1, 2)));
997 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
998 :
999 : // i
1000 0 : aValue.set(2, 2, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(2, 2)));
1001 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
1002 :
1003 : // j
1004 0 : aValue.set(0, 3, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(0, 3), true));
1005 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
1006 :
1007 : // k
1008 0 : aValue.set(1, 3, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(1, 3), true));
1009 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
1010 :
1011 : // l
1012 0 : aValue.set(2, 3, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(2, 3), true));
1013 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
1014 :
1015 0 : if(!aValue.isIdentity())
1016 0 : maList.push_back(new ImpSdXMLExpTransObj3DMatrix(aValue));
1017 :
1018 0 : Imp_SkipSpacesAndClosingBraces(aStr, nPos, nLen);
1019 : }
1020 : else
1021 : {
1022 0 : nPos++;
1023 : }
1024 : }
1025 0 : }
1026 : }
1027 0 : }
1028 :
1029 0 : bool SdXMLImExTransform3D::GetFullHomogenTransform(com::sun::star::drawing::HomogenMatrix& xHomMat)
1030 : {
1031 0 : ::basegfx::B3DHomMatrix aFullTransform;
1032 0 : GetFullTransform(aFullTransform);
1033 :
1034 0 : if(!aFullTransform.isIdentity())
1035 : {
1036 0 : xHomMat.Line1.Column1 = aFullTransform.get(0, 0);
1037 0 : xHomMat.Line1.Column2 = aFullTransform.get(0, 1);
1038 0 : xHomMat.Line1.Column3 = aFullTransform.get(0, 2);
1039 0 : xHomMat.Line1.Column4 = aFullTransform.get(0, 3);
1040 :
1041 0 : xHomMat.Line2.Column1 = aFullTransform.get(1, 0);
1042 0 : xHomMat.Line2.Column2 = aFullTransform.get(1, 1);
1043 0 : xHomMat.Line2.Column3 = aFullTransform.get(1, 2);
1044 0 : xHomMat.Line2.Column4 = aFullTransform.get(1, 3);
1045 :
1046 0 : xHomMat.Line3.Column1 = aFullTransform.get(2, 0);
1047 0 : xHomMat.Line3.Column2 = aFullTransform.get(2, 1);
1048 0 : xHomMat.Line3.Column3 = aFullTransform.get(2, 2);
1049 0 : xHomMat.Line3.Column4 = aFullTransform.get(2, 3);
1050 :
1051 0 : xHomMat.Line4.Column1 = aFullTransform.get(3, 0);
1052 0 : xHomMat.Line4.Column2 = aFullTransform.get(3, 1);
1053 0 : xHomMat.Line4.Column3 = aFullTransform.get(3, 2);
1054 0 : xHomMat.Line4.Column4 = aFullTransform.get(3, 3);
1055 :
1056 0 : return true;
1057 : }
1058 :
1059 0 : return false;
1060 : }
1061 :
1062 0 : void SdXMLImExTransform3D::GetFullTransform(::basegfx::B3DHomMatrix& rFullTrans)
1063 : {
1064 0 : rFullTrans.identity();
1065 :
1066 0 : const sal_uInt32 nCount = maList.size();
1067 0 : for(sal_uInt32 a(0L); a < nCount; a++)
1068 : {
1069 0 : ImpSdXMLExpTransObj3DBase* pObj = maList[a];
1070 0 : switch(pObj->mnType)
1071 : {
1072 : case IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_X :
1073 : {
1074 0 : rFullTrans.rotate(((ImpSdXMLExpTransObj3DRotateX*)pObj)->mfRotateX, 0.0, 0.0);
1075 0 : break;
1076 : }
1077 : case IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_Y :
1078 : {
1079 0 : rFullTrans.rotate(0.0, ((ImpSdXMLExpTransObj3DRotateY*)pObj)->mfRotateY, 0.0);
1080 0 : break;
1081 : }
1082 : case IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_Z :
1083 : {
1084 0 : rFullTrans.rotate(0.0, 0.0, ((ImpSdXMLExpTransObj3DRotateZ*)pObj)->mfRotateZ);
1085 0 : break;
1086 : }
1087 : case IMP_SDXMLEXP_TRANSOBJ3D_SCALE :
1088 : {
1089 0 : const ::basegfx::B3DTuple& rScale = ((ImpSdXMLExpTransObj3DScale*)pObj)->maScale;
1090 0 : rFullTrans.scale(rScale.getX(), rScale.getY(), rScale.getZ());
1091 0 : break;
1092 : }
1093 : case IMP_SDXMLEXP_TRANSOBJ3D_TRANSLATE :
1094 : {
1095 0 : const ::basegfx::B3DTuple& rTranslate = ((ImpSdXMLExpTransObj3DTranslate*)pObj)->maTranslate;
1096 0 : rFullTrans.translate(rTranslate.getX(), rTranslate.getY(), rTranslate.getZ());
1097 0 : break;
1098 : }
1099 : case IMP_SDXMLEXP_TRANSOBJ3D_MATRIX :
1100 : {
1101 0 : rFullTrans *= ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix;
1102 0 : break;
1103 : }
1104 : default :
1105 : {
1106 : OSL_FAIL("SdXMLImExTransform3D: impossible entry!");
1107 0 : break;
1108 : }
1109 : }
1110 : }
1111 0 : }
1112 :
1113 0 : SdXMLImExViewBox::SdXMLImExViewBox(double fX, double fY, double fW, double fH)
1114 : : mfX( fX ),
1115 : mfY( fY ),
1116 : mfW( fW ),
1117 0 : mfH( fH )
1118 : {
1119 0 : }
1120 :
1121 : // #100617# Asked vincent hardy: svg:viewBox values may be double precision.
1122 0 : SdXMLImExViewBox::SdXMLImExViewBox(const OUString& rNew, const SvXMLUnitConverter& rConv)
1123 : : msString(rNew),
1124 : mfX( 0.0 ),
1125 : mfY( 0.0 ),
1126 : mfW( 1000.0 ),
1127 0 : mfH( 1000.0 )
1128 : {
1129 0 : if(!msString.isEmpty())
1130 : {
1131 0 : const OUString aStr(msString.getStr(), (sal_uInt16)msString.getLength());
1132 0 : const sal_Int32 nLen(aStr.getLength());
1133 0 : sal_Int32 nPos(0);
1134 :
1135 : // skip starting spaces
1136 0 : Imp_SkipSpaces(aStr, nPos, nLen);
1137 :
1138 : // get mX, #100617# be prepared for doubles
1139 0 : mfX = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, mfX);
1140 :
1141 : // skip spaces and commas
1142 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
1143 :
1144 : // get mY, #100617# be prepared for doubles
1145 0 : mfY = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, mfY);
1146 :
1147 : // skip spaces and commas
1148 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
1149 :
1150 : // get mW, #100617# be prepared for doubles
1151 0 : mfW = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, mfW);
1152 :
1153 : // skip spaces and commas
1154 0 : Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
1155 :
1156 : // get mH, #100617# be prepared for doubles
1157 0 : mfH = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, mfH);
1158 : }
1159 0 : }
1160 :
1161 0 : const OUString& SdXMLImExViewBox::GetExportString()
1162 : {
1163 0 : OUString aNewString;
1164 0 : OUString aEmptySpace(" ");
1165 :
1166 0 : Imp_PutDoubleChar(aNewString, mfX);
1167 0 : aNewString += aEmptySpace;
1168 :
1169 0 : Imp_PutDoubleChar(aNewString, mfY);
1170 0 : aNewString += aEmptySpace;
1171 :
1172 0 : Imp_PutDoubleChar(aNewString, mfW);
1173 0 : aNewString += aEmptySpace;
1174 :
1175 0 : Imp_PutDoubleChar(aNewString, mfH);
1176 :
1177 : // set new string
1178 0 : msString = aNewString;
1179 :
1180 0 : return msString;
1181 : }
1182 :
1183 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|