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/25 18:25:48 UTC

svn commit: r1535773 - in /openoffice/branches/alg/aw080/main: filter/source/msfilter/ sc/source/ui/view/ svx/inc/svx/ svx/source/sdr/overlay/ svx/source/unodraw/ sw/source/filter/ww8/ xmloff/source/draw/

Author: alg
Date: Fri Oct 25 16:25:48 2013
New Revision: 1535773

URL: http://svn.apache.org/r1535773
Log:
in-between commit with changes to MS binary format stuff, Calc overlay, circle type cleanup, rotated obejct export for word

Modified:
    openoffice/branches/alg/aw080/main/filter/source/msfilter/eschesdo.cxx
    openoffice/branches/alg/aw080/main/filter/source/msfilter/eschesdo.hxx
    openoffice/branches/alg/aw080/main/sc/source/ui/view/tabview5.cxx
    openoffice/branches/alg/aw080/main/svx/inc/svx/svdocirc.hxx
    openoffice/branches/alg/aw080/main/svx/source/sdr/overlay/overlaymanager.cxx
    openoffice/branches/alg/aw080/main/svx/source/unodraw/unoshape.cxx
    openoffice/branches/alg/aw080/main/sw/source/filter/ww8/wrtw8esh.cxx
    openoffice/branches/alg/aw080/main/xmloff/source/draw/ximpshap.cxx

Modified: openoffice/branches/alg/aw080/main/filter/source/msfilter/eschesdo.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/alg/aw080/main/filter/source/msfilter/eschesdo.cxx?rev=1535773&r1=1535772&r2=1535773&view=diff
==============================================================================
--- openoffice/branches/alg/aw080/main/filter/source/msfilter/eschesdo.cxx (original)
+++ openoffice/branches/alg/aw080/main/filter/source/msfilter/eschesdo.cxx Fri Oct 25 16:25:48 2013
@@ -166,7 +166,6 @@ void ImplEESdrWriter::ImplHandleRotation
         const basegfx::B2DPoint aCurrentCenter(ImplMapB2DPoint(rMat.getB2DHomMatrix() * basegfx::B2DPoint(0.5, 0.5)));
         const basegfx::B2DPoint aObjectRangeCenter(rObj.getObjectRange().getCenter());
         basegfx::B2DRange aObjectRange(rObj.getObjectRange());
-        bool bChanged(false);
 
         if(!aCurrentCenter.equal(aObjectRangeCenter))
         {
@@ -175,7 +174,6 @@ void ImplEESdrWriter::ImplHandleRotation
                     aCurrentCenter - aObjectRangeCenter));
 
             aObjectRange.transform(aAdaptToCenterRotation);
-            bChanged = true;
         }
 
         // do use inverted rotation here: The old model format (in which the value is here)
@@ -199,7 +197,6 @@ void ImplEESdrWriter::ImplHandleRotation
                     F_PI2));
 
             aObjectRange.transform(aMirrorDiagonal);
-            bChanged = true;
         }
 
         rObj.setObjectRange(aObjectRange);
@@ -1551,4 +1548,29 @@ bool ImplEESdrObject::ImplHasText() cons
 	return xXText.is() && xXText->getString().getLength();
 }
 
+void ImplEESdrObject::setObjectRange(const basegfx::B2DRange& rObjectRange)
+{ 
+    maObjectRange = rObjectRange; 
+}
+
+const basegfx::B2DRange& ImplEESdrObject::getObjectRange() const 
+{ 
+    return maObjectRange; 
+}
+
+sal_Int32 ImplEESdrObject::GetAngle() const
+{ 
+    return mnAngle; 
+}
+
+void ImplEESdrObject::SetAngle(sal_Int32 nVal)
+{ 
+    mnAngle = nVal; 
+}
+
+basegfx::tools::B2DHomMatrixBufferedOnDemandDecompose& ImplEESdrObject::getTransform() 
+{ 
+    return maObjTrans; 
+}
+
 // eof

