diff options
author | Armin Weiss <aw@openoffice.org> | 2001-01-16 12:48:17 +0000 |
---|---|---|
committer | Armin Weiss <aw@openoffice.org> | 2001-01-16 12:48:17 +0000 |
commit | 3d7dcb2b30d325472607336c241b0ebe6a7b2e84 (patch) | |
tree | 2fa663ffef76de03095cdb7f74b8630c0960f50d /svx/source/svdraw | |
parent | ee7bab937a8406f752ce94dafd875d0f1fc8ec5f (diff) |
#79946# changed bijective transformations, reimplementation
Diffstat (limited to 'svx/source/svdraw')
-rw-r--r-- | svx/source/svdraw/gradtrns.cxx | 448 | ||||
-rw-r--r-- | svx/source/svdraw/gradtrns.hxx | 25 |
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 |