diff options
author | Vladimir Glazounov <vg@openoffice.org> | 2009-01-20 09:49:16 +0000 |
---|---|---|
committer | Vladimir Glazounov <vg@openoffice.org> | 2009-01-20 09:49:16 +0000 |
commit | b1b522a6427184602d69436953cbc37669d4e474 (patch) | |
tree | 5409f420f5601298d5001a02dcf2d23a85e74ab7 /drawinglayer | |
parent | 4dae8244c21a1dd53c5c42d6a0b4751c285f8497 (diff) |
CWS-TOOLING: integrate CWS aw061
2009-01-13 19:18:08 +0100 aw r266250 : #i96669# changed initialisation order in Embedded3DPrimitive2D::Embedded3DPrimitive2D due to TinderBox
2009-01-13 19:15:37 +0100 aw r266249 : #i96669# changed initialisation order in Embedded3DPrimitive2D::Embedded3DPrimitive2D due to TinderBox
2009-01-12 11:53:37 +0100 aw r266141 : #i97874# corrected include for TinderBox build
2009-01-08 17:48:23 +0100 aw r266029 : #i97874# extended SdrTextObj::ImpConvertAddText to copy needed attributes from original object
2009-01-08 14:59:08 +0100 aw r266015 : #i96350# added fallback to solid fill in shadow TabPage when no fill is defined to get a reasonable shadow preview
2009-01-08 12:40:49 +0100 aw r265995 : #i94832# remuved not needed E3DModifySceneSnapRectUpdater usages
2009-01-08 01:53:46 +0100 thb r265982 : #i94860# Blacklisting another ATI card/driver that causes blank screens
2009-01-08 01:46:38 +0100 thb r265981 : #i97853# Changed all gradient texture methods to use basegfx gradienttools. consolidated quite some code
2009-01-08 01:45:09 +0100 thb r265980 : #i97853# Added lerp methods, slight changes to have everything necessary contained in the ODFGradientInfo struct
2009-01-08 00:01:54 +0100 thb r265979 : #i97853# First part of the move - duplicated the stuff to basegfx
2009-01-06 16:23:09 +0100 aw r265930 : #i97197# Changed SwDrawVirtObj to work well with changed aOutRect and bBoundRectValid functionality
2009-01-06 12:41:24 +0100 aw r265909 : #i97784# corrected regression with connectors
2009-01-05 17:30:31 +0100 aw r265881 : #i97772# added missing usage of reduce factor for BitmapPrimitive creation
2009-01-05 12:24:01 +0100 aw r265863 : #i97321# added direct handling of HatchTexturePrimitive3D to not use it's decomposition for HitTest
2008-12-23 13:57:27 +0100 aw r265782 : #i96669# changed SW's FlyFrame paint fallback with primitives to use createLocalDecomposition since get2Decomposition does not have to stay virtual on the long run
2008-12-23 13:47:59 +0100 aw r265781 : #i96669# optimized impCreateTextPortionPrimitive to only create TextDecoratedPortionPrimitive2D when needed
2008-12-23 13:44:45 +0100 aw r265780 : #i96669# added B2DRange buffering to some primitive implementations where it is most necessary
2008-12-19 15:45:45 +0100 aw r265729 : #i96669# prepared TextPrimitives to work without DXarray, too. Had to rework impSplitSingleWords which gets active when a text portion has some word-wise decorations. Tested before committing
2008-12-19 15:44:16 +0100 aw r265728 : #i96669# corrected error in createPolygonFromUnitEllipseSegment which popped up when investigating
2008-12-18 17:45:58 +0100 aw r265708 : #i97149# added ActionChanged() call when visualisation object is modified
2008-12-18 15:34:42 +0100 aw r265695 : #i96598# corrected SdrPageObj's usage of aOutRect
2008-12-17 16:59:37 +0100 aw r265647 : #i96537# exchanged the marker for point number in string with correct one
2008-12-16 17:50:33 +0100 aw r265566 : #i93170# added a bool to EndDrawLayer() and corresponding mechanisms to allow to end without drawing FormLayer
2008-12-16 17:50:17 +0100 aw r265565 : #i93170# added a bool to EndDrawLayer() and corresponding mechanisms to allow to end without drawing FormLayer
2008-12-16 17:50:00 +0100 aw r265564 : #i93170# added a bool to EndDrawLayer() and corresponding mechanisms to allow to end without drawing FormLayer
2008-12-16 17:49:48 +0100 aw r265563 : #i93170# added a bool to EndDrawLayer() and corresponding mechanisms to allow to end without drawing FormLayer
2008-12-16 17:49:35 +0100 aw r265562 : #i93170# added a bool to EndDrawLayer() and corresponding mechanisms to allow to end without drawing FormLayer
Diffstat (limited to 'drawinglayer')
11 files changed, 231 insertions, 509 deletions
diff --git a/drawinglayer/inc/drawinglayer/primitive2d/embedded3dprimitive2d.hxx b/drawinglayer/inc/drawinglayer/primitive2d/embedded3dprimitive2d.hxx index f0e7d92368..8177e60305 100644 --- a/drawinglayer/inc/drawinglayer/primitive2d/embedded3dprimitive2d.hxx +++ b/drawinglayer/inc/drawinglayer/primitive2d/embedded3dprimitive2d.hxx @@ -72,6 +72,9 @@ namespace drawinglayer // the primitiveSequence for on-demand created shadow primitives (see mbShadow3DChecked) Primitive2DSequence maShadowPrimitives; + // #i96669# add simple range buffering for this primitive + basegfx::B2DRange maB2DRange; + // bitfield // flag if given 3D geometry is already cheched for shadow definitions and 2d shadows // are created in maShadowPrimitives diff --git a/drawinglayer/inc/drawinglayer/primitive2d/pointarrayprimitive2d.hxx b/drawinglayer/inc/drawinglayer/primitive2d/pointarrayprimitive2d.hxx index 45d89e8b81..f04db4db5f 100644 --- a/drawinglayer/inc/drawinglayer/primitive2d/pointarrayprimitive2d.hxx +++ b/drawinglayer/inc/drawinglayer/primitive2d/pointarrayprimitive2d.hxx @@ -52,6 +52,9 @@ namespace drawinglayer std::vector< basegfx::B2DPoint > maPositions; basegfx::BColor maRGBColor; + // #i96669# add simple range buffering for this primitive + basegfx::B2DRange maB2DRange; + public: PointArrayPrimitive2D( const std::vector< basegfx::B2DPoint >& rPositions, diff --git a/drawinglayer/inc/drawinglayer/primitive2d/textprimitive2d.hxx b/drawinglayer/inc/drawinglayer/primitive2d/textprimitive2d.hxx index 001ad26472..e780fef962 100644 --- a/drawinglayer/inc/drawinglayer/primitive2d/textprimitive2d.hxx +++ b/drawinglayer/inc/drawinglayer/primitive2d/textprimitive2d.hxx @@ -135,6 +135,9 @@ namespace drawinglayer ::com::sun::star::lang::Locale maLocale; // the Locale for the text basegfx::BColor maFontColor; // font color + // #i96669# add simple range buffering for this primitive + basegfx::B2DRange maB2DRange; + protected: // local decomposition. virtual Primitive2DSequence createLocalDecomposition(const geometry::ViewInformation2D& rViewInformation) const; diff --git a/drawinglayer/inc/drawinglayer/texture/texture.hxx b/drawinglayer/inc/drawinglayer/texture/texture.hxx index ecf3bb9fe0..26cc190494 100644 --- a/drawinglayer/inc/drawinglayer/texture/texture.hxx +++ b/drawinglayer/inc/drawinglayer/texture/texture.hxx @@ -39,6 +39,7 @@ #include <basegfx/matrix/b2dhommatrix.hxx> #include <basegfx/range/b2drange.hxx> #include <basegfx/color/bcolor.hxx> +#include <basegfx/tools/gradienttools.hxx> #include <vector> ////////////////////////////////////////////////////////////////////////////// @@ -73,13 +74,10 @@ namespace drawinglayer class GeoTexSvxGradient : public GeoTexSvx { protected: - basegfx::B2DHomMatrix maTextureTransform; - basegfx::B2DHomMatrix maBackTextureTransform; + basegfx::ODFGradientInfo maGradientInfo; basegfx::B2DRange maTargetRange; basegfx::BColor maStart; basegfx::BColor maEnd; - sal_uInt32 mnSteps; - double mfAspect; double mfBorder; // helpers @@ -130,9 +128,6 @@ namespace drawinglayer { class GeoTexSvxGradientAxial : public GeoTexSvxGradient { - protected: - double mfInternalSteps; - public: GeoTexSvxGradientAxial(const basegfx::B2DRange& rTargetRange, const basegfx::BColor& rStart, const basegfx::BColor& rEnd, sal_uInt32 nSteps, double fBorder, double fAngle); virtual ~GeoTexSvxGradientAxial(); diff --git a/drawinglayer/source/primitive2d/embedded3dprimitive2d.cxx b/drawinglayer/source/primitive2d/embedded3dprimitive2d.cxx index 4d45df7241..54c71a1196 100644 --- a/drawinglayer/source/primitive2d/embedded3dprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/embedded3dprimitive2d.cxx @@ -110,6 +110,7 @@ namespace drawinglayer mfShadowSlant(fShadowSlant), maScene3DRange(rScene3DRange), maShadowPrimitives(), + maB2DRange(), mbShadow3DChecked(false) { maLightNormal.normalize(); @@ -134,29 +135,35 @@ namespace drawinglayer basegfx::B2DRange Embedded3DPrimitive2D::getB2DRange(const geometry::ViewInformation2D& rViewInformation) const { - // use the 3d transformation stack to create a projection of the 3D range - basegfx::B3DRange a3DRange(primitive3d::getB3DRangeFromPrimitive3DSequence(getChildren3D(), getViewInformation3D())); - a3DRange.transform(getViewInformation3D().getObjectToView()); - - // create 2d range from projected 3d and transform with scene's object transformation - basegfx::B2DRange aRetval; - aRetval.expand(basegfx::B2DPoint(a3DRange.getMinX(), a3DRange.getMinY())); - aRetval.expand(basegfx::B2DPoint(a3DRange.getMaxX(), a3DRange.getMaxY())); - aRetval.transform(getObjectTransformation()); - - // cehck for 3D shadows and their 2D projections. If those exist, they need to be - // taken into account - if(impGetShadow3D(rViewInformation)) + if(maB2DRange.isEmpty()) { - const basegfx::B2DRange aShadow2DRange(getB2DRangeFromPrimitive2DSequence(maShadowPrimitives, rViewInformation)); - - if(!aShadow2DRange.isEmpty()) + // use the 3d transformation stack to create a projection of the 3D range + basegfx::B3DRange a3DRange(primitive3d::getB3DRangeFromPrimitive3DSequence(getChildren3D(), getViewInformation3D())); + a3DRange.transform(getViewInformation3D().getObjectToView()); + + // create 2d range from projected 3d and transform with scene's object transformation + basegfx::B2DRange aNewRange; + aNewRange.expand(basegfx::B2DPoint(a3DRange.getMinX(), a3DRange.getMinY())); + aNewRange.expand(basegfx::B2DPoint(a3DRange.getMaxX(), a3DRange.getMaxY())); + aNewRange.transform(getObjectTransformation()); + + // cehck for 3D shadows and their 2D projections. If those exist, they need to be + // taken into account + if(impGetShadow3D(rViewInformation)) { - aRetval.expand(aShadow2DRange); + const basegfx::B2DRange aShadow2DRange(getB2DRangeFromPrimitive2DSequence(maShadowPrimitives, rViewInformation)); + + if(!aShadow2DRange.isEmpty()) + { + aNewRange.expand(aShadow2DRange); + } } + + // assign to buffered value + const_cast< Embedded3DPrimitive2D* >(this)->maB2DRange = aNewRange; } - return aRetval; + return maB2DRange; } // provide unique ID diff --git a/drawinglayer/source/primitive2d/pointarrayprimitive2d.cxx b/drawinglayer/source/primitive2d/pointarrayprimitive2d.cxx index eb3b8054e6..4ab437b60e 100644 --- a/drawinglayer/source/primitive2d/pointarrayprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/pointarrayprimitive2d.cxx @@ -54,7 +54,8 @@ namespace drawinglayer const basegfx::BColor& rRGBColor) : BasePrimitive2D(), maPositions(rPositions), - maRGBColor(rRGBColor) + maRGBColor(rRGBColor), + maB2DRange() { } @@ -73,15 +74,21 @@ namespace drawinglayer basegfx::B2DRange PointArrayPrimitive2D::getB2DRange(const geometry::ViewInformation2D& /*rViewInformation*/) const { - basegfx::B2DRange aRetval; - - // get the basic range from the position vector - for(std::vector< basegfx::B2DPoint >::const_iterator aIter(getPositions().begin()); aIter != getPositions().end(); aIter++) + if(maB2DRange.isEmpty()) { - aRetval.expand(*aIter); + basegfx::B2DRange aNewRange; + + // get the basic range from the position vector + for(std::vector< basegfx::B2DPoint >::const_iterator aIter(getPositions().begin()); aIter != getPositions().end(); aIter++) + { + aNewRange.expand(*aIter); + } + + // assign to buffered value + const_cast< PointArrayPrimitive2D* >(this)->maB2DRange = aNewRange; } - return aRetval; + return maB2DRange; } // provide unique ID diff --git a/drawinglayer/source/primitive2d/sceneprimitive2d.cxx b/drawinglayer/source/primitive2d/sceneprimitive2d.cxx index c9571f6478..bf5e5cf390 100644 --- a/drawinglayer/source/primitive2d/sceneprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/sceneprimitive2d.cxx @@ -229,11 +229,13 @@ namespace drawinglayer if(aBitmapSizePixel.getWidth() && aBitmapSizePixel.getHeight()) { - // create transform for the created bitmap in discrete coordinates first + // create transform for the created bitmap in discrete coordinates first. + // #i97772# Do not forget to apply evtl. render size reduction to scaling basegfx::B2DHomMatrix aNew2DTransform; + const double fSizeReductionFactor(1.0 / fReduceFactor); - aNew2DTransform.set(0, 0, (double)(aBitmapSizePixel.getWidth() - 1)); - aNew2DTransform.set(1, 1, (double)(aBitmapSizePixel.getHeight() - 1)); + aNew2DTransform.set(0, 0, (double)(aBitmapSizePixel.getWidth() - 1) * fSizeReductionFactor); + aNew2DTransform.set(1, 1, (double)(aBitmapSizePixel.getHeight() - 1) * fSizeReductionFactor); aNew2DTransform.set(0, 2, aVisibleDiscreteRange.getMinX()); aNew2DTransform.set(1, 2, aVisibleDiscreteRange.getMinY()); diff --git a/drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx b/drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx index 367976df07..7349a0f428 100644 --- a/drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx @@ -503,6 +503,16 @@ namespace drawinglayer } else { + // prepare TextLayouter + const bool bNoDXArray(getDXArray().empty()); + TextLayouterDevice aTextLayouter; + + if(bNoDXArray) + { + // ..but only completely when no DXArray + aTextLayouter.setFontAttributes(getFontAttributes(), rDecTrans.getScale().getX(), rDecTrans.getScale().getY()); + } + // do iterate over single words while(aNextWordBoundary.startPos != aNextWordBoundary.endPos) { @@ -512,17 +522,18 @@ namespace drawinglayer // prepare transform for the single word basegfx::B2DHomMatrix aNewTransform; - double fDistance(0.0); + ::std::vector< double > aNewDXArray; const bool bNewStartIsNotOldStart(nNewTextStart > getTextPosition()); - if(bNewStartIsNotOldStart) + if(!bNoDXArray) { - // needs to be moved to a new start position (get from DXArray) - const sal_uInt32 nIndex(static_cast< sal_uInt32 >(nNewTextStart - getTextPosition())); - fDistance = getDXArray()[nIndex - 1]; - aNewTransform.translate(fDistance, 0.0); + // prepare new DXArray for the single word + aNewDXArray = ::std::vector< double >( + getDXArray().begin() + static_cast< sal_uInt32 >(nNewTextStart - getTextPosition()), + getDXArray().begin() + static_cast< sal_uInt32 >(nNewTextEnd - getTextPosition())); } +<<<<<<< .working aNewTransform *= rDecTrans.getB2DHomMatrix(); // prepare new DXArray for the single word @@ -530,26 +541,64 @@ namespace drawinglayer getDXArray().begin() + static_cast< sal_uInt32 >(nNewTextStart - getTextPosition()), getDXArray().begin() + static_cast< sal_uInt32 >(nNewTextEnd - getTextPosition())); +======= +>>>>>>> .merge-right.r266521 if(bNewStartIsNotOldStart) { - // DXArray values need to be corrected - const sal_uInt32 nArraySize(aNewDXArray.size()); + // needs to be moved to a new start position + double fOffset(0.0); + + if(bNoDXArray) + { + // evaluate using TextLayouter + fOffset = aTextLayouter.getTextWidth(getText(), getTextPosition(), nNewTextStart); + } + else + { + // get from DXArray + const sal_uInt32 nIndex(static_cast< sal_uInt32 >(nNewTextStart - getTextPosition())); + fOffset = getDXArray()[nIndex - 1]; + } - for(sal_uInt32 a(0); a < nArraySize; a++) + // apply needed offset to transformation + aNewTransform.translate(fOffset, 0.0); + + if(!bNoDXArray) { - aNewDXArray[a] -= fDistance; + // DXArray values need to be corrected with the offset, too + const sal_uInt32 nArraySize(aNewDXArray.size()); + + for(sal_uInt32 a(0); a < nArraySize; a++) + { + aNewDXArray[a] -= fOffset; + } } } +<<<<<<< .working // create geometry content for the single word +======= + + // add text transformation to new transformation + aNewTransform *= rDecTrans.getB2DHomMatrix(); + + // create geometry content for the single word. Do not forget + // to use the new transformation +>>>>>>> .merge-right.r266521 basegfx::DecomposedB2DHomMatrixContainer aDecTrans(aNewTransform); +<<<<<<< .working impCreateGeometryContent(rTarget, aDecTrans, getText(), nNewTextStart, +======= + + impCreateGeometryContent(rTarget, aDecTrans, getText(), nNewTextStart, +>>>>>>> .merge-right.r266521 nNewTextEnd - nNewTextStart, aNewDXArray, aNewFontAttributes); // prepare next word and truncate to possibilities aNextWordBoundary = xLocalBreakIterator->nextWord( getText(), aNextWordBoundary.endPos, getLocale(), ::com::sun::star::i18n::WordType::ANYWORD_IGNOREWHITESPACES); + impCorrectTextBoundary(aNextWordBoundary); } } diff --git a/drawinglayer/source/primitive2d/textprimitive2d.cxx b/drawinglayer/source/primitive2d/textprimitive2d.cxx index 0c2341ce69..79c71a734b 100644 --- a/drawinglayer/source/primitive2d/textprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/textprimitive2d.cxx @@ -241,7 +241,8 @@ namespace drawinglayer maDXArray(rDXArray), maFontAttributes(rFontAttributes), maLocale(rLocale), - maFontColor(rFontColor) + maFontColor(rFontColor), + maB2DRange() { #ifdef DBG_UTIL const xub_StrLen aStringLength(getText().Len()); @@ -278,9 +279,7 @@ namespace drawinglayer basegfx::B2DRange TextSimplePortionPrimitive2D::getB2DRange(const geometry::ViewInformation2D& /*rViewInformation*/) const { - basegfx::B2DRange aRetval; - - if(getTextLength()) + if(maB2DRange.isEmpty() && getTextLength()) { // get TextBoundRect as base size // decompose object transformation to single values @@ -304,7 +303,7 @@ namespace drawinglayer aTextLayouter.setFontAttributes(getFontAttributes(), aFontScale.getX(), aFontScale.getY()); // get basic text range - aRetval = aTextLayouter.getTextBoundRect(getText(), getTextPosition(), getTextLength()); + basegfx::B2DRange aNewRange(aTextLayouter.getTextBoundRect(getText(), getTextPosition(), getTextLength())); #ifdef WIN32 // when under Windows and the font is unequally scaled, need to correct font X-Scaling factor if(bCorrectScale) @@ -321,11 +320,14 @@ namespace drawinglayer aRangeTransformation.translate(aTranslate.getX(), aTranslate.getY()); // apply range transformation to it - aRetval.transform(aRangeTransformation); + aNewRange.transform(aRangeTransformation); + + // assign to buffered value + const_cast< TextSimplePortionPrimitive2D* >(this)->maB2DRange = aNewRange; } } - return aRetval; + return maB2DRange; } // provide unique ID diff --git a/drawinglayer/source/processor2d/vclprocessor2d.cxx b/drawinglayer/source/processor2d/vclprocessor2d.cxx index 99765b4920..3d45998672 100644 --- a/drawinglayer/source/processor2d/vclprocessor2d.cxx +++ b/drawinglayer/source/processor2d/vclprocessor2d.cxx @@ -282,12 +282,23 @@ namespace drawinglayer mpOutputDevice->SetFont(aFont); mpOutputDevice->SetTextColor(Color(aRGBFontColor)); - mpOutputDevice->DrawTextArray( - aStartPoint, - rTextCandidate.getText(), - aTransformedDXArray.size() ? &(aTransformedDXArray[0]) : NULL, - rTextCandidate.getTextPosition(), - rTextCandidate.getTextLength()); + if(aTransformedDXArray.size()) + { + mpOutputDevice->DrawTextArray( + aStartPoint, + rTextCandidate.getText(), + &(aTransformedDXArray[0]), + rTextCandidate.getTextPosition(), + rTextCandidate.getTextLength()); + } + else + { + mpOutputDevice->DrawText( + aStartPoint, + rTextCandidate.getText(), + rTextCandidate.getTextPosition(), + rTextCandidate.getTextLength()); + } if(rTextCandidate.getFontAttributes().getRTL()) { diff --git a/drawinglayer/source/texture/texture.cxx b/drawinglayer/source/texture/texture.cxx index 6d547ba27d..964099b691 100644 --- a/drawinglayer/source/texture/texture.cxx +++ b/drawinglayer/source/texture/texture.cxx @@ -38,6 +38,7 @@ #include <drawinglayer/texture/texture.hxx> #include <basegfx/numeric/ftools.hxx> +#include <basegfx/tools/gradienttools.hxx> ////////////////////////////////////////////////////////////////////////////// @@ -95,18 +96,18 @@ namespace drawinglayer aNew.set(1, 1, rRange.getHeight()); aNew.set(0, 2, rRange.getMinX()); aNew.set(1, 2, rRange.getMinY()); - rMatrices.push_back(maTextureTransform * aNew); + rMatrices.push_back(maGradientInfo.maTextureTransform * aNew); } void GeoTexSvxGradient::impAppendColorsRadial(::std::vector< basegfx::BColor >& rColors) { - if(mnSteps) + if(maGradientInfo.mnSteps) { rColors.push_back(maStart); - for(sal_uInt32 a(1L); a < mnSteps - 1L; a++) + for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps - 1L; a++) { - rColors.push_back(interpolate(maStart, maEnd, (double)a / (double)mnSteps)); + rColors.push_back(interpolate(maStart, maEnd, (double)a / (double)maGradientInfo.mnSteps)); } rColors.push_back(maEnd); @@ -117,10 +118,10 @@ namespace drawinglayer : maTargetRange(rTargetRange), maStart(rStart), maEnd(rEnd), - mnSteps(nSteps), - mfAspect(1.0), mfBorder(fBorder) { + maGradientInfo.mnSteps = nSteps; + maGradientInfo.mfAspectRatio = 1.0; } GeoTexSvxGradient::~GeoTexSvxGradient() @@ -131,10 +132,10 @@ namespace drawinglayer { const GeoTexSvxGradient* pCompare = dynamic_cast< const GeoTexSvxGradient* >(&rGeoTexSvx); return (pCompare - && maTextureTransform == pCompare->maTextureTransform + && maGradientInfo.maTextureTransform == pCompare->maGradientInfo.maTextureTransform && maTargetRange == pCompare->maTargetRange - && mnSteps == pCompare->mnSteps - && mfAspect == pCompare->mfAspect + && maGradientInfo.mnSteps == pCompare->maGradientInfo.mnSteps + && maGradientInfo.mfAspectRatio == pCompare->maGradientInfo.mfAspectRatio && mfBorder == pCompare->mfBorder); } } // end of namespace texture @@ -149,54 +150,11 @@ namespace drawinglayer GeoTexSvxGradientLinear::GeoTexSvxGradientLinear(const basegfx::B2DRange& rTargetRange, const basegfx::BColor& rStart, const basegfx::BColor& rEnd, sal_uInt32 nSteps, double fBorder, double fAngle) : GeoTexSvxGradient(rTargetRange, rStart, rEnd, nSteps, fBorder) { - double fTargetSizeX(maTargetRange.getWidth()); - double fTargetSizeY(maTargetRange.getHeight()); - double fTargetOffsetX(maTargetRange.getMinX()); - double fTargetOffsetY(maTargetRange.getMinY()); - - // add object expansion - if(0.0 != fAngle) - { - const double fAbsCos(fabs(cos(fAngle))); - const double fAbsSin(fabs(sin(fAngle))); - const double fNewX(fTargetSizeX * fAbsCos + fTargetSizeY * fAbsSin); - const double fNewY(fTargetSizeY * fAbsCos + fTargetSizeX * fAbsSin); - fTargetOffsetX -= (fNewX - fTargetSizeX) / 2.0; - fTargetOffsetY -= (fNewY - fTargetSizeY) / 2.0; - fTargetSizeX = fNewX; - fTargetSizeY = fNewY; - } - - // add object scale before rotate - maTextureTransform.scale(fTargetSizeX, fTargetSizeY); - - // add texture rotate after scale to keep perpendicular angles - if(0.0 != fAngle) - { - basegfx::B2DPoint aCenter(0.5, 0.5); - aCenter *= maTextureTransform; - - maTextureTransform.translate(-aCenter.getX(), -aCenter.getY()); - maTextureTransform.rotate(fAngle); - maTextureTransform.translate(aCenter.getX(), aCenter.getY()); - } - - // add object translate - maTextureTransform.translate(fTargetOffsetX, fTargetOffsetY); - - // prepare aspect for texture - mfAspect = (0.0 != fTargetSizeY) ? fTargetSizeX / fTargetSizeY : 1.0; - - // build transform from u,v to [0.0 .. 1.0]. As base, use inverse texture transform - maBackTextureTransform = maTextureTransform; - maBackTextureTransform.invert(); - maBackTextureTransform.translate(0.0, -mfBorder); - const double fSizeWithoutBorder(1.0 - mfBorder); - - if(!basegfx::fTools::equal(fSizeWithoutBorder, 0.0)) - { - maBackTextureTransform.scale(1.0, 1.0 / fSizeWithoutBorder); - } + basegfx::tools::createLinearODFGradientInfo(maGradientInfo, + rTargetRange, + nSteps, + fBorder, + fAngle); } GeoTexSvxGradientLinear::~GeoTexSvxGradientLinear() @@ -205,12 +163,12 @@ namespace drawinglayer void GeoTexSvxGradientLinear::appendTransformations(::std::vector< basegfx::B2DHomMatrix >& rMatrices) { - if(mnSteps) + if(maGradientInfo.mnSteps) { const double fTop(mfBorder); - const double fStripeWidth((1.0 - fTop) / mnSteps); + const double fStripeWidth((1.0 - fTop) / maGradientInfo.mnSteps); - for(sal_uInt32 a(1L); a < mnSteps; a++) + for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++) { const double fOffsetUpper(fStripeWidth * (double)a); @@ -223,39 +181,20 @@ namespace drawinglayer void GeoTexSvxGradientLinear::appendColors(::std::vector< basegfx::BColor >& rColors) { - if(mnSteps) + if(maGradientInfo.mnSteps) { rColors.push_back(maStart); - for(sal_uInt32 a(1L); a < mnSteps; a++) + for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++) { - rColors.push_back(interpolate(maStart, maEnd, (double)a / (double)(mnSteps + 1L))); + rColors.push_back(interpolate(maStart, maEnd, (double)a / (double)(maGradientInfo.mnSteps + 1L))); } } } void GeoTexSvxGradientLinear::modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& /*rfOpacity*/) const { - const basegfx::B2DPoint aCoor(maBackTextureTransform * rUV); - - if(basegfx::fTools::lessOrEqual(aCoor.getY(), 0.0)) - { - rBColor = maStart; - return; - } - - if(basegfx::fTools::moreOrEqual(aCoor.getY(), 1.0)) - { - rBColor = maEnd; - return; - } - - double fScaler(aCoor.getY()); - - if(mnSteps > 2L && mnSteps < 128L) - { - fScaler = floor(fScaler * (double)mnSteps) / (double)(mnSteps + 1L); - } + const double fScaler(basegfx::tools::getLinearGradientAlpha(rUV, maGradientInfo)); rBColor = (maStart * (1.0 - fScaler)) + (maEnd * fScaler); } @@ -271,57 +210,11 @@ namespace drawinglayer GeoTexSvxGradientAxial::GeoTexSvxGradientAxial(const basegfx::B2DRange& rTargetRange, const basegfx::BColor& rStart, const basegfx::BColor& rEnd, sal_uInt32 nSteps, double fBorder, double fAngle) : GeoTexSvxGradient(rTargetRange, rStart, rEnd, nSteps, fBorder) { - double fTargetSizeX(maTargetRange.getWidth()); - double fTargetSizeY(maTargetRange.getHeight()); - double fTargetOffsetX(maTargetRange.getMinX()); - double fTargetOffsetY(maTargetRange.getMinY()); - - // add object expansion - if(0.0 != fAngle) - { - const double fAbsCos(fabs(cos(fAngle))); - const double fAbsSin(fabs(sin(fAngle))); - const double fNewX(fTargetSizeX * fAbsCos + fTargetSizeY * fAbsSin); - const double fNewY(fTargetSizeY * fAbsCos + fTargetSizeX * fAbsSin); - fTargetOffsetX -= (fNewX - fTargetSizeX) / 2.0; - fTargetOffsetY -= (fNewY - fTargetSizeY) / 2.0; - fTargetSizeX = fNewX; - fTargetSizeY = fNewY; - } - - // add object scale before rotate - maTextureTransform.scale(fTargetSizeX, fTargetSizeY); - - // add texture rotate after scale to keep perpendicular angles - if(0.0 != fAngle) - { - basegfx::B2DPoint aCenter(0.5, 0.5); - aCenter *= maTextureTransform; - - maTextureTransform.translate(-aCenter.getX(), -aCenter.getY()); - maTextureTransform.rotate(fAngle); - maTextureTransform.translate(aCenter.getX(), aCenter.getY()); - } - - // add object translate - maTextureTransform.translate(fTargetOffsetX, fTargetOffsetY); - - // prepare aspect for texture - mfAspect = (0.0 != fTargetSizeY) ? fTargetSizeX / fTargetSizeY : 1.0; - - // build transform from u,v to [0.0 .. 1.0]. As base, use inverse texture transform - maBackTextureTransform = maTextureTransform; - maBackTextureTransform.invert(); - maBackTextureTransform.translate(0.0, -0.5); - const double fSizeWithoutBorder((1.0 - mfBorder) * 0.5); - - if(!basegfx::fTools::equal(fSizeWithoutBorder, 0.0)) - { - maBackTextureTransform.scale(1.0, 1.0 / fSizeWithoutBorder); - } - - // fill internal steps for getBColor implementation - mfInternalSteps = (double)((mnSteps * 2L) - 1L); + basegfx::tools::createAxialODFGradientInfo(maGradientInfo, + rTargetRange, + nSteps, + fBorder, + fAngle); } GeoTexSvxGradientAxial::~GeoTexSvxGradientAxial() @@ -330,14 +223,14 @@ namespace drawinglayer void GeoTexSvxGradientAxial::appendTransformations(::std::vector< basegfx::B2DHomMatrix >& rMatrices) { - if(mnSteps) + if(maGradientInfo.mnSteps) { const double fHalfBorder(mfBorder * 0.5); double fTop(fHalfBorder); double fBottom(1.0 - fHalfBorder); - const double fStripeWidth((fBottom - fTop) / ((mnSteps * 2L) - 1L)); + const double fStripeWidth((fBottom - fTop) / ((maGradientInfo.mnSteps * 2L) - 1L)); - for(sal_uInt32 a(1L); a < mnSteps; a++) + for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++) { const double fOffset(fStripeWidth * (double)a); @@ -350,34 +243,20 @@ namespace drawinglayer void GeoTexSvxGradientAxial::appendColors(::std::vector< basegfx::BColor >& rColors) { - if(mnSteps) + if(maGradientInfo.mnSteps) { rColors.push_back(maEnd); - for(sal_uInt32 a(1L); a < mnSteps; a++) + for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++) { - rColors.push_back(interpolate(maEnd, maStart, (double)a / (double)mnSteps)); + rColors.push_back(interpolate(maEnd, maStart, (double)a / (double)maGradientInfo.mnSteps)); } } } void GeoTexSvxGradientAxial::modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& /*rfOpacity*/) const { - const basegfx::B2DPoint aCoor(maBackTextureTransform * rUV); - const double fAbsY(fabs(aCoor.getY())); - - if(basegfx::fTools::moreOrEqual(fAbsY, 1.0)) - { - rBColor = maEnd; - return; - } - - double fScaler(fAbsY); - - if(mnSteps > 2L && mnSteps < 128L) - { - fScaler = floor(((fScaler * mfInternalSteps) + 1.0) / 2.0) / (double)(mnSteps - 1L); - } + const double fScaler(basegfx::tools::getAxialGradientAlpha(rUV, maGradientInfo)); rBColor = (maStart * (1.0 - fScaler)) + (maEnd * fScaler); } @@ -393,46 +272,11 @@ namespace drawinglayer GeoTexSvxGradientRadial::GeoTexSvxGradientRadial(const basegfx::B2DRange& rTargetRange, const basegfx::BColor& rStart, const basegfx::BColor& rEnd, sal_uInt32 nSteps, double fBorder, double fOffsetX, double fOffsetY) : GeoTexSvxGradient(rTargetRange, rStart, rEnd, nSteps, fBorder) { - double fTargetSizeX(maTargetRange.getWidth()); - double fTargetSizeY(maTargetRange.getHeight()); - double fTargetOffsetX(maTargetRange.getMinX()); - double fTargetOffsetY(maTargetRange.getMinY()); - - // add object expansion - const double fOriginalDiag(sqrt((fTargetSizeX * fTargetSizeX) + (fTargetSizeY * fTargetSizeY))); - fTargetOffsetX -= (fOriginalDiag - fTargetSizeX) / 2.0; - fTargetOffsetY -= (fOriginalDiag - fTargetSizeY) / 2.0; - fTargetSizeX = fOriginalDiag; - fTargetSizeY = fOriginalDiag; - - // add object scale before rotate - maTextureTransform.scale(fTargetSizeX, fTargetSizeY); - - // add defined offsets after rotation - if(0.5 != fOffsetX || 0.5 != fOffsetY) - { - // use original target size - fTargetOffsetX += (fOffsetX - 0.5) * maTargetRange.getWidth(); - fTargetOffsetY += (fOffsetY - 0.5) * maTargetRange.getHeight(); - } - - // add object translate - maTextureTransform.translate(fTargetOffsetX, fTargetOffsetY); - - // prepare aspect for texture - mfAspect = (0.0 != fTargetSizeY) ? fTargetSizeX / fTargetSizeY : 1.0; - - // build transform from u,v to [0.0 .. 1.0]. As base, use inverse texture transform - maBackTextureTransform = maTextureTransform; - maBackTextureTransform.invert(); - maBackTextureTransform.translate(-0.5, -0.5); - const double fHalfBorder((1.0 - mfBorder) * 0.5); - - if(!basegfx::fTools::equal(fHalfBorder, 0.0)) - { - const double fFactor(1.0 / fHalfBorder); - maBackTextureTransform.scale(fFactor, fFactor); - } + basegfx::tools::createRadialODFGradientInfo(maGradientInfo, + rTargetRange, + basegfx::B2DVector(fOffsetX,fOffsetY), + nSteps, + fBorder); } GeoTexSvxGradientRadial::~GeoTexSvxGradientRadial() @@ -441,7 +285,7 @@ namespace drawinglayer void GeoTexSvxGradientRadial::appendTransformations(::std::vector< basegfx::B2DHomMatrix >& rMatrices) { - if(mnSteps) + if(maGradientInfo.mnSteps) { const double fHalfBorder((1.0 - mfBorder) * 0.5); double fLeft(0.5 - fHalfBorder); @@ -450,18 +294,18 @@ namespace drawinglayer double fBottom(0.5 + fHalfBorder); double fIncrementX, fIncrementY; - if(mfAspect > 1.0) + if(maGradientInfo.mfAspectRatio > 1.0) { - fIncrementY = (fBottom - fTop) / (double)(mnSteps * 2L); - fIncrementX = fIncrementY / mfAspect; + fIncrementY = (fBottom - fTop) / (double)(maGradientInfo.mnSteps * 2L); + fIncrementX = fIncrementY / maGradientInfo.mfAspectRatio; } else { - fIncrementX = (fRight - fLeft) / (double)(mnSteps * 2L); - fIncrementY = fIncrementX * mfAspect; + fIncrementX = (fRight - fLeft) / (double)(maGradientInfo.mnSteps * 2L); + fIncrementY = fIncrementX * maGradientInfo.mfAspectRatio; } - for(sal_uInt32 a(1L); a < mnSteps; a++) + for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++) { // next step fLeft += fIncrementX; @@ -483,21 +327,7 @@ namespace drawinglayer void GeoTexSvxGradientRadial::modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& /*rfOpacity*/) const { - const basegfx::B2DPoint aCoor(maBackTextureTransform * rUV); - const double fDist(aCoor.getX() * aCoor.getX() + aCoor.getY() * aCoor.getY()); - - if(basegfx::fTools::moreOrEqual(fDist, 1.0)) - { - rBColor = maStart; - return; - } - - double fScaler(1.0 - sqrt(fDist)); - - if(mnSteps > 2L && mnSteps < 128L) - { - fScaler = floor(fScaler * (double)mnSteps) / (double)(mnSteps - 1L); - } + const double fScaler(basegfx::tools::getRadialGradientAlpha(rUV, maGradientInfo)); rBColor = (maStart * (1.0 - fScaler)) + (maEnd * fScaler); } @@ -513,56 +343,12 @@ namespace drawinglayer GeoTexSvxGradientElliptical::GeoTexSvxGradientElliptical(const basegfx::B2DRange& rTargetRange, const basegfx::BColor& rStart, const basegfx::BColor& rEnd, sal_uInt32 nSteps, double fBorder, double fOffsetX, double fOffsetY, double fAngle) : GeoTexSvxGradient(rTargetRange, rStart, rEnd, nSteps, fBorder) { - double fTargetSizeX(maTargetRange.getWidth()); - double fTargetSizeY(maTargetRange.getHeight()); - double fTargetOffsetX(maTargetRange.getMinX()); - double fTargetOffsetY(maTargetRange.getMinY()); - - // add object expansion - fTargetOffsetX -= (0.4142 / 2.0 ) * fTargetSizeX; - fTargetOffsetY -= (0.4142 / 2.0 ) * fTargetSizeY; - fTargetSizeX = 1.4142 * fTargetSizeX; - fTargetSizeY = 1.4142 * fTargetSizeY; - - // add object scale before rotate - maTextureTransform.scale(fTargetSizeX, fTargetSizeY); - - // add texture rotate after scale to keep perpendicular angles - if(0.0 != fAngle) - { - basegfx::B2DPoint aCenter(0.5, 0.5); - aCenter *= maTextureTransform; - - maTextureTransform.translate(-aCenter.getX(), -aCenter.getY()); - maTextureTransform.rotate(fAngle); - maTextureTransform.translate(aCenter.getX(), aCenter.getY()); - } - - // add defined offsets after rotation - if(0.5 != fOffsetX || 0.5 != fOffsetY) - { - // use original target size - fTargetOffsetX += (fOffsetX - 0.5) * maTargetRange.getWidth(); - fTargetOffsetY += (fOffsetY - 0.5) * maTargetRange.getHeight(); - } - - // add object translate - maTextureTransform.translate(fTargetOffsetX, fTargetOffsetY); - - // prepare aspect for texture - mfAspect = (0.0 != fTargetSizeY) ? fTargetSizeX / fTargetSizeY : 1.0; - - // build transform from u,v to [0.0 .. 1.0]. As base, use inverse texture transform - maBackTextureTransform = maTextureTransform; - maBackTextureTransform.invert(); - maBackTextureTransform.translate(-0.5, -0.5); - const double fHalfBorder((1.0 - mfBorder) * 0.5); - - if(!basegfx::fTools::equal(fHalfBorder, 0.0)) - { - const double fFactor(1.0 / fHalfBorder); - maBackTextureTransform.scale(fFactor, fFactor); - } + basegfx::tools::createEllipticalODFGradientInfo(maGradientInfo, + rTargetRange, + basegfx::B2DVector(fOffsetX,fOffsetY), + nSteps, + fBorder, + fAngle); } GeoTexSvxGradientElliptical::~GeoTexSvxGradientElliptical() @@ -571,7 +357,7 @@ namespace drawinglayer void GeoTexSvxGradientElliptical::appendTransformations(::std::vector< basegfx::B2DHomMatrix >& rMatrices) { - if(mnSteps) + if(maGradientInfo.mnSteps) { const double fHalfBorder((1.0 - mfBorder) * 0.5); double fLeft(0.5 - fHalfBorder); @@ -580,18 +366,18 @@ namespace drawinglayer double fBottom(0.5 + fHalfBorder); double fIncrementX, fIncrementY; - if(mfAspect > 1.0) + if(maGradientInfo.mfAspectRatio > 1.0) { - fIncrementY = (fBottom - fTop) / (double)(mnSteps * 2L); - fIncrementX = fIncrementY / mfAspect; + fIncrementY = (fBottom - fTop) / (double)(maGradientInfo.mnSteps * 2L); + fIncrementX = fIncrementY / maGradientInfo.mfAspectRatio; } else { - fIncrementX = (fRight - fLeft) / (double)(mnSteps * 2L); - fIncrementY = fIncrementX * mfAspect; + fIncrementX = (fRight - fLeft) / (double)(maGradientInfo.mnSteps * 2L); + fIncrementY = fIncrementX * maGradientInfo.mfAspectRatio; } - for(sal_uInt32 a(1L); a < mnSteps; a++) + for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++) { // next step fLeft += fIncrementX; @@ -613,21 +399,7 @@ namespace drawinglayer void GeoTexSvxGradientElliptical::modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& /*rfOpacity*/) const { - const basegfx::B2DPoint aCoor(maBackTextureTransform * rUV); - const double fDist(aCoor.getX() * aCoor.getX() + aCoor.getY() * aCoor.getY()); - - if(basegfx::fTools::moreOrEqual(fDist, 1.0)) - { - rBColor = maStart; - return; - } - - double fScaler(1.0 - sqrt(fDist)); - - if(mnSteps > 2L && mnSteps < 128L) - { - fScaler = floor(fScaler * (double)mnSteps) / (double)(mnSteps - 1L); - } + const double fScaler(basegfx::tools::getEllipticalGradientAlpha(rUV, maGradientInfo)); rBColor = (maStart * (1.0 - fScaler)) + (maEnd * fScaler); } @@ -643,63 +415,12 @@ namespace drawinglayer GeoTexSvxGradientSquare::GeoTexSvxGradientSquare(const basegfx::B2DRange& rTargetRange, const basegfx::BColor& rStart, const basegfx::BColor& rEnd, sal_uInt32 nSteps, double fBorder, double fOffsetX, double fOffsetY, double fAngle) : GeoTexSvxGradient(rTargetRange, rStart, rEnd, nSteps, fBorder) { - double fTargetSizeX(maTargetRange.getWidth()); - double fTargetSizeY(maTargetRange.getHeight()); - double fTargetOffsetX(maTargetRange.getMinX()); - double fTargetOffsetY(maTargetRange.getMinY()); - - // add object expansion - if(0.0 != fAngle) - { - const double fAbsCos(fabs(cos(fAngle))); - const double fAbsSin(fabs(sin(fAngle))); - const double fNewX(fTargetSizeX * fAbsCos + fTargetSizeY * fAbsSin); - const double fNewY(fTargetSizeY * fAbsCos + fTargetSizeX * fAbsSin); - fTargetOffsetX -= (fNewX - fTargetSizeX) / 2.0; - fTargetOffsetY -= (fNewY - fTargetSizeY) / 2.0; - fTargetSizeX = fNewX; - fTargetSizeY = fNewY; - } - - // add object scale before rotate - maTextureTransform.scale(fTargetSizeX, fTargetSizeY); - - // add texture rotate after scale to keep perpendicular angles - if(0.0 != fAngle) - { - basegfx::B2DPoint aCenter(0.5, 0.5); - aCenter *= maTextureTransform; - - maTextureTransform.translate(-aCenter.getX(), -aCenter.getY()); - maTextureTransform.rotate(fAngle); - maTextureTransform.translate(aCenter.getX(), aCenter.getY()); - } - - // add defined offsets after rotation - if(0.5 != fOffsetX || 0.5 != fOffsetY) - { - // use scaled target size - fTargetOffsetX += (fOffsetX - 0.5) * fTargetSizeX; - fTargetOffsetY += (fOffsetY - 0.5) * fTargetSizeY; - } - - // add object translate - maTextureTransform.translate(fTargetOffsetX, fTargetOffsetY); - - // prepare aspect for texture - mfAspect = (0.0 != fTargetSizeY) ? fTargetSizeX / fTargetSizeY : 1.0; - - // build transform from u,v to [0.0 .. 1.0]. As base, use inverse texture transform - maBackTextureTransform = maTextureTransform; - maBackTextureTransform.invert(); - maBackTextureTransform.translate(-0.5, -0.5); - const double fHalfBorder((1.0 - mfBorder) * 0.5); - - if(!basegfx::fTools::equal(fHalfBorder, 0.0)) - { - const double fFactor(1.0 / fHalfBorder); - maBackTextureTransform.scale(fFactor, fFactor); - } + basegfx::tools::createSquareODFGradientInfo(maGradientInfo, + rTargetRange, + basegfx::B2DVector(fOffsetX,fOffsetY), + nSteps, + fBorder, + fAngle); } GeoTexSvxGradientSquare::~GeoTexSvxGradientSquare() @@ -708,7 +429,7 @@ namespace drawinglayer void GeoTexSvxGradientSquare::appendTransformations(::std::vector< basegfx::B2DHomMatrix >& rMatrices) { - if(mnSteps) + if(maGradientInfo.mnSteps) { const double fHalfBorder((1.0 - mfBorder) * 0.5); double fLeft(0.5 - fHalfBorder); @@ -717,26 +438,26 @@ namespace drawinglayer double fBottom(0.5 + fHalfBorder); double fIncrementX, fIncrementY; - if(mfAspect > 1.0) + if(maGradientInfo.mfAspectRatio > 1.0) { const double fWidth(fRight - fLeft); - const double fHalfAspectExpansion(((mfAspect - 1.0) * 0.5) * fWidth); + const double fHalfAspectExpansion(((maGradientInfo.mfAspectRatio - 1.0) * 0.5) * fWidth); fTop -= fHalfAspectExpansion; fBottom += fHalfAspectExpansion; - fIncrementX = fWidth / (double)(mnSteps * 2L); - fIncrementY = fIncrementX * mfAspect; + fIncrementX = fWidth / (double)(maGradientInfo.mnSteps * 2L); + fIncrementY = fIncrementX * maGradientInfo.mfAspectRatio; } else { const double fHeight(fBottom - fTop); - const double fHalfAspectExpansion((((1.0 / mfAspect) - 1.0) * 0.5) * fHeight); + const double fHalfAspectExpansion((((1.0 / maGradientInfo.mfAspectRatio) - 1.0) * 0.5) * fHeight); fLeft -= fHalfAspectExpansion; fRight += fHalfAspectExpansion; - fIncrementY = fHeight / (double)(mnSteps * 2L); - fIncrementX = fIncrementY / mfAspect; + fIncrementY = fHeight / (double)(maGradientInfo.mnSteps * 2L); + fIncrementX = fIncrementY / maGradientInfo.mfAspectRatio; } - for(sal_uInt32 a(1L); a < mnSteps; a++) + for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++) { // next step fLeft += fIncrementX; @@ -758,22 +479,7 @@ namespace drawinglayer void GeoTexSvxGradientSquare::modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& /*rfOpacity*/) const { - const basegfx::B2DPoint aCoor(maBackTextureTransform * rUV); - const double fAbsX(fabs(aCoor.getX())); - const double fAbsY(fabs(aCoor.getY())); - - if(basegfx::fTools::moreOrEqual(fAbsX, 1.0) || basegfx::fTools::moreOrEqual(fAbsY, 1.0)) - { - rBColor = maStart; - return; - } - - double fScaler(1.0 - (fAbsX > fAbsY ? fAbsX : fAbsY)); - - if(mnSteps > 2L && mnSteps < 128L) - { - fScaler = floor(fScaler * (double)mnSteps) / (double)(mnSteps - 1L); - } + const double fScaler(basegfx::tools::getSquareGradientAlpha(rUV, maGradientInfo)); rBColor = (maStart * (1.0 - fScaler)) + (maEnd * fScaler); } @@ -789,63 +495,12 @@ namespace drawinglayer GeoTexSvxGradientRect::GeoTexSvxGradientRect(const basegfx::B2DRange& rTargetRange, const basegfx::BColor& rStart, const basegfx::BColor& rEnd, sal_uInt32 nSteps, double fBorder, double fOffsetX, double fOffsetY, double fAngle) : GeoTexSvxGradient(rTargetRange, rStart, rEnd, nSteps, fBorder) { - double fTargetSizeX(maTargetRange.getWidth()); - double fTargetSizeY(maTargetRange.getHeight()); - double fTargetOffsetX(maTargetRange.getMinX()); - double fTargetOffsetY(maTargetRange.getMinY()); - - // add object expansion - if(0.0 != fAngle) - { - const double fAbsCos(fabs(cos(fAngle))); - const double fAbsSin(fabs(sin(fAngle))); - const double fNewX(fTargetSizeX * fAbsCos + fTargetSizeY * fAbsSin); - const double fNewY(fTargetSizeY * fAbsCos + fTargetSizeX * fAbsSin); - fTargetOffsetX -= (fNewX - fTargetSizeX) / 2.0; - fTargetOffsetY -= (fNewY - fTargetSizeY) / 2.0; - fTargetSizeX = fNewX; - fTargetSizeY = fNewY; - } - - // add object scale before rotate - maTextureTransform.scale(fTargetSizeX, fTargetSizeY); - - // add texture rotate after scale to keep perpendicular angles - if(0.0 != fAngle) - { - basegfx::B2DPoint aCenter(0.5, 0.5); - aCenter *= maTextureTransform; - - maTextureTransform.translate(-aCenter.getX(), -aCenter.getY()); - maTextureTransform.rotate(fAngle); - maTextureTransform.translate(aCenter.getX(), aCenter.getY()); - } - - // add defined offsets after rotation - if(0.5 != fOffsetX || 0.5 != fOffsetY) - { - // use scaled target size - fTargetOffsetX += (fOffsetX - 0.5) * fTargetSizeX; - fTargetOffsetY += (fOffsetY - 0.5) * fTargetSizeY; - } - - // add object translate - maTextureTransform.translate(fTargetOffsetX, fTargetOffsetY); - - // prepare aspect for texture - mfAspect = (0.0 != fTargetSizeY) ? fTargetSizeX / fTargetSizeY : 1.0; - - // build transform from u,v to [0.0 .. 1.0]. As base, use inverse texture transform - maBackTextureTransform = maTextureTransform; - maBackTextureTransform.invert(); - maBackTextureTransform.translate(-0.5, -0.5); - const double fHalfBorder((1.0 - mfBorder) * 0.5); - - if(!basegfx::fTools::equal(fHalfBorder, 0.0)) - { - const double fFactor(1.0 / fHalfBorder); - maBackTextureTransform.scale(fFactor, fFactor); - } + basegfx::tools::createRectangularODFGradientInfo(maGradientInfo, + rTargetRange, + basegfx::B2DVector(fOffsetX,fOffsetY), + nSteps, + fBorder, + fAngle); } GeoTexSvxGradientRect::~GeoTexSvxGradientRect() @@ -854,7 +509,7 @@ namespace drawinglayer void GeoTexSvxGradientRect::appendTransformations(::std::vector< basegfx::B2DHomMatrix >& rMatrices) { - if(mnSteps) + if(maGradientInfo.mnSteps) { const double fHalfBorder((1.0 - mfBorder) * 0.5); double fLeft(0.5 - fHalfBorder); @@ -863,18 +518,18 @@ namespace drawinglayer double fBottom(0.5 + fHalfBorder); double fIncrementX, fIncrementY; - if(mfAspect > 1.0) + if(maGradientInfo.mfAspectRatio > 1.0) { - fIncrementY = (fBottom - fTop) / (double)(mnSteps * 2L); - fIncrementX = fIncrementY / mfAspect; + fIncrementY = (fBottom - fTop) / (double)(maGradientInfo.mnSteps * 2L); + fIncrementX = fIncrementY / maGradientInfo.mfAspectRatio; } else { - fIncrementX = (fRight - fLeft) / (double)(mnSteps * 2L); - fIncrementY = fIncrementX * mfAspect; + fIncrementX = (fRight - fLeft) / (double)(maGradientInfo.mnSteps * 2L); + fIncrementY = fIncrementX * maGradientInfo.mfAspectRatio; } - for(sal_uInt32 a(1L); a < mnSteps; a++) + for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++) { // next step fLeft += fIncrementX; @@ -896,22 +551,7 @@ namespace drawinglayer void GeoTexSvxGradientRect::modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& /*rfOpacity*/) const { - const basegfx::B2DPoint aCoor(maBackTextureTransform * rUV); - const double fAbsX(fabs(aCoor.getX())); - const double fAbsY(fabs(aCoor.getY())); - - if(basegfx::fTools::moreOrEqual(fAbsX, 1.0) || basegfx::fTools::moreOrEqual(fAbsY, 1.0)) - { - rBColor = maStart; - return; - } - - double fScaler(1.0 - (fAbsX > fAbsY ? fAbsX : fAbsY)); - - if(mnSteps > 2L && mnSteps < 128L) - { - fScaler = floor(fScaler * (double)mnSteps) / (double)(mnSteps - 1L); - } + const double fScaler(basegfx::tools::getRectangularGradientAlpha(rUV, maGradientInfo)); rBColor = (maStart * (1.0 - fScaler)) + (maEnd * fScaler); } |