Modified: openoffice/branches/alg/aw080/main/filter/source/msfilter/eschesdo.hxx
URL: http://svn.apache.org/viewvc/openoffice/branches/alg/aw080/main/filter/source/msfilter/eschesdo.hxx?rev=1535773&r1=1535772&r2=1535773&view=diff
==============================================================================
--- openoffice/branches/alg/aw080/main/filter/source/msfilter/eschesdo.hxx (original)
+++ openoffice/branches/alg/aw080/main/filter/source/msfilter/eschesdo.hxx Fri Oct 25 16:25:48 2013
@@ -74,11 +74,11 @@ public:
 	const String&		GetType() const 		{ return mType; }
 	void				SetType( const String& rS ) { mType = rS; }
 
-    void setObjectRange(const basegfx::B2DRange& rObjectRange) { maObjectRange = rObjectRange; }
-    const basegfx::B2DRange& getObjectRange() const { return maObjectRange; }
+    void setObjectRange(const basegfx::B2DRange& rObjectRange);
+    const basegfx::B2DRange& getObjectRange() const;
 
-	sal_Int32				GetAngle() const 		{ return mnAngle; }
-	void				SetAngle( sal_Int32 nVal ) 	{ mnAngle = nVal; }
+    sal_Int32 GetAngle() const;
+    void SetAngle(sal_Int32 nVal);
 
 	sal_uInt32				GetTextSize() const 	{ return mnTextSize; }
 
@@ -93,7 +93,7 @@ public:
 	sal_uInt32 				ImplGetText();
 	bool 				ImplHasText() const;
 
-    basegfx::tools::B2DHomMatrixBufferedOnDemandDecompose& getTransform() { return maObjTrans; }
+    basegfx::tools::B2DHomMatrixBufferedOnDemandDecompose& getTransform();
 };
 
 

Modified: openoffice/branches/alg/aw080/main/sc/source/ui/view/tabview5.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/alg/aw080/main/sc/source/ui/view/tabview5.cxx?rev=1535773&r1=1535772&r2=1535773&view=diff
==============================================================================
--- openoffice/branches/alg/aw080/main/sc/source/ui/view/tabview5.cxx (original)
+++ openoffice/branches/alg/aw080/main/sc/source/ui/view/tabview5.cxx Fri Oct 25 16:25:48 2013
@@ -171,35 +171,51 @@ __EXPORT ScTabView::~ScTabView()
 
 	DELETEZ(pInputHintWindow);
 
-	if (pDrawView)
-	{
-		for (i=0; i<4; i++)
-			if (pGridWin[i])
-			{
-				pDrawView->VCRemoveWin(pGridWin[i]);
-				pDrawView->DeleteWindowFromPaintView(pGridWin[i]);
-			}
-	}
+    if(pDrawView)
+    {
+        for(i=0; i<4; i++)
+        {
+            if(pGridWin[i])
+            {
+                pDrawView->VCRemoveWin(pGridWin[i]);
+                pDrawView->DeleteWindowFromPaintView(pGridWin[i]);
+            }
+        }
 
-	delete pSelEngine;
+        delete pDrawView;
+        pDrawView = 0;
+    }
 
-	for (i=0; i<4; i++)
-		delete pGridWin[i];
+    delete pSelEngine;
+    pSelEngine = 0;
 
-	delete pHdrSelEng;
+    for (i=0; i<4; i++)
+    {
+        delete pGridWin[i];
+        pGridWin[i] = 0;
+    }
 
-	for (i=0; i<2; i++)
-	{
-		delete pColBar[i];
-		delete pRowBar[i];
-		delete pColOutline[i];
-		delete pRowOutline[i];
-	}
+    delete pHdrSelEng;
+    pHdrSelEng = 0;
 
