LCOV - code coverage report
Current view: top level - xmloff/source/draw - xexptran.cxx (source / functions) Hit Total Coverage
Test: commit 0e63ca4fde4e446f346e35849c756a30ca294aab Lines: 348 575 60.5 %
Date: 2014-04-11 Functions: 33 46 71.7 %
Legend: Lines: hit not hit

          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         369 : void Imp_SkipSpaces(const OUString& rStr, sal_Int32& rPos, const sal_Int32 nLen)
      41             : {
      42        1107 :     while(rPos < nLen
      43         369 :         && ' ' == rStr[rPos])
      44           0 :         rPos++;
      45         369 : }
      46             : 
      47          79 : void Imp_SkipSpacesAndOpeningBraces(const OUString& rStr, sal_Int32& rPos, const sal_Int32 nLen)
      48             : {
      49         553 :     while(rPos < nLen
      50         237 :         && (' ' == rStr[rPos] || '(' == rStr[rPos]))
      51         158 :         rPos++;
      52          79 : }
      53             : 
      54         821 : void Imp_SkipSpacesAndCommas(const OUString& rStr, sal_Int32& rPos, const sal_Int32 nLen)
      55             : {
      56        4051 :     while(rPos < nLen
      57        1615 :         && (' ' == rStr[rPos] || ',' == rStr[rPos]))
      58         794 :         rPos++;
      59         821 : }
      60             : 
      61          79 : void Imp_SkipSpacesAndClosingBraces(const OUString& rStr, sal_Int32& rPos, const sal_Int32 nLen)
      62             : {
      63         447 :     while(rPos < nLen
      64         184 :         && (' ' == rStr[rPos] || ')' == rStr[rPos]))
      65         105 :         rPos++;
      66          79 : }
      67             : 
      68             : // parsing help functions for integer numbers
      69             : 
      70         399 : bool Imp_IsOnUnitChar(const OUString& rStr, const sal_Int32 nPos)
      71             : {
      72         399 :     sal_Unicode aChar(rStr[nPos]);
      73             : 
      74         399 :     if(('a' <= aChar && 'z' >= aChar)
      75         133 :         || ('A' <= aChar && 'Z' >= aChar)
      76         133 :         || '%' == aChar
      77             :     )
      78         266 :         return true;
      79         133 :     return false;
      80             : }
      81             : 
      82        1030 : double Imp_GetDoubleChar(const OUString& rStr, sal_Int32& rPos, const sal_Int32 nLen,
      83             :     const SvXMLUnitConverter& rConv, double fRetval, bool bLookForUnits = false)
      84             : {
      85        1030 :     sal_Unicode aChar(rStr[rPos]);
      86        1030 :     OUStringBuffer sNumberString;
      87             : 
      88        1030 :     if('+' == aChar || '-' == aChar)
      89             :     {
      90          94 :         sNumberString.append(rStr[rPos]);
      91          94 :         ++rPos;
      92          94 :         aChar = rPos >= nLen ? 0 : rStr[rPos];
      93             :     }
      94             : 
      95        8833 :     while(('0' <= aChar && '9' >= aChar)
      96        1343 :         || '.' == aChar)
      97             :     {
      98        6773 :         sNumberString.append(rStr[rPos]);
      99        6773 :         ++rPos;
     100        6773 :         aChar = rPos >= nLen ? 0 : rStr[rPos];
     101             :     }
     102             : 
     103        1030 :     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        1030 :     if(bLookForUnits)
     125             :     {
     126         133 :         Imp_SkipSpaces(rStr, rPos, nLen);
     127         532 :         while(rPos < nLen && Imp_IsOnUnitChar(rStr, rPos))
     128         266 :             sNumberString.append(rStr[rPos++]);
     129             :     }
     130             : 
     131        1030 :     if(!sNumberString.isEmpty())
     132             :     {
     133        1030 :         if(bLookForUnits)
     134         133 :             rConv.convertDouble(fRetval, sNumberString.makeStringAndClear(), true);
     135             :         else
     136             :         {
     137             :             ::sax::Converter::convertDouble(fRetval,
     138         897 :                     sNumberString.makeStringAndClear());
     139             :         }
     140             :     }
     141             : 
     142        1030 :     return fRetval;
     143             : }
     144             : 
     145          96 : void Imp_PutDoubleChar(OUString& rStr, double fValue)
     146             : {
     147          96 :     OUStringBuffer sStringBuffer;
     148          96 :     ::sax::Converter::convertDouble(sStringBuffer, fValue);
     149          96 :     rStr += OUString(sStringBuffer.makeStringAndClear());
     150          96 : }
     151             : 
     152        1050 : void Imp_PutDoubleChar(OUString& rStr, const SvXMLUnitConverter& rConv, double fValue,
     153             :     bool bConvertUnits = false)
     154             : {
     155        1050 :     OUStringBuffer sStringBuffer;
     156             : 
     157        1050 :     if(bConvertUnits)
     158         265 :         rConv.convertDouble(sStringBuffer, fValue, true);
     159             :     else
     160             :     {
     161         785 :         ::sax::Converter::convertDouble(sStringBuffer, fValue);
     162             :     }
     163             : 
     164        1050 :     rStr += OUString(sStringBuffer.makeStringAndClear());
     165        1050 : }
     166             : 
     167             : // base class of all 2D transform objects
     168             : 
     169             : struct ImpSdXMLExpTransObj2DBase
     170             : {
     171             :     sal_uInt16                  mnType;
     172          56 :     ImpSdXMLExpTransObj2DBase(sal_uInt16 nType)
     173          56 :     :   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          28 :     ImpSdXMLExpTransObj2DRotate(double fVal)
     191          28 :     :   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          28 : struct ImpSdXMLExpTransObj2DTranslate : public ImpSdXMLExpTransObj2DBase
     200             : {
     201             :     ::basegfx::B2DTuple         maTranslate;
     202          28 :     ImpSdXMLExpTransObj2DTranslate(const ::basegfx::B2DTuple& rNew)
     203          28 :     :   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         868 : void SdXMLImExTransform2D::EmptyList()
     227             : {
     228         868 :     const sal_uInt32 nCount = maList.size();
     229         924 :     for(sal_uInt32 a(0L); a < nCount; a++)
     230             :     {
     231          56 :         ImpSdXMLExpTransObj2DBase* pObj = maList[a];
     232             : 
     233          56 :         switch(pObj->mnType)
     234             :         {
     235             :             case IMP_SDXMLEXP_TRANSOBJ2D_ROTATE     :
     236             :             {
     237          28 :                 delete (ImpSdXMLExpTransObj2DRotate*)pObj;
     238          28 :                 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          28 :                 delete (ImpSdXMLExpTransObj2DTranslate*)pObj;
     248          28 :                 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         868 :     maList.clear();
     274         868 : }
     275             : 
     276             : // add members
     277             : 
     278           2 : void SdXMLImExTransform2D::AddRotate(double fNew)
     279             : {
     280           2 :     if(fNew != 0.0)
     281           2 :         maList.push_back(new ImpSdXMLExpTransObj2DRotate(fNew));
     282           2 : }
     283             : 
     284           2 : void SdXMLImExTransform2D::AddTranslate(const ::basegfx::B2DTuple& rNew)
     285             : {
     286           2 :     if(!rNew.equalZero())
     287           2 :         maList.push_back(new ImpSdXMLExpTransObj2DTranslate(rNew));
     288           2 : }
     289             : 
     290           2 : void SdXMLImExTransform2D::AddSkewX(double fNew)
     291             : {
     292           2 :     if(fNew != 0.0)
     293           0 :         maList.push_back(new ImpSdXMLExpTransObj2DSkewX(fNew));
     294           2 : }
     295             : 
     296             : // gen string for export
     297           2 : const OUString& SdXMLImExTransform2D::GetExportString(const SvXMLUnitConverter& rConv)
     298             : {
     299           2 :     OUString aNewString;
     300           4 :     OUString aClosingBrace(")");
     301           4 :     OUString aEmptySpace(" ");
     302             : 
     303           2 :     const sal_uInt32 nCount = maList.size();
     304           6 :     for(sal_uInt32 a(0L); a < nCount; a++)
     305             :     {
     306           4 :         ImpSdXMLExpTransObj2DBase* pObj = maList[a];
     307           4 :         switch(pObj->mnType)
     308             :         {
     309             :             case IMP_SDXMLEXP_TRANSOBJ2D_ROTATE :
     310             :             {
     311           2 :                 aNewString += "rotate (";
     312           2 :                 Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj2DRotate*)pObj)->mfRotate);
     313           2 :                 aNewString += aClosingBrace;
     314           2 :                 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           2 :                 aNewString += "translate (";
     328           2 :                 Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj2DTranslate*)pObj)->maTranslate.getX(), true);
     329           2 :                 aNewString += aEmptySpace;
     330           2 :                 Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj2DTranslate*)pObj)->maTranslate.getY(), true);
     331           2 :                 aNewString += aClosingBrace;
     332           2 :                 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           4 :         if(a + 1UL != maList.size())
     387             :         {
     388           2 :             aNewString += aEmptySpace;
     389             :         }
     390             :     }
     391             : 
     392             :     // fill string form OUString
     393           2 :     msString = aNewString;
     394             : 
     395           4 :     return msString;
     396             : }
     397             : 
     398             : // sets new string, parses it and generates entries
     399          26 : void SdXMLImExTransform2D::SetString(const OUString& rNew, const SvXMLUnitConverter& rConv)
     400             : {
     401          26 :     msString = rNew;
     402          26 :     EmptyList();
     403             : 
     404          26 :     if(!msString.isEmpty())
     405             :     {
     406          26 :         const OUString aStr(msString.getStr(), (sal_uInt16)msString.getLength());
     407          26 :         const sal_Int32 nLen(aStr.getLength());
     408             : 
     409          52 :         const OUString aString_rotate( "rotate" );
     410          52 :         const OUString aString_scale( "scale" );
     411          52 :         const OUString aString_translate( "translate" );
     412          52 :         const OUString aString_skewX( "skewX" );
     413          52 :         const OUString aString_skewY( "skewY" );
     414          52 :         const OUString aString_matrix( "matrix" );
     415             : 
     416          26 :         sal_Int32 nPos(0);
     417             : 
     418         104 :         while(nPos < nLen)
     419             :         {
     420             :             // skip spaces
     421          52 :             Imp_SkipSpaces(aStr, nPos, nLen);
     422             : 
     423             :             // look for tag
     424          52 :             if(nPos < nLen)
     425             :             {
     426          52 :                 if(nPos == aStr.indexOf(aString_rotate, nPos))
     427             :                 {
     428          26 :                     double fValue(0.0);
     429          26 :                     nPos += 6;
     430          26 :                     Imp_SkipSpacesAndOpeningBraces(aStr, nPos, nLen);
     431          26 :                     fValue = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, fValue);
     432          26 :                     if(fValue != 0.0)
     433          26 :                         maList.push_back(new ImpSdXMLExpTransObj2DRotate(fValue));
     434             : 
     435          26 :                     Imp_SkipSpacesAndClosingBraces(aStr, nPos, nLen);
     436             :                 }
     437          26 :                 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          26 :                 else if(nPos == aStr.indexOf(aString_translate, nPos))
     452             :                 {
     453          26 :                     ::basegfx::B2DTuple aValue;
     454          26 :                     nPos += 9;
     455          26 :                     Imp_SkipSpacesAndOpeningBraces(aStr, nPos, nLen);
     456          26 :                     aValue.setX(Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.getX(), true));
     457          26 :                     Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
     458          26 :                     aValue.setY(Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.getY(), true));
     459             : 
     460          26 :                     if(!aValue.equalZero())
     461          26 :                         maList.push_back(new ImpSdXMLExpTransObj2DTranslate(aValue));
     462             : 
     463          26 :                     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          26 :         }
     529             :     }
     530          26 : }
     531             : 
     532          26 : void SdXMLImExTransform2D::GetFullTransform(::basegfx::B2DHomMatrix& rFullTrans)
     533             : {
     534          26 :     rFullTrans.identity();
     535             : 
     536          26 :     const sal_uInt32 nCount = maList.size();
     537          78 :     for(sal_uInt32 a(0L); a < nCount; a++)
     538             :     {
     539          52 :         ImpSdXMLExpTransObj2DBase* pObj = maList[a];
     540          52 :         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          26 :                 rFullTrans.rotate(((ImpSdXMLExpTransObj2DRotate*)pObj)->mfRotate * -1.0);
     551          26 :                 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          26 :                 const ::basegfx::B2DTuple& rTranslate = ((ImpSdXMLExpTransObj2DTranslate*)pObj)->maTranslate;
     562          26 :                 rFullTrans.translate(rTranslate.getX(), rTranslate.getY());
     563          26 :                 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          26 : }
     588             : 
     589             : // base class of all 3D transform objects
     590             : 
     591             : struct ImpSdXMLExpTransObj3DBase
     592             : {
     593             :     sal_uInt16                  mnType;
     594         114 :     ImpSdXMLExpTransObj3DBase(sal_uInt16 nType)
     595         114 :     :   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         114 : struct ImpSdXMLExpTransObj3DMatrix : public ImpSdXMLExpTransObj3DBase
     640             : {
     641             :     ::basegfx::B3DHomMatrix     maMatrix;
     642         114 :     ImpSdXMLExpTransObj3DMatrix(const ::basegfx::B3DHomMatrix& rNew)
     643         114 :     :   ImpSdXMLExpTransObj3DBase(IMP_SDXMLEXP_TRANSOBJ3D_MATRIX), maMatrix(rNew) {}
     644             : };
     645             : 
     646             : // delete all entries in list
     647             : 
     648         141 : void SdXMLImExTransform3D::EmptyList()
     649             : {
     650         141 :     const sal_uInt32 nCount = maList.size();
     651         255 :     for(sal_uInt32 a(0L); a < nCount; a++)
     652             :     {
     653         114 :         ImpSdXMLExpTransObj3DBase* pObj = maList[a];
     654             : 
     655         114 :         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         114 :                 delete (ImpSdXMLExpTransObj3DMatrix*)pObj;
     685         114 :                 break;
     686             :             }
     687             :             default :
     688             :             {
     689             :                 OSL_FAIL("SdXMLImExTransform3D: impossible entry!");
     690           0 :                 break;
     691             :             }
     692             :         }
     693             :     }
     694             : 
     695         141 :     maList.clear();
     696         141 : }
     697             : 
     698             : // add members
     699             : 
     700          87 : void SdXMLImExTransform3D::AddMatrix(const ::basegfx::B3DHomMatrix& rNew)
     701             : {
     702          87 :     if(!rNew.isIdentity())
     703          87 :         maList.push_back(new ImpSdXMLExpTransObj3DMatrix(rNew));
     704          87 : }
     705             : 
     706          87 : void SdXMLImExTransform3D::AddHomogenMatrix(const drawing::HomogenMatrix& xHomMat)
     707             : {
     708          87 :     ::basegfx::B3DHomMatrix aExportMatrix;
     709             : 
     710          87 :     aExportMatrix.set(0, 0, xHomMat.Line1.Column1);
     711          87 :     aExportMatrix.set(0, 1, xHomMat.Line1.Column2);
     712          87 :     aExportMatrix.set(0, 2, xHomMat.Line1.Column3);
     713          87 :     aExportMatrix.set(0, 3, xHomMat.Line1.Column4);
     714          87 :     aExportMatrix.set(1, 0, xHomMat.Line2.Column1);
     715          87 :     aExportMatrix.set(1, 1, xHomMat.Line2.Column2);
     716          87 :     aExportMatrix.set(1, 2, xHomMat.Line2.Column3);
     717          87 :     aExportMatrix.set(1, 3, xHomMat.Line2.Column4);
     718          87 :     aExportMatrix.set(2, 0, xHomMat.Line3.Column1);
     719          87 :     aExportMatrix.set(2, 1, xHomMat.Line3.Column2);
     720          87 :     aExportMatrix.set(2, 2, xHomMat.Line3.Column3);
     721          87 :     aExportMatrix.set(2, 3, xHomMat.Line3.Column4);
     722             : 
     723          87 :     AddMatrix(aExportMatrix);
     724          87 : }
     725             : 
     726             : // gen string for export
     727          87 : const OUString& SdXMLImExTransform3D::GetExportString(const SvXMLUnitConverter& rConv)
     728             : {
     729          87 :     OUString aNewString;
     730         174 :     OUString aClosingBrace(")");
     731         174 :     OUString aEmptySpace(" ");
     732             : 
     733          87 :     const sal_uInt32 nCount = maList.size();
     734         174 :     for(sal_uInt32 a(0L); a < nCount; a++)
     735             :     {
     736          87 :         ImpSdXMLExpTransObj3DBase* pObj = maList[a];
     737          87 :         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          87 :                 aNewString += "matrix (";
     785             : 
     786             :                 // a
     787          87 :                 Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(0, 0));
     788          87 :                 aNewString += aEmptySpace;
     789             : 
     790             :                 // b
     791          87 :                 Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(1, 0));
     792          87 :                 aNewString += aEmptySpace;
     793             : 
     794             :                 // c
     795          87 :                 Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(2, 0));
     796          87 :                 aNewString += aEmptySpace;
     797             : 
     798             :                 // d
     799          87 :                 Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(0, 1));
     800          87 :                 aNewString += aEmptySpace;
     801             : 
     802             :                 // e
     803          87 :                 Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(1, 1));
     804          87 :                 aNewString += aEmptySpace;
     805             : 
     806             :                 // f
     807          87 :                 Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(2, 1));
     808          87 :                 aNewString += aEmptySpace;
     809             : 
     810             :                 // g
     811          87 :                 Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(0, 2));
     812          87 :                 aNewString += aEmptySpace;
     813             : 
     814             :                 // h
     815          87 :                 Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(1, 2));
     816          87 :                 aNewString += aEmptySpace;
     817             : 
     818             :                 // i
     819          87 :                 Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(2, 2));
     820          87 :                 aNewString += aEmptySpace;
     821             : 
     822             :                 // j
     823          87 :                 Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(0, 3), true);
     824          87 :                 aNewString += aEmptySpace;
     825             : 
     826             :                 // k
     827          87 :                 Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(1, 3), true);
     828          87 :                 aNewString += aEmptySpace;
     829             : 
     830             :                 // l
     831          87 :                 Imp_PutDoubleChar(aNewString, rConv, ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix.get(2, 3), true);
     832             : 
     833          87 :                 aNewString += aClosingBrace;
     834          87 :                 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          87 :         if(a + 1UL != maList.size())
     845             :         {
     846           0 :             aNewString += aEmptySpace;
     847             :         }
     848             :     }
     849             : 
     850             :     // fill string form OUString
     851          87 :     msString = aNewString;
     852             : 
     853         174 :     return msString;
     854             : }
     855             : 
     856             : // for Import: constructor with string, parses it and generates entries
     857          27 : SdXMLImExTransform3D::SdXMLImExTransform3D(const OUString& rNew, const SvXMLUnitConverter& rConv)
     858             : {
     859          27 :     SetString(rNew, rConv);
     860          27 : }
     861             : 
     862             : // sets new string, parses it and generates entries
     863          27 : void SdXMLImExTransform3D::SetString(const OUString& rNew, const SvXMLUnitConverter& rConv)
     864             : {
     865          27 :     msString = rNew;
     866          27 :     EmptyList();
     867             : 
     868          27 :     if(!msString.isEmpty())
     869             :     {
     870          27 :         const OUString aStr(msString.getStr(), (sal_uInt16)msString.getLength());
     871          27 :         const sal_Int32 nLen(aStr.getLength());
     872             : 
     873          54 :         const OUString aString_rotatex( "rotatex" );
     874          54 :         const OUString aString_rotatey( "rotatey" );
     875          54 :         const OUString aString_rotatez( "rotatez" );
     876          54 :         const OUString aString_scale( "scale" );
     877          54 :         const OUString aString_translate( "translate" );
     878          54 :         const OUString aString_matrix( "matrix" );
     879             : 
     880          27 :         sal_Int32 nPos(0);
     881             : 
     882          81 :         while(nPos < nLen)
     883             :         {
     884             :             // skip spaces
     885          27 :             Imp_SkipSpaces(aStr, nPos, nLen);
     886             : 
     887             :             // look for tag
     888          27 :             if(nPos < nLen)
     889             :             {
     890          27 :                 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          27 :                 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          27 :                 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          27 :                 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          27 :                 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          27 :                 else if(nPos == aStr.indexOf(aString_matrix, nPos))
     961             :                 {
     962          27 :                     ::basegfx::B3DHomMatrix aValue;
     963             : 
     964          27 :                     nPos += 6;
     965          27 :                     Imp_SkipSpacesAndOpeningBraces(aStr, nPos, nLen);
     966             : 
     967             :                     // a
     968          27 :                     aValue.set(0, 0, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(0, 0)));
     969          27 :                     Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
     970             : 
     971             :                     // b
     972          27 :                     aValue.set(1, 0, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(1, 0)));
     973          27 :                     Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
     974             : 
     975             :                     // c
     976          27 :                     aValue.set(2, 0, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(2, 0)));
     977          27 :                     Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
     978             : 
     979             :                     // d
     980          27 :                     aValue.set(0, 1, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(0, 1)));
     981          27 :                     Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
     982             : 
     983             :                     // e
     984          27 :                     aValue.set(1, 1, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(1, 1)));
     985          27 :                     Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
     986             : 
     987             :                     // f
     988          27 :                     aValue.set(2, 1, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(2, 1)));
     989          27 :                     Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
     990             : 
     991             :                     // g
     992          27 :                     aValue.set(0, 2, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(0, 2)));
     993          27 :                     Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
     994             : 
     995             :                     // h
     996          27 :                     aValue.set(1, 2, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(1, 2)));
     997          27 :                     Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
     998             : 
     999             :                     // i
    1000          27 :                     aValue.set(2, 2, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(2, 2)));
    1001          27 :                     Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
    1002             : 
    1003             :                     // j
    1004          27 :                     aValue.set(0, 3, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(0, 3), true));
    1005          27 :                     Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
    1006             : 
    1007             :                     // k
    1008          27 :                     aValue.set(1, 3, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(1, 3), true));
    1009          27 :                     Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
    1010             : 
    1011             :                     // l
    1012          27 :                     aValue.set(2, 3, Imp_GetDoubleChar(aStr, nPos, nLen, rConv, aValue.get(2, 3), true));
    1013          27 :                     Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
    1014             : 
    1015          27 :                     if(!aValue.isIdentity())
    1016          27 :                         maList.push_back(new ImpSdXMLExpTransObj3DMatrix(aValue));
    1017             : 
    1018          27 :                     Imp_SkipSpacesAndClosingBraces(aStr, nPos, nLen);
    1019             :                 }
    1020             :                 else
    1021             :                 {
    1022           0 :                     nPos++;
    1023             :                 }
    1024             :             }
    1025          27 :         }
    1026             :     }
    1027          27 : }
    1028             : 
    1029          27 : bool SdXMLImExTransform3D::GetFullHomogenTransform(com::sun::star::drawing::HomogenMatrix& xHomMat)
    1030             : {
    1031          27 :     ::basegfx::B3DHomMatrix aFullTransform;
    1032          27 :     GetFullTransform(aFullTransform);
    1033             : 
    1034          27 :     if(!aFullTransform.isIdentity())
    1035             :     {
    1036          27 :         xHomMat.Line1.Column1 = aFullTransform.get(0, 0);
    1037          27 :         xHomMat.Line1.Column2 = aFullTransform.get(0, 1);
    1038          27 :         xHomMat.Line1.Column3 = aFullTransform.get(0, 2);
    1039          27 :         xHomMat.Line1.Column4 = aFullTransform.get(0, 3);
    1040             : 
    1041          27 :         xHomMat.Line2.Column1 = aFullTransform.get(1, 0);
    1042          27 :         xHomMat.Line2.Column2 = aFullTransform.get(1, 1);
    1043          27 :         xHomMat.Line2.Column3 = aFullTransform.get(1, 2);
    1044          27 :         xHomMat.Line2.Column4 = aFullTransform.get(1, 3);
    1045             : 
    1046          27 :         xHomMat.Line3.Column1 = aFullTransform.get(2, 0);
    1047          27 :         xHomMat.Line3.Column2 = aFullTransform.get(2, 1);
    1048          27 :         xHomMat.Line3.Column3 = aFullTransform.get(2, 2);
    1049          27 :         xHomMat.Line3.Column4 = aFullTransform.get(2, 3);
    1050             : 
    1051          27 :         xHomMat.Line4.Column1 = aFullTransform.get(3, 0);
    1052          27 :         xHomMat.Line4.Column2 = aFullTransform.get(3, 1);
    1053          27 :         xHomMat.Line4.Column3 = aFullTransform.get(3, 2);
    1054          27 :         xHomMat.Line4.Column4 = aFullTransform.get(3, 3);
    1055             : 
    1056          27 :         return true;
    1057             :     }
    1058             : 
    1059           0 :     return false;
    1060             : }
    1061             : 
    1062          27 : void SdXMLImExTransform3D::GetFullTransform(::basegfx::B3DHomMatrix& rFullTrans)
    1063             : {
    1064          27 :     rFullTrans.identity();
    1065             : 
    1066          27 :     const sal_uInt32 nCount = maList.size();
    1067          54 :     for(sal_uInt32 a(0L); a < nCount; a++)
    1068             :     {
    1069          27 :         ImpSdXMLExpTransObj3DBase* pObj = maList[a];
    1070          27 :         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          27 :                 rFullTrans *= ((ImpSdXMLExpTransObj3DMatrix*)pObj)->maMatrix;
    1102          27 :                 break;
    1103             :             }
    1104             :             default :
    1105             :             {
    1106             :                 OSL_FAIL("SdXMLImExTransform3D: impossible entry!");
    1107           0 :                 break;
    1108             :             }
    1109             :         }
    1110             :     }
    1111          27 : }
    1112             : 
    1113          24 : SdXMLImExViewBox::SdXMLImExViewBox(double fX, double fY, double fW, double fH)
    1114             : :   mfX( fX ),
    1115             :     mfY( fY ),
    1116             :     mfW( fW ),
    1117          24 :     mfH( fH )
    1118             : {
    1119          24 : }
    1120             : 
    1121             : // #100617# Asked vincent hardy: svg:viewBox values may be double precision.
    1122         157 : SdXMLImExViewBox::SdXMLImExViewBox(const OUString& rNew, const SvXMLUnitConverter& rConv)
    1123             : :   msString(rNew),
    1124             :     mfX( 0.0 ),
    1125             :     mfY( 0.0 ),
    1126             :     mfW( 1000.0 ),
    1127         157 :     mfH( 1000.0 )
    1128             : {
    1129         157 :     if(!msString.isEmpty())
    1130             :     {
    1131         157 :         const OUString aStr(msString.getStr(), (sal_uInt16)msString.getLength());
    1132         157 :         const sal_Int32 nLen(aStr.getLength());
    1133         157 :         sal_Int32 nPos(0);
    1134             : 
    1135             :         // skip starting spaces
    1136         157 :         Imp_SkipSpaces(aStr, nPos, nLen);
    1137             : 
    1138             :         // get mX, #100617# be prepared for doubles
    1139         157 :         mfX = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, mfX);
    1140             : 
    1141             :         // skip spaces and commas
    1142         157 :         Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
    1143             : 
    1144             :         // get mY, #100617# be prepared for doubles
    1145         157 :         mfY = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, mfY);
    1146             : 
    1147             :         // skip spaces and commas
    1148         157 :         Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
    1149             : 
    1150             :         // get mW, #100617# be prepared for doubles
    1151         157 :         mfW = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, mfW);
    1152             : 
    1153             :         // skip spaces and commas
    1154         157 :         Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
    1155             : 
    1156             :         // get mH, #100617# be prepared for doubles
    1157         157 :         mfH = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, mfH);
    1158             :     }
    1159         157 : }
    1160             : 
    1161          24 : const OUString& SdXMLImExViewBox::GetExportString()
    1162             : {
    1163          24 :     OUString aNewString;
    1164          48 :     OUString aEmptySpace(" ");
    1165             : 
    1166          24 :     Imp_PutDoubleChar(aNewString, mfX);
    1167          24 :     aNewString += aEmptySpace;
    1168             : 
    1169          24 :     Imp_PutDoubleChar(aNewString, mfY);
    1170          24 :     aNewString += aEmptySpace;
    1171             : 
    1172          24 :     Imp_PutDoubleChar(aNewString, mfW);
    1173          24 :     aNewString += aEmptySpace;
    1174             : 
    1175          24 :     Imp_PutDoubleChar(aNewString, mfH);
    1176             : 
    1177             :     // set new string
    1178          24 :     msString = aNewString;
    1179             : 
    1180          48 :     return msString;
    1181             : }
    1182             : 
    1183             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10