summaryrefslogtreecommitdiff
path: root/svx/source/svdraw
diff options
context:
space:
mode:
authorArmin Weiss <aw@openoffice.org>2001-01-16 12:48:17 +0000
committerArmin Weiss <aw@openoffice.org>2001-01-16 12:48:17 +0000
commit3d7dcb2b30d325472607336c241b0ebe6a7b2e84 (patch)
tree2fa663ffef76de03095cdb7f74b8630c0960f50d /svx/source/svdraw
parentee7bab937a8406f752ce94dafd875d0f1fc8ec5f (diff)
#79946# changed bijective transformations, reimplementation
Diffstat (limited to 'svx/source/svdraw')
-rw-r--r--svx/source/svdraw/gradtrns.cxx448
-rw-r--r--svx/source/svdraw/gradtrns.hxx25
2 files changed, 439 insertions, 34 deletions
diff --git a/svx/source/svdraw/gradtrns.cxx b/svx/source/svdraw/gradtrns.cxx
index fc3601161082..6e402a5a1d5a 100644
--- a/svx/source/svdraw/gradtrns.cxx
+++ b/svx/source/svdraw/gradtrns.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: gradtrns.cxx,v $
*
- * $Revision: 1.1.1.1 $
+ * $Revision: 1.2 $
*
- * last change: $Author: hr $ $Date: 2000-09-18 17:01:24 $
+ * last change: $Author: aw $ $Date: 2001-01-16 13:48:17 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -70,6 +70,422 @@
#include <goodies/matrix3d.hxx>
#endif
+//////////////////////////////////////////////////////////////////////////////
+
+void GradTransformer::GradToVec(GradTransGradient& rG, GradTransVector& rV,
+ const SdrObject* pObj)
+{
+ // handle start color
+ rV.aCol1 = rG.aGradient.GetStartColor();
+ if(rG.aGradient.GetStartIntens() != 100)
+ {
+ double fFact = (double)rG.aGradient.GetStartIntens() / 100.0;
+ rV.aCol1 = (B3dColor)rV.aCol1 * fFact;
+ }
+
+ // handle end color
+ rV.aCol2 = rG.aGradient.GetEndColor();
+ if(rG.aGradient.GetEndIntens() != 100)
+ {
+ double fFact = (double)rG.aGradient.GetEndIntens() / 100.0;
+ rV.aCol2 = (B3dColor)rV.aCol2 * fFact;
+ }
+
+ // calc the basic positions
+ Rectangle aRect(pObj->GetSnapRect());
+ Vector2D aCenter(aRect.Center());
+ Vector2D aStartPos, aEndPos;
+
+ switch(rG.aGradient.GetGradientStyle())
+ {
+ case XGRAD_LINEAR :
+ {
+ aStartPos = Vector2D(aCenter.X(), aRect.Top());
+ aEndPos = Vector2D(aCenter.X(), aRect.Bottom());
+
+ if(rG.aGradient.GetBorder())
+ {
+ Vector2D aFullVec(aStartPos - aEndPos);
+ double fLen = (aFullVec.GetLength() * (100.0 - (double)rG.aGradient.GetBorder())) / 100.0;
+ aFullVec.Normalize();
+ aStartPos = aEndPos + (aFullVec * fLen);
+ }
+
+ if(rG.aGradient.GetAngle())
+ {
+ double fAngle = (double)rG.aGradient.GetAngle() * (F_PI180 / 10.0);
+ Matrix3D aTrans;
+ aTrans.Translate(-aCenter);
+ aTrans.Rotate(-fAngle);
+ aTrans.Translate(aCenter);
+ aStartPos *= aTrans;
+ aEndPos *= aTrans;
+ }
+ break;
+ }
+ case XGRAD_AXIAL :
+ {
+ aStartPos = aCenter;
+ aEndPos = Vector2D(aCenter.X(), aRect.Bottom());
+
+ if(rG.aGradient.GetBorder())
+ {
+ Vector2D aFullVec(aEndPos - aStartPos);
+ double fLen = (aFullVec.GetLength() * (100.0 - (double)rG.aGradient.GetBorder())) / 100.0;
+ aFullVec.Normalize();
+ aEndPos = aStartPos + (aFullVec * fLen);
+ }
+
+ if(rG.aGradient.GetAngle())
+ {
+ double fAngle = (double)rG.aGradient.GetAngle() * (F_PI180 / 10.0);
+ Matrix3D aTrans;
+ aTrans.Translate(-aCenter);
+ aTrans.Rotate(-fAngle);
+ aTrans.Translate(aCenter);
+ aStartPos *= aTrans;
+ aEndPos *= aTrans;
+ }
+ break;
+ }
+ case XGRAD_RADIAL :
+ case XGRAD_SQUARE :
+ {
+ aStartPos = Vector2D(aRect.BottomLeft());
+ aEndPos = Vector2D(aRect.TopLeft());
+
+ if(rG.aGradient.GetBorder())
+ {
+ Vector2D aFullVec(aStartPos - aEndPos);
+ double fLen = (aFullVec.GetLength() * (100.0 - (double)rG.aGradient.GetBorder())) / 100.0;
+ aFullVec.Normalize();
+ aStartPos = aEndPos + (aFullVec * fLen);
+ }
+
+ if(rG.aGradient.GetAngle())
+ {
+ double fAngle = (double)rG.aGradient.GetAngle() * (F_PI180 / 10.0);
+ Matrix3D aTrans;
+ aTrans.Translate(-aEndPos);
+ aTrans.Rotate(-fAngle);
+ aTrans.Translate(aEndPos);
+ aStartPos *= aTrans;
+ aEndPos *= aTrans;
+ }
+
+ if(rG.aGradient.GetXOffset() || rG.aGradient.GetYOffset())
+ {
+ Vector2D aOffset(
+ ((double)aRect.GetWidth() * rG.aGradient.GetXOffset()) / 100.0,
+ ((double)aRect.GetHeight() * rG.aGradient.GetYOffset()) / 100.0);
+ aStartPos += aOffset;
+ aEndPos += aOffset;
+ }
+
+ break;
+ }
+ case XGRAD_ELLIPTICAL :
+ case XGRAD_RECT :
+ {
+ aStartPos = Vector2D(aRect.Left(), aCenter.Y());
+ aEndPos = Vector2D(aRect.TopLeft());
+
+ if(rG.aGradient.GetBorder())
+ {
+ Vector2D aFullVec(aStartPos - aEndPos);
+ double fLen = (aFullVec.GetLength() * (100.0 - (double)rG.aGradient.GetBorder())) / 100.0;
+ aFullVec.Normalize();
+ aStartPos = aEndPos + (aFullVec * fLen);
+ }
+
+ if(rG.aGradient.GetAngle())
+ {
+ double fAngle = (double)rG.aGradient.GetAngle() * (F_PI180 / 10.0);
+ Matrix3D aTrans;
+ aTrans.Translate(-aEndPos);
+ aTrans.Rotate(-fAngle);
+ aTrans.Translate(aEndPos);
+ aStartPos *= aTrans;
+ aEndPos *= aTrans;
+ }
+
+ if(rG.aGradient.GetXOffset() || rG.aGradient.GetYOffset())
+ {
+ Vector2D aOffset(
+ ((double)aRect.GetWidth() * rG.aGradient.GetXOffset()) / 100.0,
+ ((double)aRect.GetHeight() * rG.aGradient.GetYOffset()) / 100.0);
+ aStartPos += aOffset;
+ aEndPos += aOffset;
+ }
+
+ break;
+ }
+ }
+
+ // set values for vector positions now
+ rV.aPos1 = Point((INT32)(aStartPos.X() + 0.5), (INT32)(aStartPos.Y() + 0.5));
+ rV.aPos2 = Point((INT32)(aEndPos.X() + 0.5), (INT32)(aEndPos.Y() + 0.5));
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+void GradTransformer::VecToGrad(GradTransVector& rV, GradTransGradient& rG,
+ GradTransGradient& rGOld, const SdrObject* pObj, BOOL bMoveSingle, BOOL bMoveFirst)
+{
+ // fill old gradient to new gradient to have a base
+ rG = rGOld;
+
+ // handle color changes
+ if(rV.aCol1 != rGOld.aGradient.GetStartColor())
+ {
+ rG.aGradient.SetStartColor(rV.aCol1);
+ rG.aGradient.SetStartIntens(100);
+ }
+ if(rV.aCol2 != rGOld.aGradient.GetEndColor())
+ {
+ rG.aGradient.SetEndColor(rV.aCol2);
+ rG.aGradient.SetEndIntens(100);
+ }
+
+ // calc the basic positions
+ Rectangle aRect(pObj->GetSnapRect());
+ Vector2D aCenter(aRect.Center());
+ Vector2D aStartPos(rV.aPos1);
+ Vector2D aEndPos(rV.aPos2);
+
+ switch(rG.aGradient.GetGradientStyle())
+ {
+ case XGRAD_LINEAR :
+ {
+ if(!bMoveSingle || (bMoveSingle && !bMoveFirst))
+ {
+ Vector2D aFullVec(aEndPos - aStartPos);
+ if(bMoveSingle)
+ aFullVec = aEndPos - aCenter;
+
+ aFullVec.Normalize();
+
+ double fNewFullAngle = atan2(aFullVec.Y(), aFullVec.X());
+ fNewFullAngle /= F_PI180;
+ fNewFullAngle *= -10.0;
+ fNewFullAngle += 900.0;
+
+ // clip
+ while(fNewFullAngle < 0.0)
+ fNewFullAngle += 3600.0;
+ while(fNewFullAngle >= 3600.0)
+ fNewFullAngle -= 3600.0;
+
+ // to int and set
+ sal_Int32 nNewAngle = (sal_Int32)(fNewFullAngle + 0.5);
+ if(nNewAngle != rGOld.aGradient.GetAngle())
+ rG.aGradient.SetAngle(nNewAngle);
+ }
+
+ if(!bMoveSingle || (bMoveSingle && bMoveFirst))
+ {
+ Vector2D aFullVec(aEndPos - aStartPos);
+ Vector2D aOldVec(aRect.BottomLeft() - aRect.TopLeft());
+ double fFullLen = aFullVec.GetLength();
+ double fOldLen = aOldVec.GetLength();
+ double fNewBorder = (fFullLen * 100.0) / fOldLen;
+ sal_Int32 nNewBorder = 100 - (sal_Int32)(fNewBorder + 0.5);
+
+ // clip
+ if(nNewBorder < 0)
+ nNewBorder = 0;
+ if(nNewBorder > 100)
+ nNewBorder = 100;
+
+ // set
+ if(nNewBorder != rG.aGradient.GetBorder())
+ rG.aGradient.SetBorder((sal_uInt16)nNewBorder);
+ }
+
+ break;
+ }
+ case XGRAD_AXIAL :
+ {
+ if(!bMoveSingle || (bMoveSingle && !bMoveFirst))
+ {
+ Vector2D aFullVec(aEndPos - aCenter);
+ Vector2D aOldVec(Vector2D(aCenter.X(), aRect.Bottom()) - aCenter);
+ double fFullLen = aFullVec.GetLength();
+ double fOldLen = aOldVec.GetLength();
+ double fNewBorder = (fFullLen * 100.0) / fOldLen;
+ sal_Int32 nNewBorder = 100 - (sal_Int32)(fNewBorder + 0.5);
+
+ // clip
+ if(nNewBorder < 0)
+ nNewBorder = 0;
+ if(nNewBorder > 100)
+ nNewBorder = 100;
+
+ // set
+ if(nNewBorder != rG.aGradient.GetBorder())
+ rG.aGradient.SetBorder((sal_uInt16)nNewBorder);
+
+ aFullVec.Normalize();
+ double fNewFullAngle = atan2(aFullVec.Y(), aFullVec.X());
+ fNewFullAngle /= F_PI180;
+ fNewFullAngle *= -10.0;
+ fNewFullAngle += 900.0;
+
+ // clip
+ while(fNewFullAngle < 0.0)
+ fNewFullAngle += 3600.0;
+ while(fNewFullAngle >= 3600.0)
+ fNewFullAngle -= 3600.0;
+
+ // to int and set
+ sal_Int32 nNewAngle = (sal_Int32)(fNewFullAngle + 0.5);
+ if(nNewAngle != rGOld.aGradient.GetAngle())
+ rG.aGradient.SetAngle(nNewAngle);
+ }
+
+ break;
+ }
+ case XGRAD_RADIAL :
+ case XGRAD_SQUARE :
+ {
+ if(!bMoveSingle || (bMoveSingle && !bMoveFirst))
+ {
+ Vector2D aOffset(aEndPos - aRect.TopLeft());
+ sal_Int32 nNewXOffset = (sal_Int32)(((aOffset.X() * 100.0) / (double)aRect.GetWidth()) + 0.5);
+ sal_Int32 nNewYOffset = (sal_Int32)(((aOffset.Y() * 100.0) / (double)aRect.GetHeight()) + 0.5);
+
+ // clip
+ if(nNewXOffset < 0)
+ nNewXOffset = 0;
+ if(nNewXOffset > 100)
+ nNewXOffset = 100;
+
+ if(nNewYOffset < 0)
+ nNewYOffset = 0;
+ if(nNewYOffset > 100)
+ nNewYOffset = 100;
+
+ rG.aGradient.SetXOffset((sal_uInt16)nNewXOffset);
+ rG.aGradient.SetYOffset((sal_uInt16)nNewYOffset);
+
+ aStartPos -= aOffset;
+ aEndPos -= aOffset;
+ }
+
+ if(!bMoveSingle || (bMoveSingle && bMoveFirst))
+ {
+ Vector2D aFullVec(aStartPos - aEndPos);
+ Vector2D aOldVec(aRect.BottomLeft() - aRect.TopLeft());
+ double fFullLen = aFullVec.GetLength();
+ double fOldLen = aOldVec.GetLength();
+ double fNewBorder = (fFullLen * 100.0) / fOldLen;
+ sal_Int32 nNewBorder = 100 - (sal_Int32)(fNewBorder + 0.5);
+
+ // clip
+ if(nNewBorder < 0)
+ nNewBorder = 0;
+ if(nNewBorder > 100)
+ nNewBorder = 100;
+
+ // set
+ if(nNewBorder != rG.aGradient.GetBorder())
+ rG.aGradient.SetBorder((sal_uInt16)nNewBorder);
+
+ // angle is not definitely necessary for these modes, but it makes
+ // controlling more fun for the user
+ aFullVec.Normalize();
+ double fNewFullAngle = atan2(aFullVec.Y(), aFullVec.X());
+ fNewFullAngle /= F_PI180;
+ fNewFullAngle *= -10.0;
+ fNewFullAngle += 900.0;
+
+ // clip
+ while(fNewFullAngle < 0.0)
+ fNewFullAngle += 3600.0;
+ while(fNewFullAngle >= 3600.0)
+ fNewFullAngle -= 3600.0;
+
+ // to int and set
+ sal_Int32 nNewAngle = (sal_Int32)(fNewFullAngle + 0.5);
+ if(nNewAngle != rGOld.aGradient.GetAngle())
+ rG.aGradient.SetAngle(nNewAngle);
+ }
+
+ break;
+ }
+ case XGRAD_ELLIPTICAL :
+ case XGRAD_RECT :
+ {
+ if(!bMoveSingle || (bMoveSingle && !bMoveFirst))
+ {
+ Vector2D aOffset(aEndPos - aRect.TopLeft());
+ sal_Int32 nNewXOffset = (sal_Int32)(((aOffset.X() * 100.0) / (double)aRect.GetWidth()) + 0.5);
+ sal_Int32 nNewYOffset = (sal_Int32)(((aOffset.Y() * 100.0) / (double)aRect.GetHeight()) + 0.5);
+
+ // clip
+ if(nNewXOffset < 0)
+ nNewXOffset = 0;
+ if(nNewXOffset > 100)
+ nNewXOffset = 100;
+
+ if(nNewYOffset < 0)
+ nNewYOffset = 0;
+ if(nNewYOffset > 100)
+ nNewYOffset = 100;
+
+ rG.aGradient.SetXOffset((sal_uInt16)nNewXOffset);
+ rG.aGradient.SetYOffset((sal_uInt16)nNewYOffset);
+
+ aStartPos -= aOffset;
+ aEndPos -= aOffset;
+ }
+
+ if(!bMoveSingle || (bMoveSingle && bMoveFirst))
+ {
+ Vector2D aFullVec(aStartPos - aEndPos);
+ Vector2D aOldVec(Vector2D(aRect.Left(), aCenter.Y()) - aRect.TopLeft());
+ double fFullLen = aFullVec.GetLength();
+ double fOldLen = aOldVec.GetLength();
+ double fNewBorder = (fFullLen * 100.0) / fOldLen;
+ sal_Int32 nNewBorder = 100 - (sal_Int32)(fNewBorder + 0.5);
+
+ // clip
+ if(nNewBorder < 0)
+ nNewBorder = 0;
+ if(nNewBorder > 100)
+ nNewBorder = 100;
+
+ // set
+ if(nNewBorder != rG.aGradient.GetBorder())
+ rG.aGradient.SetBorder((sal_uInt16)nNewBorder);
+
+ // angle is not definitely necessary for these modes, but it makes
+ // controlling more fun for the user
+ aFullVec.Normalize();
+ double fNewFullAngle = atan2(aFullVec.Y(), aFullVec.X());
+ fNewFullAngle /= F_PI180;
+ fNewFullAngle *= -10.0;
+ fNewFullAngle += 900.0;
+
+ // clip
+ while(fNewFullAngle < 0.0)
+ fNewFullAngle += 3600.0;
+ while(fNewFullAngle >= 3600.0)
+ fNewFullAngle -= 3600.0;
+
+ // to int and set
+ sal_Int32 nNewAngle = (sal_Int32)(fNewFullAngle + 0.5);
+ if(nNewAngle != rGOld.aGradient.GetAngle())
+ rG.aGradient.SetAngle(nNewAngle);
+ }
+
+ break;
+ }
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/*
void GradTransformer::CreateRotatedBoundRect(double fDegree)
{
// create back-rotated BoundRect to get the vector length
@@ -172,22 +588,22 @@ void GradTransformer::GradToVec(GradTransGradient& rG, GradTransVector& rV, cons
break;
}
case XGRAD_RADIAL :
+ case XGRAD_SQUARE :
{
// from bottom to center
- aStartPos = Vector2D(aCenter.X(), aBoundRect.Bottom());
- aEndPos = Vector2D(aCenter);
- aCenterPos = Vector2D(aCenter);
+ aStartPos = Vector2D(aBoundRect.BottomLeft());
+ aEndPos = Vector2D(aBoundRect.TopLeft());
+ aCenterPos = aEndPos;
bDoCorrectOffset = TRUE;
break;
}
case XGRAD_ELLIPTICAL :
- case XGRAD_SQUARE :
case XGRAD_RECT :
{
// from bottom to center
- aStartPos = Vector2D(aCenter.X(), aBoundRect.Bottom());
- aEndPos = Vector2D(aCenter);
- aCenterPos = Vector2D(aCenter);
+ aStartPos = Vector2D(aBoundRect.Left(), aBoundRect.Center().Y());
+ aEndPos = Vector2D(aBoundRect.TopLeft());
+ aCenterPos = aEndPos;
bDoCorrectOffset = TRUE;
break;
}
@@ -216,7 +632,7 @@ void GradTransformer::GradToVec(GradTransGradient& rG, GradTransVector& rV, cons
// take offset in account
if(bDoCorrectOffset)
{
- if(rG.aGradient.GetXOffset() != 50 || rG.aGradient.GetYOffset() != 50)
+ if(rG.aGradient.GetXOffset() || rG.aGradient.GetYOffset())
{
// get scaling factors (with and without gradient rotation),
// center is the same
@@ -247,11 +663,11 @@ void GradTransformer::GradToVec(GradTransGradient& rG, GradTransVector& rV, cons
Vector2D aCorrectionVector(0,0);
- if(rG.aGradient.GetXOffset() != 50)
- aCorrectionVector += aXAxis * (((double)rG.aGradient.GetXOffset() - 50.0) / 100.0);
+ if(rG.aGradient.GetXOffset())
+ aCorrectionVector += aXAxis * (((double)rG.aGradient.GetXOffset()) / 100.0);
- if(rG.aGradient.GetYOffset() != 50)
- aCorrectionVector += aYAxis * (((double)rG.aGradient.GetYOffset() - 50.0) / 100.0);
+ if(rG.aGradient.GetYOffset())
+ aCorrectionVector += aYAxis * (((double)rG.aGradient.GetYOffset()) / 100.0);
aStartPos += aCorrectionVector;
aEndPos += aCorrectionVector;
@@ -333,13 +749,13 @@ void GradTransformer::VecToGrad(GradTransVector& rV, GradTransGradient& rG, Grad
break;
}
case XGRAD_RADIAL :
+ case XGRAD_SQUARE :
{
bBorderMoveCheck = bMoveSingle && bMoveFirst;
bCenterMoveCheck = (bMoveSingle && !bMoveFirst) || !bMoveSingle;
break;
}
case XGRAD_ELLIPTICAL :
- case XGRAD_SQUARE :
case XGRAD_RECT :
{
bRotAngleCheck = bMoveSingle && bMoveFirst;
@@ -354,6 +770,7 @@ void GradTransformer::VecToGrad(GradTransVector& rV, GradTransGradient& rG, Grad
if(bRotAngleCheck)
{
Vector2D aNewFullVec(aEndPos - aStartPos);
+ aNewFullVec.Normalize();
if(bRotAngleInvert)
aNewFullVec = -aNewFullVec;
@@ -469,3 +886,4 @@ void GradTransformer::VecToGrad(GradTransVector& rV, GradTransGradient& rG, Grad
}
}
+*/
diff --git a/svx/source/svdraw/gradtrns.hxx b/svx/source/svdraw/gradtrns.hxx
index 7f7c38df8219..a3c21b9be03c 100644
--- a/svx/source/svdraw/gradtrns.hxx
+++ b/svx/source/svdraw/gradtrns.hxx
@@ -2,9 +2,9 @@
*
* $RCSfile: gradtrns.hxx,v $
*
- * $Revision: 1.1.1.1 $
+ * $Revision: 1.2 $
*
- * last change: $Author: hr $ $Date: 2000-09-18 17:01:24 $
+ * last change: $Author: aw $ $Date: 2001-01-16 13:48:17 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -91,26 +91,13 @@ public:
class GradTransformer
{
- // private members to hold necessary data
- Rectangle aBoundRect;
- Point aCenter;
- double fGradientAngle;
- double fObjectAngle;
- Vector2D aStartPos;
- Vector2D aEndPos;
- Vector2D aCenterPos;
- unsigned bInnerOuterChanged : 1;
- unsigned bDoCorrectOffset : 1;
- unsigned bDoCorrectRotation : 1;
-
- // private helping functions
- void CreateRotatedBoundRect(double fRotVec);
-
public:
GradTransformer() {}
- void GradToVec(GradTransGradient& rG, GradTransVector& rV, const SdrObject* pObj);
- void VecToGrad(GradTransVector& rV, GradTransGradient& rG, GradTransGradient& rGOld, const SdrObject* pObj, BOOL bMoveSingle, BOOL bMoveFirst);
+ void GradToVec(GradTransGradient& rG, GradTransVector& rV,
+ const SdrObject* pObj);
+ void VecToGrad(GradTransVector& rV, GradTransGradient& rG,
+ GradTransGradient& rGOld, const SdrObject* pObj, BOOL bMoveSingle, BOOL bMoveFirst);
};
#endif _GRADTRANS_HXX