22 #include <string_view>
25 #include <rtl/ustrbuf.hxx>
26 #include <osl/diagnose.h>
38 using std::make_unique;
41 static void Imp_SkipSpaces(std::u16string_view rStr, sal_Int32& rPos,
const sal_Int32 nLen)
51 && (
' ' == rStr[rPos] ||
'(' == rStr[rPos]))
58 && (
' ' == rStr[rPos] ||
',' == rStr[rPos]))
65 && (
' ' == rStr[rPos] ||
')' == rStr[rPos]))
75 return (
'a' <= aChar &&
'z' >= aChar)
76 || (
'A' <= aChar &&
'Z' >= aChar)
80 static double Imp_GetDoubleChar(std::u16string_view rStr, sal_Int32& rPos,
const sal_Int32 nLen,
84 OUStringBuffer sNumberString(32);
86 if(
'+' == aChar ||
'-' == aChar)
88 sNumberString.append(rStr[rPos]);
90 aChar = rPos >= nLen ? 0 : rStr[rPos];
93 while((
'0' <= aChar &&
'9' >= aChar)
96 sNumberString.append(rStr[rPos]);
98 aChar = rPos >= nLen ? 0 : rStr[rPos];
101 if(
'e' == aChar ||
'E' == aChar)
103 sNumberString.append(rStr[rPos]);
105 aChar = rPos >= nLen ? 0 : rStr[rPos];
107 if(
'+' == aChar ||
'-' == aChar)
109 sNumberString.append(rStr[rPos]);
111 aChar = rPos >= nLen ? 0 : rStr[rPos];
114 while(
'0' <= aChar &&
'9' >= aChar)
116 sNumberString.append(rStr[rPos]);
118 aChar = rPos >= nLen ? 0 : rStr[rPos];
126 sNumberString.append(rStr[rPos++]);
129 if(!sNumberString.isEmpty())
132 rConv.
convertDouble(fRetval, sNumberString.makeStringAndClear());
136 sNumberString.makeStringAndClear());
145 OUStringBuffer sStringBuffer;
147 rStr += sStringBuffer;
151 bool bConvertUnits =
false)
153 OUStringBuffer sStringBuffer;
162 rStr.append(sStringBuffer);
176 #define IMP_SDXMLEXP_TRANSOBJ2D_ROTATE 0x0000
177 #define IMP_SDXMLEXP_TRANSOBJ2D_SCALE 0x0001
178 #define IMP_SDXMLEXP_TRANSOBJ2D_TRANSLATE 0x0002
179 #define IMP_SDXMLEXP_TRANSOBJ2D_SKEWX 0x0003
180 #define IMP_SDXMLEXP_TRANSOBJ2D_SKEWY 0x0004
181 #define IMP_SDXMLEXP_TRANSOBJ2D_MATRIX 0x0005
190 explicit ImpSdXMLExpTransObj2DRotate(
double fVal)
196 explicit ImpSdXMLExpTransObj2DScale(const ::basegfx::B2DTuple& rNew)
202 explicit ImpSdXMLExpTransObj2DTranslate(const ::basegfx::B2DTuple& rNew)
208 explicit ImpSdXMLExpTransObj2DSkewX(
double fVal)
214 explicit ImpSdXMLExpTransObj2DSkewY(
double fVal)
220 explicit ImpSdXMLExpTransObj2DMatrix(const ::basegfx::B2DHomMatrix& rNew)
231 maList.push_back(std::make_shared<ImpSdXMLExpTransObj2DRotate>(fNew));
236 if(!rNew.equalZero())
237 maList.push_back(std::make_shared<ImpSdXMLExpTransObj2DTranslate>(rNew));
243 maList.push_back(std::make_shared<ImpSdXMLExpTransObj2DSkewX>(fNew));
249 OUStringBuffer aNewString;
250 OUString aClosingBrace(
")");
251 OUString aEmptySpace(
" ");
254 for(sal_uInt32
a(0);
a < nCount;
a++)
261 aNewString.append(
"rotate (");
262 Imp_PutDoubleChar(aNewString, rConv, static_cast<ImpSdXMLExpTransObj2DRotate*>(pObj)->mfRotate);
263 aNewString.append(aClosingBrace);
268 aNewString.append(
"scale (");
269 Imp_PutDoubleChar(aNewString, rConv, static_cast<ImpSdXMLExpTransObj2DScale*>(pObj)->maScale.getX());
270 aNewString.append(aEmptySpace);
271 Imp_PutDoubleChar(aNewString, rConv, static_cast<ImpSdXMLExpTransObj2DScale*>(pObj)->maScale.getY());
272 aNewString.append(aClosingBrace);
277 aNewString.append(
"translate (");
278 Imp_PutDoubleChar(aNewString, rConv, static_cast<ImpSdXMLExpTransObj2DTranslate*>(pObj)->maTranslate.getX(),
true);
279 aNewString.append(aEmptySpace);
280 Imp_PutDoubleChar(aNewString, rConv, static_cast<ImpSdXMLExpTransObj2DTranslate*>(pObj)->maTranslate.getY(),
true);
281 aNewString.append(aClosingBrace);
286 aNewString.append(
"skewX (");
287 Imp_PutDoubleChar(aNewString, rConv, static_cast<ImpSdXMLExpTransObj2DSkewX*>(pObj)->mfSkewX);
288 aNewString.append(aClosingBrace);
293 aNewString.append(
"skewY (");
294 Imp_PutDoubleChar(aNewString, rConv, static_cast<ImpSdXMLExpTransObj2DSkewY*>(pObj)->mfSkewY);
295 aNewString.append(aClosingBrace);
300 aNewString.append(
"matrix (");
304 aNewString.append(aEmptySpace);
308 aNewString.append(aEmptySpace);
312 aNewString.append(aEmptySpace);
316 aNewString.append(aEmptySpace);
320 aNewString.append(aEmptySpace);
325 aNewString.append(aClosingBrace);
330 OSL_FAIL(
"SdXMLImExTransform2D: impossible entry!");
338 aNewString.append(aEmptySpace);
343 msString = aNewString.makeStringAndClear();
358 const sal_Int32 nLen(aStr.getLength());
360 const OUString aString_rotate(
"rotate" );
361 const OUString aString_scale(
"scale" );
362 const OUString aString_translate(
"translate" );
363 const OUString aString_skewX(
"skewX" );
364 const OUString aString_skewY(
"skewY" );
365 const OUString aString_matrix(
"matrix" );
377 if(nPos == aStr.indexOf(aString_rotate, nPos))
384 maList.push_back(std::make_shared<ImpSdXMLExpTransObj2DRotate>(fValue));
388 else if(nPos == aStr.indexOf(aString_scale, nPos))
397 if(aValue.
getX() != 1.0 || aValue.
getY() != 1.0)
398 maList.push_back(std::make_shared<ImpSdXMLExpTransObj2DScale>(aValue));
402 else if(nPos == aStr.indexOf(aString_translate, nPos))
412 maList.push_back(std::make_shared<ImpSdXMLExpTransObj2DTranslate>(aValue));
416 else if(nPos == aStr.indexOf(aString_skewX, nPos))
423 maList.push_back(std::make_shared<ImpSdXMLExpTransObj2DSkewX>(fValue));
427 else if(nPos == aStr.indexOf(aString_skewY, nPos))
434 maList.push_back(std::make_shared<ImpSdXMLExpTransObj2DSkewY>(fValue));
438 else if(nPos == aStr.indexOf(aString_matrix, nPos))
470 maList.push_back(std::make_shared<ImpSdXMLExpTransObj2DMatrix>(aValue));
487 for(sal_uInt32
a(0);
a < nCount;
a++)
500 rFullTrans.
rotate(static_cast<ImpSdXMLExpTransObj2DRotate*>(pObj)->mfRotate * -1.0);
505 const ::basegfx::B2DTuple& rScale =
static_cast<ImpSdXMLExpTransObj2DScale*
>(pObj)->maScale;
506 rFullTrans.
scale(rScale.getX(), rScale.getY());
511 const ::basegfx::B2DTuple& rTranslate =
static_cast<ImpSdXMLExpTransObj2DTranslate*
>(pObj)->maTranslate;
512 rFullTrans.
translate(rTranslate.getX(), rTranslate.getY());
519 rFullTrans.
shearX(-tan(static_cast<ImpSdXMLExpTransObj2DSkewX*>(pObj)->mfSkewX));
528 rFullTrans.
shearY(-tan(static_cast<ImpSdXMLExpTransObj2DSkewY*>(pObj)->mfSkewY));
533 rFullTrans *=
static_cast<ImpSdXMLExpTransObj2DMatrix*
>(pObj)->
maMatrix;
538 OSL_FAIL(
"SdXMLImExTransform2D: impossible entry!");
556 #define IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_X 0x0000
557 #define IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_Y 0x0001
558 #define IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_Z 0x0002
559 #define IMP_SDXMLEXP_TRANSOBJ3D_SCALE 0x0003
560 #define IMP_SDXMLEXP_TRANSOBJ3D_TRANSLATE 0x0004
561 #define IMP_SDXMLEXP_TRANSOBJ3D_MATRIX 0x0005
570 explicit ImpSdXMLExpTransObj3DRotateX(
double fVal)
576 explicit ImpSdXMLExpTransObj3DRotateY(
double fVal)
582 explicit ImpSdXMLExpTransObj3DRotateZ(
double fVal)
587 ::basegfx::B3DTuple maScale;
588 explicit ImpSdXMLExpTransObj3DScale(const ::basegfx::B3DTuple& rNew)
593 ::basegfx::B3DTuple maTranslate;
594 explicit ImpSdXMLExpTransObj3DTranslate(const ::basegfx::B3DTuple& rNew)
600 explicit ImpSdXMLExpTransObj3DMatrix(const ::basegfx::B3DHomMatrix& rNew)
610 if(!rNew.isIdentity())
611 maList.push_back(std::make_shared<ImpSdXMLExpTransObj3DMatrix>(rNew));
622 OUStringBuffer aNewString;
623 OUString aClosingBrace(
")");
624 OUString aEmptySpace(
" ");
627 for(sal_uInt32
a(0);
a < nCount;
a++)
634 aNewString.append(
"rotatex (");
636 aNewString.append(aClosingBrace);
641 aNewString.append(
"rotatey (");
643 aNewString.append(aClosingBrace);
648 aNewString.append(
"rotatez (");
650 aNewString.append(aClosingBrace);
655 aNewString.append(
"scale (");
656 Imp_PutDoubleChar(aNewString, rConv, static_cast<ImpSdXMLExpTransObj3DScale*>(pObj)->maScale.getX());
657 aNewString.append(aEmptySpace);
658 Imp_PutDoubleChar(aNewString, rConv, static_cast<ImpSdXMLExpTransObj3DScale*>(pObj)->maScale.getY());
659 aNewString.append(aEmptySpace);
660 Imp_PutDoubleChar(aNewString, rConv, static_cast<ImpSdXMLExpTransObj3DScale*>(pObj)->maScale.getZ());
661 aNewString.append(aClosingBrace);
666 aNewString.append(
"translate (");
667 Imp_PutDoubleChar(aNewString, rConv, static_cast<ImpSdXMLExpTransObj3DTranslate*>(pObj)->maTranslate.getX(),
true);
668 aNewString.append(aEmptySpace);
669 Imp_PutDoubleChar(aNewString, rConv, static_cast<ImpSdXMLExpTransObj3DTranslate*>(pObj)->maTranslate.getY(),
true);
670 aNewString.append(aEmptySpace);
671 Imp_PutDoubleChar(aNewString, rConv, static_cast<ImpSdXMLExpTransObj3DTranslate*>(pObj)->maTranslate.getZ(),
true);
672 aNewString.append(aClosingBrace);
677 aNewString.append(
"matrix (");
681 aNewString.append(aEmptySpace);
685 aNewString.append(aEmptySpace);
689 aNewString.append(aEmptySpace);
693 aNewString.append(aEmptySpace);
697 aNewString.append(aEmptySpace);
701 aNewString.append(aEmptySpace);
705 aNewString.append(aEmptySpace);
709 aNewString.append(aEmptySpace);
713 aNewString.append(aEmptySpace);
717 aNewString.append(aEmptySpace);
721 aNewString.append(aEmptySpace);
726 aNewString.append(aClosingBrace);
731 OSL_FAIL(
"SdXMLImExTransform3D: impossible entry!");
739 aNewString.append(aEmptySpace);
744 msString = aNewString.makeStringAndClear();
765 const sal_Int32 nLen(aStr.getLength());
767 const OUString aString_rotatex(
"rotatex" );
768 const OUString aString_rotatey(
"rotatey" );
769 const OUString aString_rotatez(
"rotatez" );
770 const OUString aString_scale(
"scale" );
771 const OUString aString_translate(
"translate" );
772 const OUString aString_matrix(
"matrix" );
784 if(nPos == aStr.indexOf(aString_rotatex, nPos))
796 else if(nPos == aStr.indexOf(aString_rotatey, nPos))
808 else if(nPos == aStr.indexOf(aString_rotatez, nPos))
820 else if(nPos == aStr.indexOf(aString_scale, nPos))
822 ::basegfx::B3DTuple aValue(1.0, 1.0, 1.0);
832 if(1.0 != aValue.getX() || 1.0 != aValue.getY() || 1.0 != aValue.getZ())
833 maList.push_back(std::make_shared<ImpSdXMLExpTransObj3DScale>(aValue));
837 else if(nPos == aStr.indexOf(aString_translate, nPos))
839 ::basegfx::B3DTuple aValue;
849 if(!aValue.equalZero())
850 maList.push_back(std::make_shared<ImpSdXMLExpTransObj3DTranslate>(aValue));
854 else if(nPos == aStr.indexOf(aString_matrix, nPos))
910 maList.push_back(std::make_shared<ImpSdXMLExpTransObj3DMatrix>(aValue));
941 for(sal_uInt32
a(0);
a < nCount;
a++)
948 rFullTrans.
rotate(static_cast<ImpSdXMLExpTransObj3DRotateX*>(pObj)->mfRotateX, 0.0, 0.0);
953 rFullTrans.
rotate(0.0, static_cast<ImpSdXMLExpTransObj3DRotateY*>(pObj)->mfRotateY, 0.0);
958 rFullTrans.
rotate(0.0, 0.0, static_cast<ImpSdXMLExpTransObj3DRotateZ*>(pObj)->mfRotateZ);
963 const ::basegfx::B3DTuple& rScale =
static_cast<ImpSdXMLExpTransObj3DScale*
>(pObj)->maScale;
964 rFullTrans.
scale(rScale.getX(), rScale.getY(), rScale.getZ());
969 const ::basegfx::B3DTuple& rTranslate =
static_cast<ImpSdXMLExpTransObj3DTranslate*
>(pObj)->maTranslate;
970 rFullTrans.
translate(rTranslate.getX(), rTranslate.getY(), rTranslate.getZ());
975 rFullTrans *=
static_cast<ImpSdXMLExpTransObj3DMatrix*
>(pObj)->
maMatrix;
980 OSL_FAIL(
"SdXMLImExTransform3D: impossible entry!");
1007 const sal_Int32 nLen(aStr.getLength());
1038 OUString aNewString;
1039 OUString aEmptySpace(
" ");
1042 aNewString += aEmptySpace;
1045 aNewString += aEmptySpace;
1048 aNewString += aEmptySpace;
void convertDouble(OUStringBuffer &rBuffer, double fNumber) const
convert double number to string (using ::rtl::math) and DO convert to export MapUnit using meCoreMeas...
void set(sal_uInt16 nRow, sal_uInt16 nColumn, double fValue)
#define IMP_SDXMLEXP_TRANSOBJ2D_SKEWX
the SvXMLTypeConverter converts values of various types from their internal representation to the tex...
void B3DHomMatrixToUnoHomogenMatrix(const B3DHomMatrix &rMatrixIn, com::sun::star::drawing::HomogenMatrix &rMatrixOut)
#define IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_Y
void set(sal_uInt16 nRow, sal_uInt16 nColumn, double fValue)
void scale(double fX, double fY, double fZ)
#define IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_Z
constexpr double rad2deg(double v)
double get(sal_uInt16 nRow, sal_uInt16 nColumn) const
static void convertDouble(OUStringBuffer &rBuffer, double fNumber, bool bWriteUnits, sal_Int16 nSourceUnit, sal_Int16 nTargetUnit)
static void Imp_SkipSpacesAndCommas(std::u16string_view rStr, sal_Int32 &rPos, const sal_Int32 nLen)
#define IMP_SDXMLEXP_TRANSOBJ2D_MATRIX
static void Imp_SkipSpacesAndClosingBraces(std::u16string_view rStr, sal_Int32 &rPos, const sal_Int32 nLen)
#define IMP_SDXMLEXP_TRANSOBJ3D_TRANSLATE
const OUString & GetExportString()
ImpSdXMLExpTransObj2DBase(sal_uInt16 nType)
B3DHomMatrix UnoHomogenMatrixToB3DHomMatrix(const com::sun::star::drawing::HomogenMatrix &rMatrixIn)
#define IMP_SDXMLEXP_TRANSOBJ3D_SCALE
static void Imp_PutDoubleChar(OUString &rStr, double fValue)
#define IMP_SDXMLEXP_TRANSOBJ2D_TRANSLATE
void rotate(double fRadiant)
static bool Imp_IsOnUnitChar(std::u16string_view rStr, const sal_Int32 nPos)
#define IMP_SDXMLEXP_TRANSOBJ3D_ROTATE_X
void scale(double fX, double fY)
constexpr double deg2rad(double v)
#define IMP_SDXMLEXP_TRANSOBJ2D_ROTATE
void translate(double fX, double fY, double fZ)
#define IMP_SDXMLEXP_TRANSOBJ2D_SCALE
SdXMLImExViewBox(double fX, double fY, double fW, double fH)
static void Imp_SkipSpacesAndOpeningBraces(std::u16string_view rStr, sal_Int32 &rPos, const sal_Int32 nLen)
static double Imp_GetDoubleChar(std::u16string_view rStr, sal_Int32 &rPos, const sal_Int32 nLen, const SvXMLUnitConverter &rConv, double fRetval, bool bLookForUnits=false)
::basegfx::B2DHomMatrix maMatrix
void translate(double fX, double fY)
#define IMP_SDXMLEXP_TRANSOBJ2D_SKEWY
void rotate(double fAngleX, double fAngleY, double fAngleZ)
ImpSdXMLExpTransObj3DBase(sal_uInt16 nType)
static void Imp_SkipSpaces(std::u16string_view rStr, sal_Int32 &rPos, const sal_Int32 nLen)
#define IMP_SDXMLEXP_TRANSOBJ3D_MATRIX
double get(sal_uInt16 nRow, sal_uInt16 nColumn) const