-	delete pHSplitter;
-	delete pVSplitter;
+    for (i=0; i<2; i++)
+    {
+        delete pColBar[i];
+        pColBar[i] = 0;
+        delete pRowBar[i];
+        pRowBar[i] = 0;
+        delete pColOutline[i];
+        pColOutline[i] = 0;
+        delete pRowOutline[i];
+        pRowOutline[i] = 0;
+    }
 
-	delete pTabControl;
+    delete pHSplitter;
+    pHSplitter = 0;
+    delete pVSplitter;
+    pVSplitter = 0;
+    delete pTabControl;
+    pTabControl = 0;
 }
 
 void ScTabView::MakeDrawView( sal_uInt8 nForceDesignMode )

Modified: openoffice/branches/alg/aw080/main/svx/inc/svx/svdocirc.hxx
URL: http://svn.apache.org/viewvc/openoffice/branches/alg/aw080/main/svx/inc/svx/svdocirc.hxx?rev=1535773&r1=1535772&r2=1535773&view=diff
==============================================================================
--- openoffice/branches/alg/aw080/main/svx/inc/svx/svdocirc.hxx (original)
+++ openoffice/branches/alg/aw080/main/svx/inc/svx/svdocirc.hxx Fri Oct 25 16:25:48 2013
@@ -33,10 +33,10 @@
 enum SdrCircleObjType
 {
 	/// basic types the circle may have
-	CircleType_Circle = 0,			// old OBJ_CIRC
-	CircleType_Sector,				// old OBJ_SECT
-	CircleType_Arc,					// old OBJ_CARC
-	CircleType_Segment,				// old OBJ_CCUT
+	CircleType_Circle = 0,			// old OBJ_CIRC -> drawing::CircleKind_FULL
+	CircleType_Sector,				// old OBJ_SECT -> drawing::CircleKind_SECTION
+	CircleType_Arc,					// old OBJ_CARC -> drawing::CircleKind_ARC
+	CircleType_Segment,				// old OBJ_CCUT -> drawing::CircleKind_CUT
 };
 
 //////////////////////////////////////////////////////////////////////////////

Modified: openoffice/branches/alg/aw080/main/svx/source/sdr/overlay/overlaymanager.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/alg/aw080/main/svx/source/sdr/overlay/overlaymanager.cxx?rev=1535773&r1=1535772&r2=1535773&view=diff
==============================================================================
--- openoffice/branches/alg/aw080/main/svx/source/sdr/overlay/overlaymanager.cxx (original)
+++ openoffice/branches/alg/aw080/main/svx/source/sdr/overlay/overlaymanager.cxx Fri Oct 25 16:25:48 2013
@@ -155,7 +155,15 @@ namespace sdr
 
 				if(OUTDEV_WINDOW == getOutputDevice().GetOutDevType())
 				{
-                    aViewRange = getOutputDevice().GetLogicRange();
+					const Size aOutputSizePixel(getOutputDevice().GetOutputSizePixel());
+
+                    // only set when we *have* a output size, else let aViewRange
+                    // stay on empty
+                    if(aOutputSizePixel.Width() && aOutputSizePixel.Height())
+                    {
+                        aViewRange = basegfx::B2DRange(0.0, 0.0, aOutputSizePixel.getWidth(), aOutputSizePixel.getHeight());
+                        aViewRange.transform(getOutputDevice().GetInverseViewTransformation());
+                    }
 				}
 
                 OverlayManager* pThis = const_cast< OverlayManager* >(this);

