You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by al...@apache.org on 2013/10/29 15:11:46 UTC

svn commit: r1536730 [4/5] - in /openoffice/trunk/main: basegfx/inc/basegfx/polygon/ basegfx/source/inc/ basegfx/source/polygon/ basegfx/source/tools/ basegfx/test/ canvas/source/tools/ sd/source/core/ sdext/source/pdfimport/test/ sdext/source/pdfimpor...

Modified: openoffice/trunk/main/xmloff/source/draw/xexptran.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/xmloff/source/draw/xexptran.cxx?rev=1536730&r1=1536729&r2=1536730&view=diff
==============================================================================
--- openoffice/trunk/main/xmloff/source/draw/xexptran.cxx (original)
+++ openoffice/trunk/main/xmloff/source/draw/xexptran.cxx Tue Oct 29 14:11:45 2013
@@ -237,6 +237,13 @@ double Imp_GetDoubleChar(const OUString&
 	return fRetval;
 }
 
+void Imp_PutDoubleChar(OUString& rStr, double fValue)
+{
+    OUStringBuffer sStringBuffer;
+    SvXMLUnitConverter::convertDouble(sStringBuffer, fValue);
+    rStr += OUString(sStringBuffer.makeStringAndClear());
+}
+
 void Imp_PutDoubleChar(OUString& rStr, const SvXMLUnitConverter& rConv, double fValue, 
 	bool bConvertUnits = false)
 {
@@ -1273,1843 +1280,74 @@ void SdXMLImExTransform3D::GetFullTransf
 //////////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////////
 
-SdXMLImExViewBox::SdXMLImExViewBox(sal_Int32 nX, sal_Int32 nY, sal_Int32 nW, sal_Int32 nH)
-:	mnX( nX ),
-	mnY( nY ),
-	mnW( nW ),
-	mnH( nH )
+SdXMLImExViewBox::SdXMLImExViewBox(double fX, double fY, double fW, double fH)
+:	mfX( fX ),
+    mfY( fY ),
+    mfW( fW ),
+    mfH( fH )
 {
 }
 
 // #100617# Asked vincent hardy: svg:viewBox values may be double precision.
 SdXMLImExViewBox::SdXMLImExViewBox(const OUString& rNew, const SvXMLUnitConverter& rConv)
 :	msString(rNew),
-	mnX( 0L ),
-	mnY( 0L ),
-	mnW( 1000L ),
-	mnH( 1000L )
-{
-	if(msString.getLength())
-	{
-		const OUString aStr(msString.getStr(), (sal_uInt16)msString.getLength());
-		const sal_Int32 nLen(aStr.getLength());
-		sal_Int32 nPos(0);
-
-		// skip starting spaces
-		Imp_SkipSpaces(aStr, nPos, nLen);
-	
-		// get mX, #100617# be prepared for doubles
-		mnX = FRound(Imp_GetDoubleChar(aStr, nPos, nLen, rConv, (double)mnX));
-
-		// skip spaces and commas
-		Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
-	
-		// get mY, #100617# be prepared for doubles
-		mnY = FRound(Imp_GetDoubleChar(aStr, nPos, nLen, rConv, (double)mnY));
-
-		// skip spaces and commas
-		Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
-	
-		// get mW, #100617# be prepared for doubles
-		mnW = FRound(Imp_GetDoubleChar(aStr, nPos, nLen, rConv, (double)mnW));
-
-		// skip spaces and commas
-		Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
-	
-		// get mH, #100617# be prepared for doubles
-		mnH = FRound(Imp_GetDoubleChar(aStr, nPos, nLen, rConv, (double)mnH));
-	}
+    mfX( 0.0 ),
+    mfY( 0.0 ),
+    mfW( 1000.0 ),
+    mfH( 1000.0 )
+{
+    if(msString.getLength())
+    {
+        const OUString aStr(msString.getStr(), (sal_uInt16)msString.getLength());
+        const sal_Int32 nLen(aStr.getLength());
+        sal_Int32 nPos(0);
+
+        // skip starting spaces
+        Imp_SkipSpaces(aStr, nPos, nLen);
+    
+        // get mX, #100617# be prepared for doubles
+        mfX = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, mfX);
+
+        // skip spaces and commas
+        Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
+    
+        // get mY, #100617# be prepared for doubles
+        mfY = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, mfY);
+
+        // skip spaces and commas
+        Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
+    
+        // get mW, #100617# be prepared for doubles
+        mfW = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, mfW);
+
+        // skip spaces and commas
+        Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
+    
+        // get mH, #100617# be prepared for doubles
+        mfH = Imp_GetDoubleChar(aStr, nPos, nLen, rConv, mfH);
+    }
 }
 
 const OUString& SdXMLImExViewBox::GetExportString()
 {
-	OUString aNewString;
-	OUString aEmptySpace(sal_Unicode(' '));
-
-	Imp_PutNumberChar(aNewString, mnX);
-	aNewString += aEmptySpace;
-	
-	Imp_PutNumberChar(aNewString, mnY);
-	aNewString += aEmptySpace;
-	
-	Imp_PutNumberChar(aNewString, mnW);
-	aNewString += aEmptySpace;
-	
-	Imp_PutNumberChar(aNewString, mnH);
-
-	// set new string
-	msString = aNewString;
-
-	return msString;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-SdXMLImExPointsElement::SdXMLImExPointsElement(drawing::PointSequence* pPoints, 
-	const SdXMLImExViewBox& rViewBox,
-	const awt::Point& rObjectPos,
-	const awt::Size& rObjectSize,
-	// #96328#
-	const bool bClosed)
-:	maPoly( 0L )
-{
-	DBG_ASSERT(pPoints, "Empty PointSequence handed over to SdXMLImExPointsElement(!)");
-
-	// add polygon to string
-	sal_Int32 nCnt(pPoints->getLength());
-
-	// #104076# Convert to string only when at last one point included
-	if(nCnt > 0)
-	{
-		OUString aNewString;
-		awt::Point* pArray = pPoints->getArray();
-
-		// last point same? Ignore it.
-		// #96328# ...but only when polygon is CLOSED
-		if(bClosed && (pArray->X == (pArray + (nCnt - 1))->X) && (pArray->Y == (pArray + (nCnt - 1))->Y))
-			nCnt--;
-
-		// object size and ViewBox size different?
-		bool bScale(rObjectSize.Width != rViewBox.GetWidth() 
-			|| rObjectSize.Height != rViewBox.GetHeight());
-		bool bTranslate(rViewBox.GetX() != 0L || rViewBox.GetY() != 0L);
-
-		for(sal_Int32 a(0L); a < nCnt; a++)
-		{
-			// prepare coordinates
-			sal_Int32 nX( pArray->X - rObjectPos.X );
-			sal_Int32 nY( pArray->Y - rObjectPos.Y );
-
-			if(bScale && rObjectSize.Width && rObjectSize.Height)
-			{
-				nX = (nX * rViewBox.GetWidth()) / rObjectSize.Width;
-				nY = (nY * rViewBox.GetHeight()) / rObjectSize.Height;
-			}
-
-			if(bTranslate)
-			{
-				nX += rViewBox.GetX();
-				nY += rViewBox.GetY();
-			}
-
-			// X and comma
-			Imp_PutNumberChar(aNewString, nX);
-			aNewString += String(sal_Unicode(','));
-
-			// Y and space (not for last)
-			Imp_PutNumberChar(aNewString, nY);
-			if(a + 1 != nCnt)
-				aNewString += String(sal_Unicode(' '));
-
-			// next point
-			pArray++;
-		}
-
-		// set new string
-		msString = aNewString;
-	}
-}
-
-// #100617# svg:polyline or svg:polygon values may be double precision.
-SdXMLImExPointsElement::SdXMLImExPointsElement(const OUString& rNew, 
-	const SdXMLImExViewBox& rViewBox,
-	const awt::Point& rObjectPos,
-	const awt::Size& rObjectSize,
-	const SvXMLUnitConverter& rConv)
-:	msString( rNew ),
-	maPoly( 0L )
-{
-	// convert string to polygon
-	const OUString aStr(msString.getStr(), (sal_uInt16)msString.getLength());
-	const sal_Int32 nLen(aStr.getLength());
-	sal_Int32 nPos(0);
-	sal_Int32 nNumPoints(0L);
-
-	// skip starting spaces
-	Imp_SkipSpaces(aStr, nPos, nLen);
-
-	// count points in first loop
-	while(nPos < nLen)
-	{
-		// skip number, #100617# be prepared for doubles
-		Imp_SkipDouble(aStr, nPos, nLen);
-
-		// skip spaces and commas
-		Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
-	
-		// skip number, #100617# be prepared for doubles
-		Imp_SkipDouble(aStr, nPos, nLen);
-
-		// skip spaces and commas
-		Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
-
-		// one more point
-		nNumPoints++;
-	}
-
-	// second loop
-	if(nNumPoints)
-	{
-        nPos = 0;
-        maPoly.realloc(1);
-		drawing::PointSequence* pOuterSequence = maPoly.getArray();
-		pOuterSequence->realloc(nNumPoints);
-		awt::Point* pInnerSequence = pOuterSequence->getArray();
-
-		// object size and ViewBox size different?
-		bool bScale(rObjectSize.Width != rViewBox.GetWidth() 
-			|| rObjectSize.Height != rViewBox.GetHeight());
-		bool bTranslate(rViewBox.GetX() != 0L || rViewBox.GetY() != 0L);
-
-		// skip starting spaces
-		Imp_SkipSpaces(aStr, nPos, nLen);
-		
-		while(nPos < nLen)
-		{
-			// prepare new parameter pair
-			sal_Int32 nX(0L);
-			sal_Int32 nY(0L);
-
-			// get mX, #100617# be prepared for doubles
-			nX = FRound(Imp_GetDoubleChar(aStr, nPos, nLen, rConv, (double)nX));
-
-			// skip spaces and commas
-			Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
-		
-			// get mY, #100617# be prepared for doubles
-			nY = FRound(Imp_GetDoubleChar(aStr, nPos, nLen, rConv, (double)nY));
-
-			// skip spaces and commas
-			Imp_SkipSpacesAndCommas(aStr, nPos, nLen);
-
-			// prepare parameters
-			if(bTranslate)
-			{
-				nX -= rViewBox.GetX();
-				nY -= rViewBox.GetY();
-			}
-
-			if(bScale && rViewBox.GetWidth() && rViewBox.GetHeight() )
-			{
-				nX = (nX * rObjectSize.Width) / rViewBox.GetWidth();
-				nY = (nY * rObjectSize.Height) / rViewBox.GetHeight();
-			}
-
-			nX += rObjectPos.X;
-			nY += rObjectPos.Y;
-
-			// add new point
-			*pInnerSequence = awt::Point( nX, nY );
-			pInnerSequence++;
-		}
-	}
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-SdXMLImExSvgDElement::SdXMLImExSvgDElement(const SdXMLImExViewBox& rViewBox)
-:	mrViewBox( rViewBox ),
-	mbIsClosed( false ),
-	mbIsCurve( false ),
-	mnLastX( 0L ),
-	mnLastY( 0L ),
-	maPoly( 0L ),
-	maFlag( 0L )
-{
-}
-
-void Imp_GetPrevPos(awt::Point*& pPrevPos1, 
-	drawing::PolygonFlags& aPrevFlag1, 
-	const bool bClosed, awt::Point* pPoints, 
-	drawing::PolygonFlags* pFlags, const sal_Int32 nPos, 
-	const sal_Int32 nCnt, const sal_Int32 nAdd)
-{
-	if(bClosed)
-	{
-		pPrevPos1 = pPoints + ((nPos + nCnt - nAdd) % nCnt);
-		aPrevFlag1 = *(pFlags + ((nPos + nCnt - nAdd) % nCnt));
-	}
-	else if(nPos > (nAdd - 1))
-	{
-		pPrevPos1 = pPoints + (nPos - nAdd);
-		aPrevFlag1 = *(pFlags + (nPos - nAdd));
-	}
-	else
-		pPrevPos1 = 0L;
-}
-
-void Imp_PrepareCoorExport(sal_Int32& nX, sal_Int32& nY, 
-	const awt::Point* pPointArray, const awt::Point& rObjectPos,
-	const awt::Size& rObjectSize, const SdXMLImExViewBox& mrViewBox, 
-	const bool bScale, const bool bTranslate)
-{
-	nX = pPointArray->X - rObjectPos.X;
-	nY = pPointArray->Y - rObjectPos.Y;
-
-	if(bScale && rObjectSize.Width && rObjectSize.Height )
-	{
-		nX = (nX * mrViewBox.GetWidth()) / rObjectSize.Width;
-		nY = (nY * mrViewBox.GetHeight()) / rObjectSize.Height;
-	}
-
-	if(bTranslate)
-	{
-		nX += mrViewBox.GetX();
-		nY += mrViewBox.GetY();
-	}
-}
-
-//#define TEST_QUADRATIC_CURVES
-#ifdef TEST_QUADRATIC_CURVES
-// To be able to test quadratic curve code: The code concerning to
-// bDoTestHere can be used (see below). Construct shapes which have their control
-// points on equal coordinates. When these are written, they can be
-// forced to create correct 'Q' and 'T' statements using this flag.
-// These may then be tested for import/exporting.
-static bool bDoTestHere(true);
-#endif // TEST_QUADRATIC_CURVES
-
-void SdXMLImExSvgDElement::AddPolygon(
-	drawing::PointSequence* pPoints, 
-	drawing::FlagSequence* pFlags,
-	const awt::Point& rObjectPos,
-	const awt::Size& rObjectSize,
-	bool bClosed, bool bRelative)
-{
-	DBG_ASSERT(pPoints, "Empty PointSequence handed over to SdXMLImExSvgDElement(!)");
-
-	sal_Int32 nCnt(pPoints->getLength());
-
-	// #104076# Convert to string only when at last one point included
-	if(nCnt > 0)
-	{
-		// append polygon to string
-		OUString aNewString;
-		sal_Unicode aLastCommand = ' ';
-		awt::Point* pPointArray = pPoints->getArray();
-
-		// are the flags used at all? If not forget about them
-		if(pFlags)
-		{
-			sal_Int32 nFlagCnt(pFlags->getLength());
-
-			if(nFlagCnt)
-			{
-				bool bFlagsUsed(false);
-				drawing::PolygonFlags* pFlagArray = pFlags->getArray();
+    OUString aNewString;
+    OUString aEmptySpace(sal_Unicode(' '));
 
-				for(sal_Int32 a(0); !bFlagsUsed && a < nFlagCnt; a++)
-					if(drawing::PolygonFlags_NORMAL != *pFlagArray++)
-						bFlagsUsed = true;
+    Imp_PutDoubleChar(aNewString, mfX);
+    aNewString += aEmptySpace;
+    
+    Imp_PutDoubleChar(aNewString, mfY);
+    aNewString += aEmptySpace;
+    
+    Imp_PutDoubleChar(aNewString, mfW);
+    aNewString += aEmptySpace;
+    
+    Imp_PutDoubleChar(aNewString, mfH);
 
-				if(!bFlagsUsed)
-					pFlags = 0L;
-			}
-			else
-			{
-				pFlags = 0L;
-			}
-		}
+    // set new string
+    msString = aNewString;
 
-		// object size and ViewBox size different?
-		bool bScale(rObjectSize.Width != mrViewBox.GetWidth() 
-			|| rObjectSize.Height != mrViewBox.GetHeight());
-		bool bTranslate(mrViewBox.GetX() != 0L || mrViewBox.GetY() != 0L);
-
-		// #87202# rework of point reduction:
-		// Test for Last point same -> closed, ignore last point. Take
-		// some more circumstances in account when looking at curve segments.
-		drawing::PolygonFlags* pFlagArray = (pFlags) ? pFlags->getArray() : 0L;
-		
-        // #121090# only reduce double start/end points if polygon *is* closed
-        if(bClosed && (pPointArray->X == (pPointArray + (nCnt - 1))->X) && (pPointArray->Y == (pPointArray + (nCnt - 1))->Y))
-		{
-			if(pFlags)
-			{
-				// point needs to be ignored if point before it is
-				// NO control point. Else the last point is needed
-				// for exporting the last segment of the curve. That means
-				// that the last and the first point will be saved double,
-				// but SVG does not support a better solution here.
-				if(nCnt >= 2 && drawing::PolygonFlags_CONTROL != *(pFlagArray + (nCnt - 2)))
-				{
-					nCnt--;
-				}
-			}
-			else
-			{
-				// no curve, ignore last point
-				nCnt--;
-			}
-		}
-
-		// bezier poly, handle curves
-		bool  bDidWriteStart(false);
-
-		for(sal_Int32 a(0L); a < nCnt; a++)
-		{
-			if(!pFlags || drawing::PolygonFlags_CONTROL != *pFlagArray)
-			{
-				bool bDidWriteAsCurve(false);
-
-				if(bDidWriteStart)
-				{
-					if(pFlags)
-					{
-						// real curve point, get previous to see if it's a control point
-						awt::Point* pPrevPos1;
-						drawing::PolygonFlags aPrevFlag1;
-
-						Imp_GetPrevPos(pPrevPos1, aPrevFlag1, bClosed, pPoints->getArray(), 
-							pFlags->getArray(), a, nCnt, 1);
-
-						if(pPrevPos1 && drawing::PolygonFlags_CONTROL == aPrevFlag1)
-						{
-							// get previous2 to see if it's a control point, too
-							awt::Point* pPrevPos2;
-							drawing::PolygonFlags aPrevFlag2;
-
-							Imp_GetPrevPos(pPrevPos2, aPrevFlag2, bClosed, pPoints->getArray(), 
-								pFlags->getArray(), a, nCnt, 2);
-
-							if(pPrevPos2 && drawing::PolygonFlags_CONTROL == aPrevFlag2)
-							{
-								// get previous3 to see if it's a curve point and if,
-								// if it is fully symmetric or not
-								awt::Point* pPrevPos3;
-								drawing::PolygonFlags aPrevFlag3;
-
-								Imp_GetPrevPos(pPrevPos3, aPrevFlag3, bClosed, pPoints->getArray(), 
-									pFlags->getArray(), a, nCnt, 3);
-
-								if(pPrevPos3)
-								{
-									// prepare coordinates
-									sal_Int32 nX, nY;
-
-									Imp_PrepareCoorExport(nX, nY, pPointArray, rObjectPos, rObjectSize, 
-										mrViewBox, bScale, bTranslate);
-
-									// #100617# test if this curve segment may be written as
-									// a quadratic bezier
-									// That's the case if both control points are in the same place
-									// when they are prolonged to the common quadratic control point
-									// Left:  P = (3P1 - P0) / 2
-									// Right: P = (3P2 - P3) / 2
-									bool bIsQuadratic(false);
-									const bool bEnableSaveQuadratic(false);
-
-									sal_Int32 nPX_L(FRound((double)((3 * pPrevPos2->X) - pPrevPos3->X) / 2.0));
-									sal_Int32 nPY_L(FRound((double)((3 * pPrevPos2->Y) - pPrevPos3->Y) / 2.0));
-									sal_Int32 nPX_R(FRound((double)((3 * pPrevPos1->X) - pPointArray->X) / 2.0));
-									sal_Int32 nPY_R(FRound((double)((3 * pPrevPos1->Y) - pPointArray->Y) / 2.0));
-									sal_Int32 nDist(0);
-									
-									if(nPX_L != nPX_R)
-									{
-										nDist += abs(nPX_L - nPX_R);
-									}
-
-									if(nPY_L != nPY_R)
-									{
-										nDist += abs(nPY_L - nPY_R);
-									}
-									
-									if(nDist <= BORDER_INTEGERS_ARE_EQUAL)
-									{
-										if(bEnableSaveQuadratic)
-										{
-											bIsQuadratic = true;
-										}
-									}
-
-#ifdef TEST_QUADRATIC_CURVES
-									if(bDoTestHere)
-									{
-										bIsQuadratic = false;
-
-										if(pPrevPos1->X == pPrevPos2->X && pPrevPos1->Y == pPrevPos2->Y)
-											bIsQuadratic = true;
-									}
-#endif // TEST_QUADRATIC_CURVES
-
-									if(bIsQuadratic)
-									{
-#ifdef TEST_QUADRATIC_CURVES
-										if(bDoTestHere)
-										{
-											bool bPrevPointIsSymmetric(false);
-
-											if(drawing::PolygonFlags_SYMMETRIC == aPrevFlag3)
-											{
-												// get previous4 to see if it's a control point
-												awt::Point* pPrevPos4;
-												drawing::PolygonFlags aPrevFlag4;
-
-												Imp_GetPrevPos(pPrevPos4, aPrevFlag4, bClosed, pPoints->getArray(), 
-													pFlags->getArray(), a, nCnt, 4);
-
-												if(drawing::PolygonFlags_CONTROL == aPrevFlag4)
-												{
-													// okay, prevPos3 is symmetric (c2) and prevPos4
-													// is existing control point, the 's' statement can be used
-													bPrevPointIsSymmetric = true;
-												}
-											}
-
-											if(bPrevPointIsSymmetric)
-											{
-												// write a shorthand/smooth quadratic curveto entry (T)
-												if(bRelative)
-												{
-													if(aLastCommand != sal_Unicode('t'))
-														aNewString += OUString(sal_Unicode('t'));
-
-													Imp_PutNumberCharWithSpace(aNewString, nX - mnLastX);
-													Imp_PutNumberCharWithSpace(aNewString, nY - mnLastY);
-
-													aLastCommand = sal_Unicode('t');
-												}
-												else
-												{
-													if(aLastCommand != sal_Unicode('T'))
-														aNewString += OUString(sal_Unicode('T'));
-
-													Imp_PutNumberCharWithSpace(aNewString, nX);
-													Imp_PutNumberCharWithSpace(aNewString, nY);
-
-													aLastCommand = sal_Unicode('T');
-												}
-											}
-											else
-											{
-												// prepare coordinates
-												sal_Int32 nX1, nY1;
-												
-												Imp_PrepareCoorExport(nX1, nY1, pPrevPos1, rObjectPos, rObjectSize, 
-													mrViewBox, bScale, bTranslate);
-												
-												// write a quadratic curveto entry (Q)
-												if(bRelative)
-												{
-													if(aLastCommand != sal_Unicode('q'))
-														aNewString += OUString(sal_Unicode('q'));
-
-													Imp_PutNumberCharWithSpace(aNewString, nX1 - mnLastX);
-													Imp_PutNumberCharWithSpace(aNewString, nY1 - mnLastY);
-													Imp_PutNumberCharWithSpace(aNewString, nX - mnLastX);
-													Imp_PutNumberCharWithSpace(aNewString, nY - mnLastY);
-
-													aLastCommand = sal_Unicode('q');
-												}
-												else
-												{
-													if(aLastCommand != sal_Unicode('Q'))
-														aNewString += OUString(sal_Unicode('Q'));
-
-													Imp_PutNumberCharWithSpace(aNewString, nX1);
-													Imp_PutNumberCharWithSpace(aNewString, nY1);
-													Imp_PutNumberCharWithSpace(aNewString, nX);
-													Imp_PutNumberCharWithSpace(aNewString, nY);
-
-													aLastCommand = sal_Unicode('Q');
-												}
-											}
-										}
-										else
-										{
-#endif // TEST_QUADRATIC_CURVES
-											awt::Point aNewPoint(nPX_L, nPY_L);
-											bool bPrevPointIsSmooth(false);
-
-											if(drawing::PolygonFlags_SMOOTH == aPrevFlag3)
-											{
-												// get previous4 to see if it's a control point
-												awt::Point* pPrevPos4;
-												drawing::PolygonFlags aPrevFlag4;
-
-												Imp_GetPrevPos(pPrevPos4, aPrevFlag4, bClosed, pPoints->getArray(), 
-													pFlags->getArray(), a, nCnt, 4);
-
-												if(drawing::PolygonFlags_CONTROL == aPrevFlag4)
-												{
-													// okay, prevPos3 is smooth (c1) and prevPos4
-													// is existing control point. Test if it's even symmetric
-													// and thus the 'T' statement may be used.
-													::basegfx::B2DVector aVec1(pPrevPos4->X - pPrevPos3->X, pPrevPos4->Y - pPrevPos3->Y);
-													::basegfx::B2DVector aVec2(aNewPoint.X - pPrevPos3->X, aNewPoint.Y - pPrevPos3->Y);
-													bool bSameLength(false);
-													bool bSameDirection(false);
-
-													// get vector values
-													Imp_CalcVectorValues(aVec1, aVec2, bSameLength, bSameDirection);
-
-													if(bSameLength && bSameDirection)
-														bPrevPointIsSmooth = true;
-												}
-											}
-
-											if(bPrevPointIsSmooth)
-											{
-												// write a shorthand/smooth quadratic curveto entry (T)
-												if(bRelative)
-												{
-													if(aLastCommand != sal_Unicode('t'))
-														aNewString += String(sal_Unicode('t'));
-
-													Imp_PutNumberCharWithSpace(aNewString, nX - mnLastX);
-													Imp_PutNumberCharWithSpace(aNewString, nY - mnLastY);
-
-													aLastCommand = sal_Unicode('t');
-												}
-												else
-												{
-													if(aLastCommand != sal_Unicode('T'))
-														aNewString += String(sal_Unicode('T'));
-
-													Imp_PutNumberCharWithSpace(aNewString, nX);
-													Imp_PutNumberCharWithSpace(aNewString, nY);
-
-													aLastCommand = sal_Unicode('T');
-												}
-											}
-											else
-											{
-												// prepare coordinates
-												sal_Int32 nX1, nY1;
-												
-												Imp_PrepareCoorExport(nX1, nY1, &aNewPoint, rObjectPos, rObjectSize, 
-													mrViewBox, bScale, bTranslate);
-												
-												// write a quadratic curveto entry (Q)
-												if(bRelative)
-												{
-													if(aLastCommand != sal_Unicode('q'))
-														aNewString += String(sal_Unicode('q'));
-
-													Imp_PutNumberCharWithSpace(aNewString, nX1 - mnLastX);
-													Imp_PutNumberCharWithSpace(aNewString, nY1 - mnLastY);
-													Imp_PutNumberCharWithSpace(aNewString, nX - mnLastX);
-													Imp_PutNumberCharWithSpace(aNewString, nY - mnLastY);
-
-													aLastCommand = sal_Unicode('q');
-												}
-												else
-												{
-													if(aLastCommand != sal_Unicode('Q'))
-														aNewString += String(sal_Unicode('Q'));
-
-													Imp_PutNumberCharWithSpace(aNewString, nX1);
-													Imp_PutNumberCharWithSpace(aNewString, nY1);
-													Imp_PutNumberCharWithSpace(aNewString, nX);
-													Imp_PutNumberCharWithSpace(aNewString, nY);
-
-													aLastCommand = sal_Unicode('Q');
-												}
-											}
-#ifdef TEST_QUADRATIC_CURVES
-										}
-#endif // TEST_QUADRATIC_CURVES
-									}
-									else
-									{
-										bool bPrevPointIsSymmetric(false);
-
-										if(drawing::PolygonFlags_SYMMETRIC == aPrevFlag3)
-										{
-											// get previous4 to see if it's a control point
-											awt::Point* pPrevPos4;
-											drawing::PolygonFlags aPrevFlag4;
-
-											Imp_GetPrevPos(pPrevPos4, aPrevFlag4, bClosed, pPoints->getArray(), 
-												pFlags->getArray(), a, nCnt, 4);
-
-											if(drawing::PolygonFlags_CONTROL == aPrevFlag4)
-											{
-												// okay, prevPos3 is symmetric (c2) and prevPos4
-												// is existing control point, the 's' statement can be used
-												bPrevPointIsSymmetric = true;
-											}
-										}
-
-										// prepare coordinates
-										sal_Int32 nX2, nY2;
-
-										Imp_PrepareCoorExport(nX2, nY2, pPrevPos1, rObjectPos, rObjectSize, 
-											mrViewBox, bScale, bTranslate);
-
-										if(bPrevPointIsSymmetric)
-										{
-											// write a shorthand/smooth curveto entry (S)
-											if(bRelative)
-											{
-												if(aLastCommand != sal_Unicode('s'))
-													aNewString += String(sal_Unicode('s'));
-
-												Imp_PutNumberCharWithSpace(aNewString, nX2 - mnLastX);
-												Imp_PutNumberCharWithSpace(aNewString, nY2 - mnLastY);
-												Imp_PutNumberCharWithSpace(aNewString, nX - mnLastX);
-												Imp_PutNumberCharWithSpace(aNewString, nY - mnLastY);
-
-												aLastCommand = sal_Unicode('s');
-											}
-											else
-											{
-												if(aLastCommand != sal_Unicode('S'))
-													aNewString += String(sal_Unicode('S'));
-
-												Imp_PutNumberCharWithSpace(aNewString, nX2);
-												Imp_PutNumberCharWithSpace(aNewString, nY2);
-												Imp_PutNumberCharWithSpace(aNewString, nX);
-												Imp_PutNumberCharWithSpace(aNewString, nY);
-
-												aLastCommand = sal_Unicode('S');
-											}
-										}
-										else
-										{
-											// prepare coordinates
-											sal_Int32 nX1, nY1;
-			
-											Imp_PrepareCoorExport(nX1, nY1, pPrevPos2, rObjectPos, rObjectSize, 
-												mrViewBox, bScale, bTranslate);
-
-											// write a curveto entry (C)
-											if(bRelative)
-											{
-												if(aLastCommand != sal_Unicode('c'))
-													aNewString += String(sal_Unicode('c'));
-
-												Imp_PutNumberCharWithSpace(aNewString, nX1 - mnLastX);
-												Imp_PutNumberCharWithSpace(aNewString, nY1 - mnLastY);
-												Imp_PutNumberCharWithSpace(aNewString, nX2 - mnLastX);
-												Imp_PutNumberCharWithSpace(aNewString, nY2 - mnLastY);
-												Imp_PutNumberCharWithSpace(aNewString, nX - mnLastX);
-												Imp_PutNumberCharWithSpace(aNewString, nY - mnLastY);
-
-												aLastCommand = sal_Unicode('c');
-											}
-											else
-											{
-												if(aLastCommand != sal_Unicode('C'))
-													aNewString += String(sal_Unicode('C'));
-												
-												Imp_PutNumberCharWithSpace(aNewString, nX1);
-												Imp_PutNumberCharWithSpace(aNewString, nY1);
-												Imp_PutNumberCharWithSpace(aNewString, nX2);
-												Imp_PutNumberCharWithSpace(aNewString, nY2);
-												Imp_PutNumberCharWithSpace(aNewString, nX);
-												Imp_PutNumberCharWithSpace(aNewString, nY);
-
-												aLastCommand = sal_Unicode('C');
-											}
-										}
-									}
-
-									// remember that current point IS written
-									bDidWriteAsCurve = true;
-
-									// remember new last position
-									mnLastX = nX;
-									mnLastY = nY;
-								}
-							}
-						}
-					}
-				}
-
-				if(!bDidWriteAsCurve)
-				{
-					// current point not yet written, prepare coordinates
-					sal_Int32 nX, nY;
-					
-					Imp_PrepareCoorExport(nX, nY, pPointArray, rObjectPos, rObjectSize, 
-						mrViewBox, bScale, bTranslate);
-
-					if(bDidWriteStart)
-					{
-						// write as normal point
-						if(mnLastX == nX)
-						{
-							if(bRelative)
-							{
-								if(aLastCommand != sal_Unicode('v'))
-									aNewString += String(sal_Unicode('v'));
-
-								Imp_PutNumberCharWithSpace(aNewString, nY - mnLastY);
-
-								aLastCommand = sal_Unicode('v');
-							}
-							else
-							{
-								if(aLastCommand != sal_Unicode('V'))
-									aNewString += String(sal_Unicode('V'));
-
-								Imp_PutNumberCharWithSpace(aNewString, nY);
-
-								aLastCommand = sal_Unicode('V');
-							}
-						}
-						else if(mnLastY == nY)
-						{
-							if(bRelative)
-							{
-								if(aLastCommand != sal_Unicode('h'))
-									aNewString += String(sal_Unicode('h'));
-
-								Imp_PutNumberCharWithSpace(aNewString, nX - mnLastX);
-
-								aLastCommand = sal_Unicode('h');
-							}
-							else
-							{
-								if(aLastCommand != sal_Unicode('H'))
-									aNewString += String(sal_Unicode('H'));
-
-								Imp_PutNumberCharWithSpace(aNewString, nX);
-
-								aLastCommand = sal_Unicode('H');
-							}
-						}
-						else
-						{
-							if(bRelative)
-							{
-								if(aLastCommand != sal_Unicode('l'))
-									aNewString += String(sal_Unicode('l'));
-
-								Imp_PutNumberCharWithSpace(aNewString, nX - mnLastX);
-								Imp_PutNumberCharWithSpace(aNewString, nY - mnLastY);
-
-								aLastCommand = sal_Unicode('l');
-							}
-							else
-							{
-								if(aLastCommand != sal_Unicode('L'))
-									aNewString += String(sal_Unicode('L'));
-
-								Imp_PutNumberCharWithSpace(aNewString, nX);
-								Imp_PutNumberCharWithSpace(aNewString, nY);
-
-								aLastCommand = sal_Unicode('L');
-							}
-						}
-					}
-					else
-					{
-						// write as start point
-						if(bRelative)
-						{
-							aNewString += String(sal_Unicode('m'));
-
-							Imp_PutNumberCharWithSpace(aNewString, nX - mnLastX);
-							Imp_PutNumberCharWithSpace(aNewString, nY - mnLastY);
-
-							aLastCommand = sal_Unicode('l');
-						}
-						else
-						{
-							aNewString += String(sal_Unicode('M'));
-
-							Imp_PutNumberCharWithSpace(aNewString, nX);
-							Imp_PutNumberCharWithSpace(aNewString, nY);
-
-							aLastCommand = sal_Unicode('L');
-						}
-
-						// remember start written
-						bDidWriteStart = true;
-					}
-
-					// remember new last position
-					mnLastX = nX;
-					mnLastY = nY;
-				}
-			}
-
-			// next point
-			pPointArray++;
-			pFlagArray++;
-		}
-
-		// close path if closed poly
-		if(bClosed)
-		{
-			if(bRelative)
-				aNewString += String(sal_Unicode('z'));
-			else
-				aNewString += String(sal_Unicode('Z'));
-		}
-
-		// append new string
-		msString += aNewString;
-	}
-}
-
-// #100617# Linear double reader
-double Imp_ImportDoubleAndSpaces(
-	double fRetval, const OUString& rStr, sal_Int32& rPos, 
-	const sal_Int32 nLen, const SvXMLUnitConverter& rConv)
-{
-	fRetval = Imp_GetDoubleChar(rStr, rPos, nLen, rConv, fRetval);
-	Imp_SkipSpacesAndCommas(rStr, rPos, nLen);
-	return fRetval;
-}
-
-// #100617# Allow to read doubles, too. This will need to be changed to
-// the usage of Imp_ImportDoubleAndSpaces(...). For now, this is sufficient
-// since the interface cannot transport doubles.
-sal_Int32 Imp_ImportNumberAndSpaces(
-	sal_Int32 nRetval, const OUString& rStr, sal_Int32& rPos, 
-	const sal_Int32 nLen, const SvXMLUnitConverter& rConv)
-{
-	nRetval = FRound(Imp_ImportDoubleAndSpaces(double(nRetval), rStr, rPos, nLen, rConv));
-	Imp_SkipSpacesAndCommas(rStr, rPos, nLen);
-	return nRetval;
-}
-
-void Imp_PrepareCoorImport(sal_Int32& nX, sal_Int32& nY, 
-	const awt::Point& rObjectPos, const awt::Size& rObjectSize, 
-	const SdXMLImExViewBox& rViewBox, const bool bScale, const bool bTranslate)
-{
-	if(bTranslate)
-	{
-		nX -= rViewBox.GetX();
-		nY -= rViewBox.GetY();
-	}
-
-	if(bScale && rViewBox.GetWidth() && rViewBox.GetHeight())
-	{
-		nX = (nX * rObjectSize.Width) / rViewBox.GetWidth();
-		nY = (nY * rObjectSize.Height) / rViewBox.GetHeight();
-	}
-
-	nX += rObjectPos.X;
-	nY += rObjectPos.Y;
-}
-
-void Imp_AddExportPoints(sal_Int32 nX, sal_Int32 nY, 
-	awt::Point* pPoints, drawing::PolygonFlags* pFlags,
-	const sal_Int32 nInnerIndex,
-	drawing::PolygonFlags eFlag)
-{
-	if(pPoints)
-		pPoints[nInnerIndex] = awt::Point( nX, nY );
-
-	if(pFlags)
-		pFlags[nInnerIndex] = eFlag;
-}
-
-void Imp_CalcVectorValues(::basegfx::B2DVector& aVec1, ::basegfx::B2DVector& aVec2, bool& bSameLength, bool& bSameDirection)
-{
-	const sal_Int32 nLen1(FRound(aVec1.getLength()));
-	const sal_Int32 nLen2(FRound(aVec2.getLength()));
-	aVec1.normalize(); 
-	aVec2.normalize();
-	aVec1 += aVec2;
-	const sal_Int32 nLen3(FRound(aVec1.getLength() * ((nLen1 + nLen2) / 2.0)));
-
-	bSameLength = (abs(nLen1 - nLen2) <= BORDER_INTEGERS_ARE_EQUAL);
-	bSameDirection = (nLen3 <= BORDER_INTEGERS_ARE_EQUAL);
-}
-
-void Imp_CorrectPolygonFlag(const sal_uInt32 nInnerIndex, const awt::Point* const pInnerSequence,
-	drawing::PolygonFlags* const pInnerFlags, const sal_Int32 nX1, const sal_Int32 nY1)
-{
-	if(nInnerIndex)
-	{
-		const awt::Point aPPrev1 = pInnerSequence[nInnerIndex - 1];
-
-		if(nInnerIndex > 1)
-		{
-			const awt::Point aPPrev2 = pInnerSequence[nInnerIndex - 2];
-			const drawing::PolygonFlags aFPrev2 = pInnerFlags[nInnerIndex - 2];
-			::basegfx::B2DVector aVec1(aPPrev2.X - aPPrev1.X, aPPrev2.Y - aPPrev1.Y);
-			::basegfx::B2DVector aVec2(nX1 - aPPrev1.X, nY1 - aPPrev1.Y);
-			bool bSameLength(false);
-			bool bSameDirection(false);
-
-			// get vector values
-			Imp_CalcVectorValues(aVec1, aVec2, bSameLength, bSameDirection);
-
-			if(drawing::PolygonFlags_CONTROL == aFPrev2)
-			{
-				// point before is a control point
-				if(bSameDirection)
-				{
-					if(bSameLength)
-					{
-						// set to PolygonFlags_SYMMETRIC
-						pInnerFlags[nInnerIndex - 1] = drawing::PolygonFlags_SYMMETRIC;
-					}
-					else
-					{
-						// set to PolygonFlags_SMOOTH
-						pInnerFlags[nInnerIndex - 1] = drawing::PolygonFlags_SMOOTH;
-					}
-				}
-				else
-				{
-					// set to PolygonFlags_NORMAL
-					pInnerFlags[nInnerIndex - 1] = drawing::PolygonFlags_NORMAL;
-				}
-			}
-			else
-			{
-				// point before is a simple curve point
-				if(bSameDirection)
-				{
-					// set to PolygonFlags_SMOOTH
-					pInnerFlags[nInnerIndex - 1] = drawing::PolygonFlags_SMOOTH;
-				}
-				else
-				{
-					// set to PolygonFlags_NORMAL
-					pInnerFlags[nInnerIndex - 1] = drawing::PolygonFlags_NORMAL;
-				}
-			}
-		}
-		else
-		{
-			// no point before starpoint, set type to PolygonFlags_NORMAL
-			pInnerFlags[nInnerIndex - 1] = drawing::PolygonFlags_NORMAL;
-		}
-	}
-}
-
-SdXMLImExSvgDElement::SdXMLImExSvgDElement(const OUString& rNew, 
-	const SdXMLImExViewBox& rViewBox,
-	const awt::Point& rObjectPos,
-	const awt::Size& rObjectSize,
-	const SvXMLUnitConverter& rConv)
-:	msString( rNew ),
-	mrViewBox( rViewBox ),
-	mbIsClosed( false ),
-	mbIsCurve( false ),
-	mnLastX( 0L ),
-	mnLastY( 0L ),
-	maPoly( 0L ),
-	maFlag( 0L )
-{
-	// convert string to polygon
-	const OUString aStr(msString.getStr(), msString.getLength());
-	const sal_Int32 nLen(aStr.getLength());
-	sal_Int32 nPos(0);
-	sal_Int32 nNumPolys(0L);
-	bool bEllipticalArc(false);
-
-	// object size and ViewBox size different?
-	bool bScale(rObjectSize.Width != mrViewBox.GetWidth() 
-		|| rObjectSize.Height != mrViewBox.GetHeight());
-	bool bTranslate(mrViewBox.GetX() != 0L || mrViewBox.GetY() != 0L);
-
-	// first loop: count polys and get flags
-	Imp_SkipSpaces(aStr, nPos, nLen);
-
-	while(nPos < nLen)
-	{
-		switch(aStr[nPos++])
-		{
-			case 'Z' :
-			case 'z' : 
-			{ 
-				break; 
-			}
-			case 'M' :
-			case 'm' : 
-			{ 
-				nNumPolys++; 
-				break; 
-			}
-			case 'S' :
-			case 's' :
-			case 'C' :
-			case 'c' : 
-			case 'Q' :
-			case 'q' :
-			case 'T' :
-			case 't' :
-			{ 
-				mbIsCurve = true; 
-				break; 
-			}
-			case 'L' :
-			case 'l' :
-			case 'H' :
-			case 'h' :
-			case 'V' :
-			case 'v' :
-			{
-				// normal, interpreted values. All okay.
-				break;
-			}
-			case 'A' :
-			case 'a' :
-			{
-				// Not yet interpreted value.
-				bEllipticalArc = true;
-				break;
-			}
-		}
-	}
-
-	DBG_ASSERT(!bEllipticalArc, "XMLIMP: non-interpreted tags in svg:d element!");
-
-	if(nNumPolys)
-	{
-		// alloc arrays
-		maPoly.realloc(nNumPolys);
-		if(IsCurve())
-			maFlag.realloc(nNumPolys);
-
-		// get outer sequences
-		drawing::PointSequence* pOuterSequence = maPoly.getArray();
-		drawing::FlagSequence* pOuterFlags = (IsCurve()) ? maFlag.getArray() : 0L;
-
-		// prepare new loop, count
-		sal_uInt32 nPointCount(0L);
-		nPos = 0;
-		Imp_SkipSpaces(aStr, nPos, nLen);
-
-		// #104076# reset closed flag for next to be started polygon
-		mbIsClosed = false;
-
-		while(nPos < nLen)
-		{
-			switch(aStr[nPos])
-			{
-				case 'z' :
-				case 'Z' :
-				{
-					nPos++;
-					Imp_SkipSpaces(aStr, nPos, nLen);
-
-					// #104076# remember closed state of current polygon
-					mbIsClosed = true;
-					
-					break;
-				}
-				case 'm' :
-				case 'M' :
-				{
-					// new poly starts, end-process current poly
-					if(nPointCount)
-					{
-						// #104076# If this partial polygon is closed, use one more point
-						// to represent that
-						if(mbIsClosed)
-						{
-							nPointCount++;
-						}
-
-						pOuterSequence->realloc(nPointCount);
-						pOuterSequence++;
-						
-						if(pOuterFlags)
-						{
-							pOuterFlags->realloc(nPointCount);
-							pOuterFlags++;
-						}
-						
-						// reset point count for next polygon
-						nPointCount = 0L;
-					}
-					
-					// #104076# reset closed flag for next to be started polygon
-					mbIsClosed = false;
-					
-					// NO break, continue in next case
-				}
-				case 'L' :
-				case 'l' :
-				{
-					nPos++;
-					Imp_SkipSpaces(aStr, nPos, nLen);
-
-					while(nPos < nLen && Imp_IsOnNumberChar(aStr, nPos))
-					{
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						nPointCount++;
-					}
-					break;
-				}
-				case 'H' :
-				case 'h' :
-				case 'V' :
-				case 'v' :
-				{
-					nPos++;
-					Imp_SkipSpaces(aStr, nPos, nLen);
-
-					while(nPos < nLen && Imp_IsOnNumberChar(aStr, nPos))
-					{
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						nPointCount++;
-					}
-					break;
-				}
-				case 'S' :
-				case 's' :
-				{
-					nPos++;
-					Imp_SkipSpaces(aStr, nPos, nLen);
-
-					while(nPos < nLen && Imp_IsOnNumberChar(aStr, nPos))
-					{
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						nPointCount += 3;
-					}
-					break;
-				}
-				case 'C' :
-				case 'c' :
-				{
-					nPos++;
-					Imp_SkipSpaces(aStr, nPos, nLen);
-
-					while(nPos < nLen && Imp_IsOnNumberChar(aStr, nPos))
-					{
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						nPointCount += 3;
-					}
-					break;
-				}
-
-				// #100617# quadratic beziers, supported as cubic ones
-				case 'Q' :
-				case 'q' :
-				{
-					nPos++;
-					Imp_SkipSpaces(aStr, nPos, nLen);
-
-					while(nPos < nLen && Imp_IsOnNumberChar(aStr, nPos))
-					{
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						
-						// use three points since quadratic is imported as cubic
-						nPointCount += 3;
-					}
-					break;
-				}
-
-				// #100617# relative quadratic beziers, supported as cubic ones
-				case 'T' :
-				case 't' :
-				{
-					nPos++;
-					Imp_SkipSpaces(aStr, nPos, nLen);
-
-					while(nPos < nLen && Imp_IsOnNumberChar(aStr, nPos))
-					{
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						
-						// use three points since quadratic is imported as cubic
-						nPointCount += 3;
-					}
-					break;
-				}
-
-				// #100617# not yet supported: elliptical arc
-				case 'A' :
-				case 'a' :
-				{
-					DBG_ERROR("XMLIMP: non-interpreted tags in svg:d element (elliptical arc)!");
-					nPos++;
-					Imp_SkipSpaces(aStr, nPos, nLen);
-
-					while(nPos < nLen && Imp_IsOnNumberChar(aStr, nPos))
-					{
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipNumberAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipNumberAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-					}
-					break;
-				}
-
-				default:
-				{
-					nPos++;
-					DBG_ERROR("XMLIMP: non-interpreted tags in svg:d element (unknown)!");
-					break;
-				}
-			}
-		}
-
-		// alloc last poly (when points used)
-		if(nPointCount)
-		{
-			// #104076# If this partial polygon is closed, use one more point
-			// to represent that
-			if(mbIsClosed)
-			{
-				nPointCount++;
-			}
-
-			pOuterSequence->realloc(nPointCount);
-			pOuterSequence++;
-
-			if(pOuterFlags)
-			{
-				pOuterFlags->realloc(nPointCount);
-				pOuterFlags++;
-			}
-		}
-
-		// set pointers back
-		pOuterSequence = maPoly.getArray();
-		pOuterFlags = (IsCurve()) ? maFlag.getArray() : 0L;
-		awt::Point* pNotSoInnerSequence = 0L;
-		drawing::PolygonFlags* pNotSoInnerFlags = 0L;
-		sal_uInt32 nInnerIndex(0L);
-
-		// prepare new loop, read points
-		nPos = 0;
-		Imp_SkipSpaces(aStr, nPos, nLen);
-
-		// #104076# reset closed flag for next to be started polygon
-		mbIsClosed = false;
-
-		while(nPos < nLen)
-		{
-			bool bRelative(false);
-
-			switch(aStr[nPos])
-			{
-				case 'z' :
-				case 'Z' :
-				{
-					nPos++;
-					Imp_SkipSpaces(aStr, nPos, nLen);
-
-					// #104076# remember closed state of current polygon
-					mbIsClosed = true;
-
-					// closed: add first point again
-					// sal_Int32 nX(pInnerSequence[0].X);
-					// sal_Int32 nY(pInnerSequence[0].Y);
-					// Imp_AddExportPoints(nX, nY, pInnerSequence, pInnerFlags, nInnerIndex++, drawing::PolygonFlags_NORMAL);
-					
-					break;
-				}
-				
-				case 'm' :
-				{
-					bRelative = true;
-				}
-				case 'M' :
-				{
-					// #104076# end-process current poly
-					if(mbIsClosed)
-					{
-						if(pNotSoInnerSequence)
-						{
-							// closed: add first point again
-							sal_Int32 nX(pNotSoInnerSequence[0].X);
-							sal_Int32 nY(pNotSoInnerSequence[0].Y);
-							Imp_AddExportPoints(nX, nY, pNotSoInnerSequence, pNotSoInnerFlags, nInnerIndex++, drawing::PolygonFlags_NORMAL);
-						}
-
-						// reset closed flag for next to be started polygon
-						mbIsClosed = false;
-					}
-
-					// next poly
-					pNotSoInnerSequence = pOuterSequence->getArray();
-					pOuterSequence++;
-
-					if(pOuterFlags)
-					{
-						pNotSoInnerFlags = pOuterFlags->getArray();
-						pOuterFlags++;
-					}
-
-					nInnerIndex = 0L;
-
-					nPos++;
-					Imp_SkipSpaces(aStr, nPos, nLen);
-
-					while(nPos < nLen && Imp_IsOnNumberChar(aStr, nPos))
-					{
-                        sal_Int32 nX(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-                        sal_Int32 nY(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-
-						if(bRelative)
-						{
-							nX += mnLastX;
-							nY += mnLastY;
-						}
-
-						// set last position
-						mnLastX = nX;
-						mnLastY = nY;
-						
-						// calc transform and add point and flag
-						Imp_PrepareCoorImport(nX, nY, rObjectPos, rObjectSize, mrViewBox, bScale, bTranslate);
-						Imp_AddExportPoints(nX, nY, pNotSoInnerSequence, pNotSoInnerFlags, nInnerIndex++, drawing::PolygonFlags_NORMAL);
-					}
-					break;
-				}
-
-				case 'l' :
-				{
-					bRelative = true;
-				}
-				case 'L' :
-				{
-					nPos++;
-					Imp_SkipSpaces(aStr, nPos, nLen);
-					
-					while(nPos < nLen && Imp_IsOnNumberChar(aStr, nPos))
-					{
-                        sal_Int32 nX(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-                        sal_Int32 nY(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-
-						if(bRelative)
-						{
-							nX += mnLastX;
-							nY += mnLastY;
-						}
-
-						// set last position
-						mnLastX = nX;
-						mnLastY = nY;
-						
-						// calc transform and add point and flag
-						Imp_PrepareCoorImport(nX, nY, rObjectPos, rObjectSize, mrViewBox, bScale, bTranslate);
-						Imp_AddExportPoints(nX, nY, pNotSoInnerSequence, pNotSoInnerFlags, nInnerIndex++, drawing::PolygonFlags_NORMAL);
-					}
-					break;
-				}
-				
-				case 'h' :
-				{
-					bRelative = true;
-				}
-				case 'H' :
-				{
-					nPos++;
-					Imp_SkipSpaces(aStr, nPos, nLen);
-
-					while(nPos < nLen && Imp_IsOnNumberChar(aStr, nPos))
-					{
-                        sal_Int32 nX(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-						sal_Int32 nY(mnLastY);
-
-						if(bRelative)
-							nX += mnLastX;
-
-						// set last position
-						mnLastX = nX;
-						
-						// calc transform and add point and flag
-						Imp_PrepareCoorImport(nX, nY, rObjectPos, rObjectSize, mrViewBox, bScale, bTranslate);
-						Imp_AddExportPoints(nX, nY, pNotSoInnerSequence, pNotSoInnerFlags, nInnerIndex++, drawing::PolygonFlags_NORMAL);
-					}
-					break;
-				}
-				
-				case 'v' :
-				{
-					bRelative = true;
-				}
-				case 'V' :
-				{
-					nPos++;
-					Imp_SkipSpaces(aStr, nPos, nLen);
-
-					while(nPos < nLen && Imp_IsOnNumberChar(aStr, nPos))
-					{
-						sal_Int32 nX(mnLastX);
-						sal_Int32 nY(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-
-						if(bRelative)
-							nY += mnLastY;
-
-						// set last position
-						mnLastY = nY;
-						
-						// calc transform and add point and flag
-						Imp_PrepareCoorImport(nX, nY, rObjectPos, rObjectSize, mrViewBox, bScale, bTranslate);
-						Imp_AddExportPoints(nX, nY, pNotSoInnerSequence, pNotSoInnerFlags, nInnerIndex++, drawing::PolygonFlags_NORMAL);
-					}
-					break;
-				}
-				
-				case 's' :
-				{
-					bRelative = true;
-				}
-				case 'S' :
-				{
-					nPos++;
-					Imp_SkipSpaces(aStr, nPos, nLen);
-
-					while(nPos < nLen && Imp_IsOnNumberChar(aStr, nPos))
-					{
-						sal_Int32 nX1;
-						sal_Int32 nY1;
-                        sal_Int32 nX2(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-                        sal_Int32 nY2(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-                        sal_Int32 nX(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-                        sal_Int32 nY(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-
-						if(bRelative)
-						{
-							nX2 += mnLastX;
-							nY2 += mnLastY;
-							nX += mnLastX;
-							nY += mnLastY;
-						}
-
-						// set last position
-						mnLastX = nX;
-						mnLastY = nY;
-
-						// calc transform for new points
-						Imp_PrepareCoorImport(nX2, nY2, rObjectPos, rObjectSize, mrViewBox, bScale, bTranslate);
-						Imp_PrepareCoorImport(nX, nY, rObjectPos, rObjectSize, mrViewBox, bScale, bTranslate);
-
-						// one more thing is known: the previous real point is PolygonFlags_SYMMETRIC
-						// and the Point X1,Y1 can be constructed by mirroring the point before it.
-						nX1 = nX2;
-						nY1 = nY2;
-						if(nInnerIndex)
-						{
-							awt::Point aPPrev1 = pNotSoInnerSequence[nInnerIndex - 1];
-
-							if(nInnerIndex > 1)
-							{
-								awt::Point aPPrev2 = pNotSoInnerSequence[nInnerIndex - 2];
-								nX1 = aPPrev1.X -(aPPrev2.X - aPPrev1.X);
-								nY1 = aPPrev1.Y -(aPPrev2.Y - aPPrev1.Y);
-							}
-
-							// set curve point to symmetric
-							pNotSoInnerFlags[nInnerIndex - 1] = drawing::PolygonFlags_SYMMETRIC;
-						}
-
-						// add calculated control point
-						Imp_AddExportPoints(nX1, nY1, pNotSoInnerSequence, pNotSoInnerFlags, nInnerIndex++, drawing::PolygonFlags_CONTROL);
-
-						// add new points and set flags
-						Imp_AddExportPoints(nX2, nY2, pNotSoInnerSequence, pNotSoInnerFlags, nInnerIndex++, drawing::PolygonFlags_CONTROL);
-						Imp_AddExportPoints(nX, nY, pNotSoInnerSequence, pNotSoInnerFlags, nInnerIndex++, drawing::PolygonFlags_SMOOTH);
-					}
-					break;
-				}
-				
-				case 'c' :
-				{
-					bRelative = true;
-				}
-				case 'C' :
-				{
-					nPos++;
-					Imp_SkipSpaces(aStr, nPos, nLen);
-
-					while(nPos < nLen && Imp_IsOnNumberChar(aStr, nPos))
-					{
-                        sal_Int32 nX1(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-                        sal_Int32 nY1(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-                        sal_Int32 nX2(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-                        sal_Int32 nY2(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-                        sal_Int32 nX(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-                        sal_Int32 nY(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-
-						if(bRelative)
-						{
-							nX1 += mnLastX;
-							nY1 += mnLastY;
-							nX2 += mnLastX;
-							nY2 += mnLastY;
-							nX += mnLastX;
-							nY += mnLastY;
-						}
-
-						// set last position
-						mnLastX = nX;
-						mnLastY = nY;
-
-						// calc transform for new points
-						Imp_PrepareCoorImport(nX1, nY1, rObjectPos, rObjectSize, mrViewBox, bScale, bTranslate);
-						Imp_PrepareCoorImport(nX2, nY2, rObjectPos, rObjectSize, mrViewBox, bScale, bTranslate);
-						Imp_PrepareCoorImport(nX, nY, rObjectPos, rObjectSize, mrViewBox, bScale, bTranslate);
-
-						// correct polygon flag for previous point
-						Imp_CorrectPolygonFlag(nInnerIndex, pNotSoInnerSequence, pNotSoInnerFlags, nX1, nY1);
-
-						// add new points and set flags
-						Imp_AddExportPoints(nX1, nY1, pNotSoInnerSequence, pNotSoInnerFlags, nInnerIndex++, drawing::PolygonFlags_CONTROL);
-						Imp_AddExportPoints(nX2, nY2, pNotSoInnerSequence, pNotSoInnerFlags, nInnerIndex++, drawing::PolygonFlags_CONTROL);
-						Imp_AddExportPoints(nX, nY, pNotSoInnerSequence, pNotSoInnerFlags, nInnerIndex++, drawing::PolygonFlags_SMOOTH);
-					}
-					break;
-				}
-				
-				// #100617# quadratic beziers are imported as cubic
-				case 'q' :
-				{
-					bRelative = true;
-				}
-				case 'Q' :
-				{
-					nPos++;
-					Imp_SkipSpaces(aStr, nPos, nLen);
-
-					while(nPos < nLen && Imp_IsOnNumberChar(aStr, nPos))
-					{
-                        sal_Int32 nXX(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-                        sal_Int32 nYY(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-                        sal_Int32 nX(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-                        sal_Int32 nY(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-
-						if(bRelative)
-						{
-							nXX += mnLastX;
-							nYY += mnLastY;
-							nX += mnLastX;
-							nY += mnLastY;
-						}
-
-						// set last position
-						mnLastX = nX;
-						mnLastY = nY;
-
-						// calc transform for new points
-						Imp_PrepareCoorImport(nXX, nYY, rObjectPos, rObjectSize, mrViewBox, bScale, bTranslate);
-						Imp_PrepareCoorImport(nX, nY, rObjectPos, rObjectSize, mrViewBox, bScale, bTranslate);
-						
-						// calculate X1,X2
-						awt::Point aPPrev1 = (nInnerIndex) ? pNotSoInnerSequence[nInnerIndex-1] : pNotSoInnerSequence[0];
-						sal_Int32 nX1 = FRound((double)((nXX * 2) + aPPrev1.X) / 3.0);
-						sal_Int32 nY1 = FRound((double)((nYY * 2) + aPPrev1.Y) / 3.0);
-						sal_Int32 nX2 = FRound((double)((nXX * 2) + nX) / 3.0);
-						sal_Int32 nY2 = FRound((double)((nYY * 2) + nY) / 3.0);
-
-						// correct polygon flag for previous point
-						Imp_CorrectPolygonFlag(nInnerIndex, pNotSoInnerSequence, pNotSoInnerFlags, nX1, nY1);
-						
-						// add new points and set flags
-						Imp_AddExportPoints(nX1, nY1, pNotSoInnerSequence, pNotSoInnerFlags, nInnerIndex++, drawing::PolygonFlags_CONTROL);
-						Imp_AddExportPoints(nX2, nY2, pNotSoInnerSequence, pNotSoInnerFlags, nInnerIndex++, drawing::PolygonFlags_CONTROL);
-						Imp_AddExportPoints(nX, nY, pNotSoInnerSequence, pNotSoInnerFlags, nInnerIndex++, drawing::PolygonFlags_SMOOTH);
-					}
-					break;
-				}
-				
-				// #100617# relative quadratic beziers are imported as cubic
-				case 't' :
-				{
-					bRelative = true;
-				}
-				case 'T' :
-				{
-					nPos++;
-					Imp_SkipSpaces(aStr, nPos, nLen);
-
-					while(nPos < nLen && Imp_IsOnNumberChar(aStr, nPos))
-					{
-						sal_Int32 nXX;
-						sal_Int32 nYY;
-                        sal_Int32 nX(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-                        sal_Int32 nY(Imp_ImportNumberAndSpaces(0, aStr, nPos, nLen, rConv));
-
-						if(bRelative)
-						{
-							nX += mnLastX;
-							nY += mnLastY;
-						}
-
-						// set last position
-						mnLastX = nX;
-						mnLastY = nY;
-
-						// calc transform for new points
-						Imp_PrepareCoorImport(nX, nY, rObjectPos, rObjectSize, mrViewBox, bScale, bTranslate);
-
-						// one more thing is known: the previous real point is PolygonFlags_SYMMETRIC
-						// and the Point X1,Y1 can be constructed by mirroring the point before it.
-						nXX = nX;
-						nYY = nY;
-						awt::Point aPPrev1 = pNotSoInnerSequence[0];
-						
-						if(nInnerIndex)
-						{
-							aPPrev1 = pNotSoInnerSequence[nInnerIndex - 1];
-
-							if(nInnerIndex > 1)
-							{
-								awt::Point aPPrev2 = pNotSoInnerSequence[nInnerIndex - 2];
-								nXX = aPPrev1.X -(aPPrev2.X - aPPrev1.X);
-								nYY = aPPrev1.Y -(aPPrev2.Y - aPPrev1.Y);
-							}
-
-							// set curve point to smooth here, since length
-							// is changed and thus only c1 can be used.
-							pNotSoInnerFlags[nInnerIndex - 1] = drawing::PolygonFlags_SMOOTH;
-						}
-
-						// calculate X1,X2
-						sal_Int32 nX1 = FRound((double)((nXX * 2) + aPPrev1.X) / 3.0);
-						sal_Int32 nY1 = FRound((double)((nYY * 2) + aPPrev1.Y) / 3.0);
-						sal_Int32 nX2 = FRound((double)((nXX * 2) + nX) / 3.0);
-						sal_Int32 nY2 = FRound((double)((nYY * 2) + nY) / 3.0);
-
-						// correct polygon flag for previous point
-						Imp_CorrectPolygonFlag(nInnerIndex, pNotSoInnerSequence, pNotSoInnerFlags, nX1, nY1);
-						
-						// add new points and set flags
-						Imp_AddExportPoints(nX1, nY1, pNotSoInnerSequence, pNotSoInnerFlags, nInnerIndex++, drawing::PolygonFlags_CONTROL);
-						Imp_AddExportPoints(nX2, nY2, pNotSoInnerSequence, pNotSoInnerFlags, nInnerIndex++, drawing::PolygonFlags_CONTROL);
-						Imp_AddExportPoints(nX, nY, pNotSoInnerSequence, pNotSoInnerFlags, nInnerIndex++, drawing::PolygonFlags_SMOOTH);
-					}
-					break;
-				}
-
-				// #100617# not yet supported: elliptical arc
-				case 'A' :
-				case 'a' :
-				{
-					DBG_ERROR("XMLIMP: non-interpreted tags in svg:d element (elliptical arc)!");
-					nPos++;
-					Imp_SkipSpaces(aStr, nPos, nLen);
-
-					while(nPos < nLen && Imp_IsOnNumberChar(aStr, nPos))
-					{
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipNumberAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipNumberAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-						Imp_SkipDoubleAndSpacesAndCommas(aStr, nPos, nLen);
-					}
-					break;
-				}
-
-				default:
-				{
-					nPos++;
-					DBG_ERROR("XMLIMP: non-interpreted tags in svg:d element (unknown)!");
-					break;
-				}
-			}
-		}
-
-		// #104076# end-process closed state of last poly
-		if(mbIsClosed)
-		{
-			if(pNotSoInnerSequence)
-			{
-				// closed: add first point again
-				sal_Int32 nX(pNotSoInnerSequence[0].X);
-				sal_Int32 nY(pNotSoInnerSequence[0].Y);
-				Imp_AddExportPoints(nX, nY, pNotSoInnerSequence, pNotSoInnerFlags, nInnerIndex++, drawing::PolygonFlags_NORMAL);
-			}
-		}
-
-		// #87202# If it's a curve and it's closed the last point maybe too much
-		// and just exported since SVG does not allow special handling of same
-		// start and end point, remove this last point.
-		// Evtl. correct the last curve flags, too.
-		if(IsCurve() && IsClosed())
-		{
-			// make one more loop over the PolyPolygon
-			pOuterSequence = maPoly.getArray();
-			pOuterFlags = maFlag.getArray();
-			sal_Int32 nOuterCnt(maPoly.getLength());
-
-			for(sal_Int32 a(0); a < nOuterCnt; a++)
-			{
-				// get Polygon pointers
-				awt::Point* pInnerSequence = pOuterSequence->getArray();
-				drawing::PolygonFlags* pInnerFlags = pOuterFlags->getArray();
-				sal_Int32 nInnerCnt(pOuterSequence->getLength());
-
-				while( nInnerCnt >= 2
-					&& ((pInnerSequence + (nInnerCnt - 2))->X == (pInnerSequence + (nInnerCnt - 1))->X) 
-					&& ((pInnerSequence + (nInnerCnt - 2))->Y == (pInnerSequence + (nInnerCnt - 1))->Y)
-					&& drawing::PolygonFlags_CONTROL != *(pInnerFlags + (nInnerCnt - 2)))
-				{
-					// remove last point from array
-					pOuterSequence->realloc(nInnerCnt - 1);
-					pOuterFlags->realloc(nInnerCnt - 1);
-
-					// get new pointers
-					pInnerSequence = pOuterSequence->getArray();
-					pInnerFlags = pOuterFlags->getArray();
-					nInnerCnt = pOuterSequence->getLength();
-				}
-
-				// now evtl. correct the last curve flags
-				if(nInnerCnt >= 4)
-				{
-					if(	pInnerSequence->X == (pInnerSequence + (nInnerCnt - 1))->X
-						&& pInnerSequence->Y == (pInnerSequence + (nInnerCnt - 1))->Y
-						&& drawing::PolygonFlags_CONTROL == *(pInnerFlags + 1)
-						&& drawing::PolygonFlags_CONTROL == *(pInnerFlags + (nInnerCnt - 2)))
-					{
-						awt::Point aPrev = *(pInnerSequence + (nInnerCnt - 2));
-						awt::Point aCurr = *pInnerSequence;
-						awt::Point aNext = *(pInnerSequence + 1);
-						::basegfx::B2DVector aVec1(aPrev.X - aCurr.X, aPrev.Y - aCurr.Y);
-						::basegfx::B2DVector aVec2(aNext.X - aCurr.X, aNext.Y - aCurr.Y);
-						bool bSameLength(false);
-						bool bSameDirection(false);
-
-						// get vector values
-						Imp_CalcVectorValues(aVec1, aVec2, bSameLength, bSameDirection);
-
-						// set correct flag value
-						if(bSameDirection)
-						{
-							if(bSameLength)
-							{
-								// set to PolygonFlags_SYMMETRIC
-								*pInnerFlags = drawing::PolygonFlags_SYMMETRIC;
-								*(pInnerFlags + (nInnerCnt - 1)) = drawing::PolygonFlags_SYMMETRIC;
-							}
-							else
-							{
-								// set to PolygonFlags_SMOOTH
-								*pInnerFlags = drawing::PolygonFlags_SMOOTH;
-								*(pInnerFlags + (nInnerCnt - 1)) = drawing::PolygonFlags_SMOOTH;
-							}
-						}
-						else
-						{
-							// set to PolygonFlags_NORMAL
-							*pInnerFlags = drawing::PolygonFlags_NORMAL;
-							*(pInnerFlags + (nInnerCnt - 1)) = drawing::PolygonFlags_NORMAL;
-						}
-					}
-				}
-				
-				// switch to next Polygon
-				pOuterSequence++;
-				pOuterFlags++;
-			}
-		}
-	}
+    return msString;
 }
 
 // eof

Modified: openoffice/trunk/main/xmloff/source/draw/ximp3dobject.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/xmloff/source/draw/ximp3dobject.cxx?rev=1536730&r1=1536729&r2=1536730&view=diff
==============================================================================
--- openoffice/trunk/main/xmloff/source/draw/ximp3dobject.cxx (original)
+++ openoffice/trunk/main/xmloff/source/draw/ximp3dobject.cxx Tue Oct 29 14:11:45 2013
@@ -19,10 +19,9 @@
  * 
  *************************************************************/
 
-
-
 // MARKER(update_precomp.py): autogen include statement, do not remove
 #include "precompiled_xmloff.hxx"
+
 #include <comphelper/extract.hxx>
 #include "ximp3dobject.hxx"
 #include <xmloff/XMLShapeStyleContext.hxx>
@@ -37,6 +36,9 @@
 #include <xmloff/xmltoken.hxx>
 #include <com/sun/star/drawing/PolyPolygonShape3D.hpp>
 #include <com/sun/star/drawing/DoubleSequence.hpp>
+#include <basegfx/polygon/b2dpolypolygon.hxx>
+#include <basegfx/polygon/b2dpolypolygontools.hxx>
+#include <basegfx/polygon/b3dpolypolygontools.hxx>
 
 using ::rtl::OUString;
 using ::rtl::OUStringBuffer;
@@ -447,68 +449,43 @@ SdXML3DPolygonBasedShapeContext::~SdXML3
 
 void SdXML3DPolygonBasedShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
 {
-	uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
-	if(xPropSet.is())
-	{
-		// set parameters
-		if(maPoints.getLength() && maViewBox.getLength())
-		{
-			SdXMLImExViewBox aViewBox(maViewBox, GetImport().GetMM100UnitConverter());
-			awt::Point aMinPoint(aViewBox.GetX(), aViewBox.GetY());
-			awt::Size aMaxSize(aViewBox.GetWidth(), aViewBox.GetHeight());
-			SdXMLImExSvgDElement aPoints(maPoints, aViewBox,
-				aMinPoint, aMaxSize, GetImport().GetMM100UnitConverter());
-
-			// convert to double sequences
-			drawing::PointSequenceSequence& xPoSeSe =
-				(drawing::PointSequenceSequence&)aPoints.GetPointSequenceSequence();
-			sal_Int32 nOuterSequenceCount = xPoSeSe.getLength();
-			drawing::PointSequence* pInnerSequence = xPoSeSe.getArray();
-
-			drawing::PolyPolygonShape3D xPolyPolygon3D;
-			xPolyPolygon3D.SequenceX.realloc(nOuterSequenceCount);
-			xPolyPolygon3D.SequenceY.realloc(nOuterSequenceCount);
-			xPolyPolygon3D.SequenceZ.realloc(nOuterSequenceCount);
-			drawing::DoubleSequence* pOuterSequenceX = xPolyPolygon3D.SequenceX.getArray();
-			drawing::DoubleSequence* pOuterSequenceY = xPolyPolygon3D.SequenceY.getArray();
-			drawing::DoubleSequence* pOuterSequenceZ = xPolyPolygon3D.SequenceZ.getArray();
-
-			for(sal_Int32 a(0L); a < nOuterSequenceCount; a++)
-			{
-				sal_Int32 nInnerSequenceCount(pInnerSequence->getLength());
-				awt::Point* pArray = pInnerSequence->getArray();
-
-				pOuterSequenceX->realloc(nInnerSequenceCount);
-				pOuterSequenceY->realloc(nInnerSequenceCount);
-				pOuterSequenceZ->realloc(nInnerSequenceCount);
-				double* pInnerSequenceX = pOuterSequenceX->getArray();
-				double* pInnerSequenceY = pOuterSequenceY->getArray();
-				double* pInnerSequenceZ = pOuterSequenceZ->getArray();
+    uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
 
-				for(sal_Int32 b(0L); b < nInnerSequenceCount; b++)
-				{
-					*pInnerSequenceX++ = pArray->X;
-					*pInnerSequenceY++ = pArray->Y;
-					*pInnerSequenceZ++ = 0.0;
-					pArray++;
-				}
-				pInnerSequence++;
-
-				pOuterSequenceX++;
-				pOuterSequenceY++;
-				pOuterSequenceZ++;
-			}
-
-			// set poly
-			uno::Any aAny;
-			aAny <<= xPolyPolygon3D;
-			xPropSet->setPropertyValue(
-				OUString(RTL_CONSTASCII_USTRINGPARAM("D3DPolyPolygon3D")), aAny);
-		}
-
-		// call parent
-		SdXML3DObjectContext::StartElement(xAttrList);
-	}
+    if(xPropSet.is())
+    {
+        // set parameters
+        if(maPoints.getLength() && maViewBox.getLength())
+        {
+            // import 2d PolyPolygon from svg:d
+            basegfx::B2DPolyPolygon aPolyPolygon;
+
+            if(basegfx::tools::importFromSvgD(aPolyPolygon, maPoints, true, 0))
+            {
+                // convert to 3D PolyPolygon
+                const basegfx::B3DPolyPolygon aB3DPolyPolygon(
+                    basegfx::tools::createB3DPolyPolygonFromB2DPolyPolygon(
+                        aPolyPolygon));
+
+                // convert to UNO API class PolyPolygonShape3D
+                drawing::PolyPolygonShape3D xPolyPolygon3D;
+                basegfx::tools::B3DPolyPolygonToUnoPolyPolygonShape3D(
+                    aB3DPolyPolygon, 
+                    xPolyPolygon3D);
+
+                // set polygon data
+                uno::Any aAny;
+                aAny <<= xPolyPolygon3D;
+                xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("D3DPolyPolygon3D")), aAny);
+            }
+            else
+            {
+                OSL_ENSURE(false, "Error on importing svg:d for 3D PolyPolygon (!)");
+            }
+        }
+
+        // call parent
+        SdXML3DObjectContext::StartElement(xAttrList);
+    }
 }
 
 //////////////////////////////////////////////////////////////////////////////

Modified: openoffice/trunk/main/xmloff/source/draw/ximpshap.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/xmloff/source/draw/ximpshap.cxx?rev=1536730&r1=1536729&r2=1536730&view=diff
==============================================================================
--- openoffice/trunk/main/xmloff/source/draw/ximpshap.cxx (original)
+++ openoffice/trunk/main/xmloff/source/draw/ximpshap.cxx Tue Oct 29 14:11:45 2013
@@ -80,6 +80,10 @@
 #include <com/sun/star/text/XTextDocument.hpp>
 #include <basegfx/vector/b2dvector.hxx>
 #include <basegfx/point/b2dpoint.hxx>
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
+#include <basegfx/polygon/b2dpolypolygontools.hxx>
+#include <basegfx/matrix/b2dhommatrixtools.hxx>
 
 using ::rtl::OUString;
 using ::rtl::OUStringBuffer;
@@ -1308,46 +1312,71 @@ SdXMLPolygonShapeContext::~SdXMLPolygonS
 
 void SdXMLPolygonShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
 {
-	// Add, set Style and properties from base shape
-	if(mbClosed)
-		AddShape("com.sun.star.drawing.PolyPolygonShape");
-	else
-		AddShape("com.sun.star.drawing.PolyLineShape");
+    // Add, set Style and properties from base shape
+    if(mbClosed)
+        AddShape("com.sun.star.drawing.PolyPolygonShape");
+    else
+        AddShape("com.sun.star.drawing.PolyLineShape");
 
-	if( mxShape.is() )
-	{
-		SetStyle();
-		SetLayer();
+    if( mxShape.is() )
+    {
+        SetStyle();
+        SetLayer();
 
-		// set local parameters on shape
-		uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
-		if(xPropSet.is())
-		{
-			// set polygon
-			if(maPoints.getLength() && maViewBox.getLength())
-			{
-				SdXMLImExViewBox aViewBox(maViewBox, GetImport().GetMM100UnitConverter());
-				awt::Size aSize(aViewBox.GetWidth(), aViewBox.GetHeight());
-				if (maSize.Width != 0 && maSize.Height !=0)
-				{
-					aSize = maSize;
-				}
-				awt::Point aPosition(aViewBox.GetX(), aViewBox.GetY());
-				SdXMLImExPointsElement aPoints(maPoints, aViewBox,
-					aPosition, aSize, GetImport().GetMM100UnitConverter());
+        // set local parameters on shape
+        uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
+        if(xPropSet.is())
+        {
+            // set polygon
+            if(maPoints.getLength() && maViewBox.getLength())
+            {
+                const SdXMLImExViewBox aViewBox(maViewBox, GetImport().GetMM100UnitConverter());
+                basegfx::B2DVector aSize(aViewBox.GetWidth(), aViewBox.GetHeight());
 
-				uno::Any aAny;
-				aAny <<= aPoints.GetPointSequenceSequence();
-				xPropSet->setPropertyValue(
-					OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")), aAny);
-			}
-		}
+                // Is this correct? It overrides ViewBox stuff; OTOH it makes no
+                // sense to have the geometry content size different from object size
+                if(maSize.Width != 0 && maSize.Height != 0)
+                {
+                    aSize = basegfx::B2DVector(maSize.Width, maSize.Height);
+                }
 
-		// set pos, size, shear and rotate and get copy of matrix
-		SetTransformation();
+                basegfx::B2DPolygon aPolygon;
 
-		SdXMLShapeContext::StartElement(xAttrList);
-	}
+                if(basegfx::tools::importFromSvgPoints(aPolygon, maPoints))
+                {
+                    if(aPolygon.count())
+                    {
+                        const basegfx::B2DRange aSourceRange(
+                            aViewBox.GetX(), aViewBox.GetY(), 
+                            aViewBox.GetX() + aViewBox.GetWidth(), aViewBox.GetY() + aViewBox.GetHeight());
+                        const basegfx::B2DRange aTargetRange(
+                            aViewBox.GetX(), aViewBox.GetY(), 
+                            aViewBox.GetX() + aSize.getX(), aViewBox.GetY() + aSize.getY());
+
+                        if(!aSourceRange.equal(aTargetRange))
+                        {
+                            aPolygon.transform(
+                                basegfx::tools::createSourceRangeTargetRangeTransform(
+                                    aSourceRange,
+                                    aTargetRange));
+                        }
+
+                        com::sun::star::drawing::PointSequenceSequence aPointSequenceSequence;
+                        uno::Any aAny;
+
+                        basegfx::tools::B2DPolyPolygonToUnoPointSequenceSequence(basegfx::B2DPolyPolygon(aPolygon), aPointSequenceSequence);
+                        aAny <<= aPointSequenceSequence;
+                        xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")), aAny);
+                    }
+                }
+            }
+        }
+
+        // set pos, size, shear and rotate and get copy of matrix
+        SetTransformation();
+
+        SdXMLShapeContext::StartElement(xAttrList);
+    }
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1399,90 +1428,115 @@ void SdXMLPathShapeContext::processAttri
 
 void SdXMLPathShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
 {
-	// create polygon shape
-	if(maD.getLength())
-	{
-		// prepare some of the parameters
-		SdXMLImExViewBox aViewBox(maViewBox, GetImport().GetMM100UnitConverter());
-		awt::Size aSize(aViewBox.GetWidth(), aViewBox.GetHeight());
-		awt::Point aPosition(aViewBox.GetX(), aViewBox.GetY());
-		if (maSize.Width != 0 && maSize.Height !=0)
-		{
-			aSize = maSize;
-		}
-		SdXMLImExSvgDElement aPoints(maD, aViewBox,
-			aPosition, aSize, GetImport().GetMM100UnitConverter());
+    // create polygon shape
+    if(maD.getLength())
+    {
+        const SdXMLImExViewBox aViewBox(maViewBox, GetImport().GetMM100UnitConverter());
+        basegfx::B2DVector aSize(aViewBox.GetWidth(), aViewBox.GetHeight());
 
-		const char* pService;
-		// now create shape
-		if(aPoints.IsCurve())
-		{
-			if(aPoints.IsClosed())
-			{
-				pService = "com.sun.star.drawing.ClosedBezierShape";
-			}
-			else
-			{
-				pService = "com.sun.star.drawing.OpenBezierShape";
-			}
-		}
-		else
-		{
-			if(aPoints.IsClosed())
-			{
-				pService = "com.sun.star.drawing.PolyPolygonShape";
-			}
-			else
-			{
-				pService = "com.sun.star.drawing.PolyLineShape";
-			}
-		}
+        // Is this correct? It overrides ViewBox stuff; OTOH it makes no
+        // sense to have the geometry content size different from object size
+        if(maSize.Width != 0 && maSize.Height != 0)
+        {
+            aSize = basegfx::B2DVector(maSize.Width, maSize.Height);
+        }
 
-		// Add, set Style and properties from base shape
-		AddShape(pService);
+        basegfx::B2DPolyPolygon aPolyPolygon;
 
-		// #89344# test for mxShape.is() and not for mxShapes.is() to support
-		// shape import helper classes WITHOUT XShapes (member mxShapes). This
-		// is used by the writer.
-		if( mxShape.is() )
-		{
-			SetStyle();
-			SetLayer();
+        if(basegfx::tools::importFromSvgD(aPolyPolygon, maD, true, 0))
+        {
+            if(aPolyPolygon.count())
+            {
+                const basegfx::B2DRange aSourceRange(
+                    aViewBox.GetX(), aViewBox.GetY(), 
+                    aViewBox.GetX() + aViewBox.GetWidth(), aViewBox.GetY() + aViewBox.GetHeight());
+                const basegfx::B2DRange aTargetRange(
+                    aViewBox.GetX(), aViewBox.GetY(), 
+                    aViewBox.GetX() + aSize.getX(), aViewBox.GetY() + aSize.getY());
 
-			// set local parameters on shape
-			uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
-			if(xPropSet.is())
-			{
-				uno::Any aAny;
+                if(!aSourceRange.equal(aTargetRange))
+                {
+                    aPolyPolygon.transform(
+                        basegfx::tools::createSourceRangeTargetRangeTransform(
+                            aSourceRange,
+                            aTargetRange));
+                }
 
-				// set svg:d
-				if(maD.getLength())
-				{
-					if(aPoints.IsCurve())
-					{
-						drawing::PolyPolygonBezierCoords aSourcePolyPolygon(
-							aPoints.GetPointSequenceSequence(),
-							aPoints.GetFlagSequenceSequence());
-
-						aAny <<= aSourcePolyPolygon;
-						xPropSet->setPropertyValue(
-							OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")), aAny);
-					}
-					else
-					{
-						aAny <<= aPoints.GetPointSequenceSequence();
-						xPropSet->setPropertyValue(
-							OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")), aAny);
-					}
-				}
-			}
+                // create shape
+                const char* pService;
 
-			// set pos, size, shear and rotate
-			SetTransformation();
+                if(aPolyPolygon.areControlPointsUsed())
+                {
+                    if(aPolyPolygon.isClosed())
+                    {
+                        pService = "com.sun.star.drawing.ClosedBezierShape";
+                    }
+                    else
+                    {
+                        pService = "com.sun.star.drawing.OpenBezierShape";
+                    }
+                }
+                else
+                {
+                    if(aPolyPolygon.isClosed())
+                    {
+                        pService = "com.sun.star.drawing.PolyPolygonShape";
+                    }
+                    else
+                    {
+                        pService = "com.sun.star.drawing.PolyLineShape";
+                    }
+                }
 
-			SdXMLShapeContext::StartElement(xAttrList);
-		}
-	}
+                // Add, set Style and properties from base shape
+                AddShape(pService);
+
+                // #89344# test for mxShape.is() and not for mxShapes.is() to support
+                // shape import helper classes WITHOUT XShapes (member mxShapes). This
+                // is used by the writer.
+                if( mxShape.is() )
+                {
+                    SetStyle();
+                    SetLayer();
+
+                    // set local parameters on shape
+                    uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
+
+                    if(xPropSet.is())
+                    {
+                        uno::Any aAny;
+
+                        // set polygon data
+                        if(aPolyPolygon.areControlPointsUsed())
+                        {
+                            drawing::PolyPolygonBezierCoords aSourcePolyPolygon;
+
+                            basegfx::tools::B2DPolyPolygonToUnoPolyPolygonBezierCoords(
+                                aPolyPolygon,
+                                aSourcePolyPolygon);
+                            aAny <<= aSourcePolyPolygon;
+                        }
+                        else
+                        {
+                            drawing::PointSequenceSequence aSourcePolyPolygon;
+
+                            basegfx::tools::B2DPolyPolygonToUnoPointSequenceSequence(
+                                aPolyPolygon,
+                                aSourcePolyPolygon);
+                            aAny <<= aSourcePolyPolygon;
+                        }
+
+                        xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")), aAny);
+                    }
+
+                    // set pos, size, shear and rotate
+                    SetTransformation();
+
+                    SdXMLShapeContext::StartElement(xAttrList);
+                }
+            }
+        }
+    }
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1843,35 +1897,36 @@ void SdXMLConnectorShapeContext::process
 			GetImport().GetMM100UnitConverter().convertMeasure(maEnd.Y, rValue);
 			return;
 		}
-		if( IsXMLToken( rLocalName, XML_D ) )
-		{
-			SdXMLImExViewBox aViewBox( 0, 0, 1, 1 );
-			awt::Point aPoint( 0, 0 );
-			awt::Size aSize( 1, 1 );		
-			
-			SdXMLImExSvgDElement aPoints( rValue, aViewBox,
-				aPoint, aSize, GetImport().GetMM100UnitConverter() );
+        if( IsXMLToken( rLocalName, XML_D ) )
+        {
+            basegfx::B2DPolyPolygon aPolyPolygon;
 
-			if ( aPoints.IsCurve() )
-			{
-				drawing::PolyPolygonBezierCoords aSourcePolyPolygon(
-					aPoints.GetPointSequenceSequence(),
-					aPoints.GetFlagSequenceSequence());
-				maPath <<= aSourcePolyPolygon;
-			}
-			else
-			{
-				const drawing::PointSequenceSequence& rOuterSeq = aPoints.GetPointSequenceSequence();
-				drawing::FlagSequenceSequence aFlagSeqSeq( rOuterSeq.getLength() );
-				for ( int a = 0; a < rOuterSeq.getLength(); a++ )
-					aFlagSeqSeq[ a ] = drawing::FlagSequence( rOuterSeq[ a ].getLength() );
-
-				drawing::PolyPolygonBezierCoords aSourcePolyPolygon(
-					aPoints.GetPointSequenceSequence(),
-					aFlagSeqSeq );
-				maPath <<= aSourcePolyPolygon;
-			}
-		}
+            if(basegfx::tools::importFromSvgD(aPolyPolygon, rValue, true, 0))
+            {
+                if(aPolyPolygon.count())
+                {
+                    // set polygon data
+                    if(aPolyPolygon.areControlPointsUsed())
+                    {
+                        drawing::PolyPolygonBezierCoords aSourcePolyPolygon;
+
+                        basegfx::tools::B2DPolyPolygonToUnoPolyPolygonBezierCoords(
+                            aPolyPolygon,
+                            aSourcePolyPolygon);
+                        maPath <<= aSourcePolyPolygon;
+                    }
+                    else
+                    {
+                        drawing::PointSequenceSequence aSourcePolyPolygon;
+
+                        basegfx::tools::B2DPolyPolygonToUnoPointSequenceSequence(
+                            aPolyPolygon,
+                            aSourcePolyPolygon);
+                        maPath <<= aSourcePolyPolygon;
+                    }
+                }
+            }
+        }
 	}
 	}
 

Modified: openoffice/trunk/main/xmloff/source/style/MarkerStyle.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/xmloff/source/style/MarkerStyle.cxx?rev=1536730&r1=1536729&r2=1536730&view=diff
==============================================================================
--- openoffice/trunk/main/xmloff/source/style/MarkerStyle.cxx (original)
+++ openoffice/trunk/main/xmloff/source/style/MarkerStyle.cxx Tue Oct 29 14:11:45 2013
@@ -19,10 +19,9 @@
  * 
  *************************************************************/
 
-
-
 // MARKER(update_precomp.py): autogen include statement, do not remove
 #include "precompiled_xmloff.hxx"
+
 #include "xmloff/MarkerStyle.hxx"
 #include "xexptran.hxx"
 #include <xmloff/attrlist.hxx>
@@ -35,6 +34,9 @@
 #include <rtl/ustrbuf.hxx>
 #include <rtl/ustring.hxx>
 #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
+#include <basegfx/polygon/b2dpolypolygon.hxx>
+#include <basegfx/polygon/b2dpolypolygontools.hxx>
+#include <basegfx/matrix/b2dhommatrixtools.hxx>
 
 using namespace ::com::sun::star;
 using ::rtl::OUString;
@@ -101,53 +103,48 @@ sal_Bool XMLMarkerStyleImport::importXML
 		}
 	}
 
-	if( bHasViewBox && bHasPathData )
-	{
-		SdXMLImExSvgDElement aPoints(strPathData, *pViewBox, awt::Point( 0, 0 ),
-			awt::Size( pViewBox->GetWidth(), pViewBox->GetHeight() ), 
-			rUnitConverter );
-
-		if(aPoints.IsCurve())
-		{
-			drawing::PolyPolygonBezierCoords aSourcePolyPolygon(
-				aPoints.GetPointSequenceSequence(),
-				aPoints.GetFlagSequenceSequence());
-			rValue <<= aSourcePolyPolygon;
-		}
-		else
-		{
-			drawing::PolyPolygonBezierCoords aSourcePolyPolygon;
-			aSourcePolyPolygon.Coordinates = aPoints.GetPointSequenceSequence();
-			aSourcePolyPolygon.Flags.realloc(aSourcePolyPolygon.Coordinates.getLength());
-
-			// Zeiger auf innere sequences holen
-			const drawing::PointSequence* pInnerSequence = aSourcePolyPolygon.Coordinates.getConstArray();
-			drawing::FlagSequence* pInnerSequenceFlags = aSourcePolyPolygon.Flags.getArray();
-
-			for(sal_Int32 a(0); a < aSourcePolyPolygon.Coordinates.getLength(); a++)
-			{
-				pInnerSequenceFlags->realloc(pInnerSequence->getLength());
-				drawing::PolygonFlags* pPolyFlags = pInnerSequenceFlags->getArray();
-
-				for(sal_Int32 b(0); b < pInnerSequence->getLength(); b++)
-					*pPolyFlags++ = drawing::PolygonFlags_NORMAL;
-
-				// next run
-				pInnerSequence++;
-				pInnerSequenceFlags++;
-			}
-
-			rValue <<= aSourcePolyPolygon;
-		}		
-
-		if( aDisplayName.getLength() )
-		{
-			rImport.AddStyleDisplayName( XML_STYLE_FAMILY_SD_MARKER_ID, rStrName, 
-										aDisplayName );
-			rStrName = aDisplayName;
-		}
-
-	}
+    if( bHasViewBox && bHasPathData )
+    {
+        basegfx::B2DPolyPolygon aPolyPolygon;
+
+        if(basegfx::tools::importFromSvgD(aPolyPolygon, strPathData, true, 0))
+        {
+            if(aPolyPolygon.count())
+            {
+                // ViewBox probably not used, but stay with former processing inside of
+                // SdXMLImExSvgDElement
+                const basegfx::B2DRange aSourceRange(
+                    pViewBox->GetX(), pViewBox->GetY(), 
+                    pViewBox->GetX() + pViewBox->GetWidth(), pViewBox->GetY() + pViewBox->GetHeight());
+                const basegfx::B2DRange aTargetRange(
+                    0.0, 0.0, 
+                    pViewBox->GetWidth(), pViewBox->GetHeight());
+
+                if(!aSourceRange.equal(aTargetRange))
+                {
+                    aPolyPolygon.transform(
+                        basegfx::tools::createSourceRangeTargetRangeTransform(
+                            aSourceRange,
+                            aTargetRange));
+                }
+
+                // always use PolyPolygonBezierCoords here
+                drawing::PolyPolygonBezierCoords aSourcePolyPolygon;
+
+                basegfx::tools::B2DPolyPolygonToUnoPolyPolygonBezierCoords(
+                    aPolyPolygon,
+                    aSourcePolyPolygon);
+                rValue <<= aSourcePolyPolygon;
+            }
+        }
+
+        if( aDisplayName.getLength() )
+        {
+            rImport.AddStyleDisplayName( XML_STYLE_FAMILY_SD_MARKER_ID, rStrName, 
+                                        aDisplayName );
+            rStrName = aDisplayName;
+        }
+    }
 
 	if( pViewBox )
 		delete pViewBox;
@@ -175,108 +172,60 @@ sal_Bool XMLMarkerStyleExport::exportXML
     const OUString& rStrName, 
     const uno::Any& rValue )
 {
-	sal_Bool bRet(sal_False);
-	
-	if(rStrName.getLength())
-	{
-		drawing::PolyPolygonBezierCoords aBezier;
-	
-		if(rValue >>= aBezier)
-		{
-			OUString aStrValue;
-			OUStringBuffer aOut;
-
-			/////////////////
-			// Name
-			sal_Bool bEncoded = sal_False;
-			OUString aStrName( rStrName );
-			rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, 
-								  rExport.EncodeStyleName( aStrName,
-														   &bEncoded ) );
-			if( bEncoded )
-				rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DISPLAY_NAME, 
-									  aStrName );
-			 
-			/////////////////
-			// Viewbox (viewBox="0 0 1500 1000")
-			sal_Int32 nMinX(0x7fffffff);
-			sal_Int32 nMaxX(0x80000000); 
-			sal_Int32 nMinY(0x7fffffff); 
-			sal_Int32 nMaxY(0x80000000);
-			sal_Int32 nOuterCnt(aBezier.Coordinates.getLength());
-			drawing::PointSequence* pOuterSequence = aBezier.Coordinates.getArray();
-			sal_Int32 a, b;
-			sal_Bool bClosed(sal_False);
-
-            for (a = 0; a < nOuterCnt; a++)
-			{
-				drawing::PointSequence* pSequence = pOuterSequence++;
-				const awt::Point *pPoints = pSequence->getConstArray();
-				sal_Int32 nPointCount(pSequence->getLength());
-
-				if(nPointCount)
-				{
-					const awt::Point aStart = pPoints[0];
-					const awt::Point aEnd = pPoints[nPointCount - 1];
-
-					if(aStart.X == aEnd.X && aStart.Y == aEnd.Y)
-					{
-						bClosed = sal_True;
-					}
-				}
-
-                for (b = 0; b < nPointCount; b++)
-				{
-					const awt::Point aPoint = pPoints[b];
-
-					if( aPoint.X < nMinX )
-						nMinX = aPoint.X;
-
-					if( aPoint.X > nMaxX )
-						nMaxX = aPoint.X;
-					
-					if( aPoint.Y < nMinY )
-						nMinY = aPoint.Y;
-					
-					if( aPoint.Y > nMaxY )
-						nMaxY = aPoint.Y;
-				}
-			}
-
-			sal_Int32 nDifX(nMaxX - nMinX);
-			sal_Int32 nDifY(nMaxY - nMinY);
-
-			SdXMLImExViewBox aViewBox( 0, 0, nDifX, nDifY );  
-			rExport.AddAttribute( XML_NAMESPACE_SVG, XML_VIEWBOX, aViewBox.GetExportString() );
-			
-			/////////////////
-			// Pathdata
-			pOuterSequence = aBezier.Coordinates.getArray();
-			drawing::FlagSequence*  pOuterFlags = aBezier.Flags.getArray();
-			SdXMLImExSvgDElement aSvgDElement(aViewBox);
-			
-            for (a = 0; a < nOuterCnt; a++)
-			{
-				drawing::PointSequence* pSequence = pOuterSequence++;
-				drawing::FlagSequence* pFlags = pOuterFlags++;
-
-				aSvgDElement.AddPolygon(pSequence, pFlags,
-					awt::Point( 0, 0 ), 
-					awt::Size( aViewBox.GetWidth(), aViewBox.GetHeight() ), 
-					bClosed);
-			}
-
-			// write point array
-			rExport.AddAttribute(XML_NAMESPACE_SVG, XML_D, aSvgDElement.GetExportString());
-
-			/////////////////
-			// Do Write
-            SvXMLElementExport rElem( rExport, XML_NAMESPACE_DRAW, XML_MARKER,
-                                      sal_True, sal_False );
-		}
-	}
-	
-	return bRet;
+    sal_Bool bRet(sal_False);
+    
+    if(rStrName.getLength())
+    {
+        drawing::PolyPolygonBezierCoords aBezier;
+
+        if(rValue >>= aBezier)
+        {
+            /////////////////
+            // Name
+            sal_Bool bEncoded(sal_False);
+            OUString aStrName( rStrName );
+
+            rExport.AddAttribute(XML_NAMESPACE_DRAW, XML_NAME, rExport.EncodeStyleName( aStrName, &bEncoded ) );
+
+            if( bEncoded )
+            {
+                rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DISPLAY_NAME, aStrName );
+            }
+
+            const basegfx::B2DPolyPolygon aPolyPolygon(
+                basegfx::tools::UnoPolyPolygonBezierCoordsToB2DPolyPolygon(
+                    aBezier));
+            const basegfx::B2DRange aPolyPolygonRange(aPolyPolygon.getB2DRange());
+
+            /////////////////
+            // Viewbox (viewBox="0 0 1500 1000")
+
+            SdXMLImExViewBox aViewBox(
+                aPolyPolygonRange.getMinX(), 
+                aPolyPolygonRange.getMinY(),
+                aPolyPolygonRange.getWidth(),
+                aPolyPolygonRange.getHeight());  
+            rExport.AddAttribute( XML_NAMESPACE_SVG, XML_VIEWBOX, aViewBox.GetExportString() );
+            
+            /////////////////
+            // Pathdata
+            const ::rtl::OUString aPolygonString(
+                basegfx::tools::exportToSvgD(
+                    aPolyPolygon,
+                    true,           // bUseRelativeCoordinates
+                    false,          // bDetectQuadraticBeziers: not used in old, but maybe activated now
+                    true));         // bHandleRelativeNextPointCompatible
+
+            // write point array
+            rExport.AddAttribute(XML_NAMESPACE_SVG, XML_D, aPolygonString);
+
+            /////////////////
+            // Do Write
+            SvXMLElementExport rElem( rExport, XML_NAMESPACE_DRAW, XML_MARKER, sal_True, sal_False );
+        }
+    }
+    
+    return bRet;
 }
 
 #endif // #ifndef SVX_LIGHT