Modified: openoffice/branches/alg/aw080/main/svx/source/unodraw/unoshape.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/alg/aw080/main/svx/source/unodraw/unoshape.cxx?rev=1535773&r1=1535772&r2=1535773&view=diff
==============================================================================
--- openoffice/branches/alg/aw080/main/svx/source/unodraw/unoshape.cxx (original)
+++ openoffice/branches/alg/aw080/main/svx/source/unodraw/unoshape.cxx Fri Oct 25 16:25:48 2013
@@ -3286,16 +3286,16 @@ bool SvxShape::getPropertyValueImpl( con
 
             if(pSdrCircObj)
 			{
-				drawing::CircleKind eKind;
+				drawing::CircleKind eKind(drawing::CircleKind_FULL);
 
 				switch(pSdrCircObj->GetSdrCircleObjType())
 				{
-                    case CircleType_Circle:
+                    default: // case CircleType_Circle:
                     {
                         eKind = drawing::CircleKind_FULL;
                         break;
                     }
-                    case CircleType_Sector:
+                    case CircleType_Segment:
                     {
                         eKind = drawing::CircleKind_CUT;
                         break;
@@ -3305,7 +3305,7 @@ bool SvxShape::getPropertyValueImpl( con
                         eKind = drawing::CircleKind_ARC;
                         break;
                     }
-                    case CircleType_Segment:
+                    case CircleType_Sector:
                     {
                         eKind = drawing::CircleKind_SECTION;
                         break;

Modified: openoffice/branches/alg/aw080/main/sw/source/filter/ww8/wrtw8esh.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/alg/aw080/main/sw/source/filter/ww8/wrtw8esh.cxx?rev=1535773&r1=1535772&r2=1535773&view=diff
==============================================================================
--- openoffice/branches/alg/aw080/main/sw/source/filter/ww8/wrtw8esh.cxx (original)
+++ openoffice/branches/alg/aw080/main/sw/source/filter/ww8/wrtw8esh.cxx Fri Oct 25 16:25:48 2013
@@ -715,6 +715,8 @@ void PlcDrawObj::WritePlc( WW8Export& rW
             // <--
 
             Point aObjPos;
+            double fObjectRotation(0);
+
             if (RES_FLYFRMFMT == rFmt.Which())
             {
                 SwRect aLayRect(rFmt.FindLayoutRect(false, &aObjPos));
@@ -740,7 +742,36 @@ void PlcDrawObj::WritePlc( WW8Export& rW
                 ASSERT(pObj, "wo ist das SDR-Object?");
                 if (pObj)
                 {
-                    aRect = sdr::legacy::GetSnapRect(*pObj);
+                    // original used SnapRect, but the unrotated snap range is sufficient
+                    // here; for rotation a special treatment is needed anyways (see below)
+                    const basegfx::B2DRange aUnrotatedRange(
+                        pObj->getSdrObjectTranslate(),
+                        pObj->getSdrObjectTranslate() + pObj->getSdrObjectScale());
+
+                    // fill aRect with it
+                    aRect.Left() = basegfx::fround(aUnrotatedRange.getMinX());
+                    aRect.Top() = basegfx::fround(aUnrotatedRange.getMinY());
+                    aRect.Right() = basegfx::fround(aUnrotatedRange.getMaxX());
+                    aRect.Bottom() = basegfx::fround(aUnrotatedRange.getMaxY());
+
+                    // get ObjectRotation; prefer rotation over mirroring
+                    fObjectRotation = pObj->getSdrObjectRotate();
+                    bool bMirroredX(pObj->getSdrObjectScale().getX() < 0.0);
+                    bool bMirroredY(pObj->getSdrObjectScale().getY() < 0.0);
+
+                    // if mirror is X and Y, replace with 180 degree rotation. Prefer
+                    // rotation export over mirror export.
+                    if(bMirroredX && bMirroredY)
+                    {
+                        bMirroredX = bMirroredY = false;
+                        fObjectRotation += F_PI;
+                    }
+
+                    if(bMirroredX != bMirroredY)
+                    {
+                        // if one axis is mirrored, invert the rotation
+                        fObjectRotation = -fObjectRotation;
+                    }
                 }
             }
 
@@ -780,6 +811,57 @@ void PlcDrawObj::WritePlc( WW8Export& rW
                 nThick = 0;
             }
 
+            if(!basegfx::fTools::equalZero(fObjectRotation))
+            {
+                // we rotate around top-left, mS around center, so adapt position by
+                // correlating the two different centers of the objects
+                basegfx::B2DRange aUnrotatedRange(
+                    pObj->getSdrObjectTranslate(),
+                    pObj->getSdrObjectTranslate() + pObj->getSdrObjectScale());
+                const basegfx::B2DPoint aRealCenter(pObj->getSdrObjectTransformation() * basegfx::B2DPoint(0.5, 0.5));
+                const basegfx::B2DPoint aUnrotatedCenter(aUnrotatedRange.getCenter());
+
+                aUnrotatedRange.transform(
+                    basegfx::tools::createTranslateB2DHomMatrix(
+                        aRealCenter - aUnrotatedCenter));
+
+                // also need to correct by the SnapRect which was used for positioning;
+                // remove TopLeft of it and add aRect's adapted position
+                const basegfx::B2DRange aSnapRange(pObj->getSnapRange());
+
+                aUnrotatedRange.transform(
+                    basegfx::tools::createTranslateB2DHomMatrix(
+                        aRect.Left() - aSnapRange.getMinX(),
+                        aRect.Top() - aSnapRange.getMinY()));
+
+                // extract ObjectRotation in MS coordinates to decide if the
+                // ObjectRange needs to be 'mirrored diagonal', a special treatment
+                // for MS shapes in their formats
+                const sal_Int32 nAngle(basegfx::fround(basegfx::snapToZeroRange(fObjectRotation / F_PI18000, 36000.0)));
+
+                // adapt angle to MS format
+                sal_Int32 nMSAngle(nAngle * 655);
+                nMSAngle += 0x8000;
+                nMSAngle &=~0xffff; // round to full degrees
+
+                // detect if MS format needs a mirroring on diagonal
+                const bool bMirrorDiagonal((nMSAngle >= (45 << 16) && nMSAngle < (135 << 16)) || (nMSAngle >= (225 << 16) && nMSAngle < (315 << 16)));
+
+                if(bMirrorDiagonal)
+                {
+                    // in this range of rotation the object range is rotated, do this here, too
+                    aUnrotatedRange.transform(
+                        basegfx::tools::createRotateAroundPoint(
+                            aUnrotatedRange.getCenter(),
+                            F_PI2));
+                }
+
+                aRect.Left() = basegfx::fround(aUnrotatedRange.getMinX());
+                aRect.Top() = basegfx::fround(aUnrotatedRange.getMinY());
+                aRect.Right() = basegfx::fround(aUnrotatedRange.getMaxX());
+                aRect.Bottom() = basegfx::fround(aUnrotatedRange.getMaxY());
+            }
+
             // spid
             SwWW8Writer::WriteLong(*rWrt.pTableStrm, aIter->mnShapeId);
 

Modified: openoffice/branches/alg/aw080/main/xmloff/source/draw/ximpshap.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/alg/aw080/main/xmloff/source/draw/ximpshap.cxx?rev=1535773&r1=1535772&r2=1535773&view=diff
==============================================================================
--- openoffice/branches/alg/aw080/main/xmloff/source/draw/ximpshap.cxx (original)
+++ openoffice/branches/alg/aw080/main/xmloff/source/draw/ximpshap.cxx Fri Oct 25 16:25:48 2013
@@ -1236,8 +1236,8 @@ void SdXMLEllipseShapeContext::StartElem
 
         if(!basegfx::fTools::equalZero(mfCX)
             || !basegfx::fTools::equalZero(mfCY)
-            || !basegfx::fTools::equalZero(mfRX)
-            || !basegfx::fTools::equalZero(mfRY))
+            || !basegfx::fTools::equal(mfRX, 1.0)
+            || !basegfx::fTools::equal(mfRY, 1.0))
         {
             // #121972# center/radius is used, put to pos and size
             maObjectSize.setX(2.0 * mfRX);