diff options
author | thb <thb@openoffice.org> | 2009-10-16 00:43:16 +0200 |
---|---|---|
committer | thb <thb@openoffice.org> | 2009-10-16 00:43:16 +0200 |
commit | 39d191d6dcac49b137dbcd3b4e029714016641ea (patch) | |
tree | f34330c117e9abdb71e5521f399bc84d67a70045 /drawinglayer | |
parent | 49d596bd5d1b5e0a1e02d74a51aab207410abae4 (diff) |
#i105937# Much improved gradient support for canvas/basegfx/drawinglayer.
See http://blog.thebehrens.net/2009/07/28/hackweek-iv-canvas-convwatch/ for more background information
Diffstat (limited to 'drawinglayer')
7 files changed, 49 insertions, 129 deletions
diff --git a/drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx b/drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx index ff0c031b38a1..1a3c28119c3b 100644 --- a/drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx @@ -62,16 +62,6 @@ namespace drawinglayer basegfx::B2DPolygon aUnitPolygon; sal_uInt32 nSteps(maFillGradient.getSteps()); - if(attribute::GRADIENTSTYLE_RADIAL == aGradientStyle || attribute::GRADIENTSTYLE_ELLIPTICAL == aGradientStyle) - { - const basegfx::B2DPoint aCircleCenter(0.5, 0.5); - aUnitPolygon = basegfx::tools::createPolygonFromEllipse(aCircleCenter, 0.5, 0.5); - } - else - { - aUnitPolygon = basegfx::tools::createPolygonFromRect(basegfx::B2DRange(0.0, 0.0, 1.0, 1.0)); - } - // make sure steps is not too high/low const basegfx::BColor aStart(maFillGradient.getStartColor()); const basegfx::BColor aEnd(maFillGradient.getEndColor()); @@ -96,16 +86,18 @@ namespace drawinglayer { case attribute::GRADIENTSTYLE_LINEAR: { - texture::GeoTexSvxGradientLinear aGradient(getObjectRange(), aStart, aEnd, nSteps, maFillGradient.getBorder(), -maFillGradient.getAngle()); + texture::GeoTexSvxGradientLinear aGradient(getObjectRange(), aStart, aEnd, nSteps, maFillGradient.getBorder(), maFillGradient.getAngle()); aGradient.appendTransformations(aMatrices); aGradient.appendColors(aColors); + aUnitPolygon = basegfx::tools::createPolygonFromRect(basegfx::B2DRange(0, 0, 1, 1)); break; } case attribute::GRADIENTSTYLE_AXIAL: { - texture::GeoTexSvxGradientAxial aGradient(getObjectRange(), aStart, aEnd, nSteps, maFillGradient.getBorder(), -maFillGradient.getAngle()); + texture::GeoTexSvxGradientAxial aGradient(getObjectRange(), aStart, aEnd, nSteps, maFillGradient.getBorder(), maFillGradient.getAngle()); aGradient.appendTransformations(aMatrices); aGradient.appendColors(aColors); + aUnitPolygon = basegfx::tools::createPolygonFromRect(basegfx::B2DRange(-1, -1, 1, 1)); break; } case attribute::GRADIENTSTYLE_RADIAL: @@ -113,27 +105,31 @@ namespace drawinglayer texture::GeoTexSvxGradientRadial aGradient(getObjectRange(), aStart, aEnd, nSteps, maFillGradient.getBorder(), maFillGradient.getOffsetX(), maFillGradient.getOffsetY()); aGradient.appendTransformations(aMatrices); aGradient.appendColors(aColors); + aUnitPolygon = basegfx::tools::createPolygonFromEllipse(basegfx::B2DPoint(0,0), 1, 1); break; } case attribute::GRADIENTSTYLE_ELLIPTICAL: { - texture::GeoTexSvxGradientElliptical aGradient(getObjectRange(), aStart, aEnd, nSteps, maFillGradient.getBorder(), maFillGradient.getOffsetX(), maFillGradient.getOffsetY(), -maFillGradient.getAngle()); + texture::GeoTexSvxGradientElliptical aGradient(getObjectRange(), aStart, aEnd, nSteps, maFillGradient.getBorder(), maFillGradient.getOffsetX(), maFillGradient.getOffsetY(), maFillGradient.getAngle()); aGradient.appendTransformations(aMatrices); aGradient.appendColors(aColors); + aUnitPolygon = basegfx::tools::createPolygonFromEllipse(basegfx::B2DPoint(0,0), 1, 1); break; } case attribute::GRADIENTSTYLE_SQUARE: { - texture::GeoTexSvxGradientSquare aGradient(getObjectRange(), aStart, aEnd, nSteps, maFillGradient.getBorder(), maFillGradient.getOffsetX(), maFillGradient.getOffsetY(), -maFillGradient.getAngle()); + texture::GeoTexSvxGradientSquare aGradient(getObjectRange(), aStart, aEnd, nSteps, maFillGradient.getBorder(), maFillGradient.getOffsetX(), maFillGradient.getOffsetY(), maFillGradient.getAngle()); aGradient.appendTransformations(aMatrices); aGradient.appendColors(aColors); + aUnitPolygon = basegfx::tools::createPolygonFromRect(basegfx::B2DRange(-1, -1, 1, 1)); break; } case attribute::GRADIENTSTYLE_RECT: { - texture::GeoTexSvxGradientRect aGradient(getObjectRange(), aStart, aEnd, nSteps, maFillGradient.getBorder(), maFillGradient.getOffsetX(), maFillGradient.getOffsetY(), -maFillGradient.getAngle()); + texture::GeoTexSvxGradientRect aGradient(getObjectRange(), aStart, aEnd, nSteps, maFillGradient.getBorder(), maFillGradient.getOffsetX(), maFillGradient.getOffsetY(), maFillGradient.getAngle()); aGradient.appendTransformations(aMatrices); aGradient.appendColors(aColors); + aUnitPolygon = basegfx::tools::createPolygonFromRect(basegfx::B2DRange(-1, -1, 1, 1)); break; } } diff --git a/drawinglayer/source/primitive2d/fillhatchprimitive2d.cxx b/drawinglayer/source/primitive2d/fillhatchprimitive2d.cxx index 06d04111686d..ce62a58dcab6 100644 --- a/drawinglayer/source/primitive2d/fillhatchprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/fillhatchprimitive2d.cxx @@ -59,7 +59,7 @@ namespace drawinglayer { // create hatch const basegfx::BColor aHatchColor(maFillHatch.getColor()); - const double fAngle(-maFillHatch.getAngle()); + const double fAngle(maFillHatch.getAngle()); ::std::vector< basegfx::B2DHomMatrix > aMatrices; // get hatch transformations @@ -68,7 +68,7 @@ namespace drawinglayer case attribute::HATCHSTYLE_TRIPLE: { // rotated 45 degrees - texture::GeoTexSvxHatch aHatch(getObjectRange(), maFillHatch.getDistance(), fAngle + F_PI4); + texture::GeoTexSvxHatch aHatch(getObjectRange(), maFillHatch.getDistance(), fAngle - F_PI4); aHatch.appendTransformations(aMatrices); // fall-through by purpose @@ -76,7 +76,7 @@ namespace drawinglayer case attribute::HATCHSTYLE_DOUBLE: { // rotated 90 degrees - texture::GeoTexSvxHatch aHatch(getObjectRange(), maFillHatch.getDistance(), fAngle + F_PI2); + texture::GeoTexSvxHatch aHatch(getObjectRange(), maFillHatch.getDistance(), fAngle - F_PI2); aHatch.appendTransformations(aMatrices); // fall-through by purpose diff --git a/drawinglayer/source/primitive3d/hatchtextureprimitive3d.cxx b/drawinglayer/source/primitive3d/hatchtextureprimitive3d.cxx index dd49f99b751c..854e2d6ea557 100644 --- a/drawinglayer/source/primitive3d/hatchtextureprimitive3d.cxx +++ b/drawinglayer/source/primitive3d/hatchtextureprimitive3d.cxx @@ -155,7 +155,7 @@ namespace drawinglayer // get 2d range of texture coordinates const basegfx::B2DRange aOutlineRange(basegfx::tools::getRange(aTexPolyPolygon)); const basegfx::BColor aHatchColor(getHatch().getColor()); - const double fAngle(-getHatch().getAngle()); + const double fAngle(getHatch().getAngle()); ::std::vector< basegfx::B2DHomMatrix > aMatrices; // get hatch transformations @@ -164,13 +164,13 @@ namespace drawinglayer case attribute::HATCHSTYLE_TRIPLE: { // rotated 45 degrees - texture::GeoTexSvxHatch aHatch(aOutlineRange, getHatch().getDistance(), fAngle + F_PI4); + texture::GeoTexSvxHatch aHatch(aOutlineRange, getHatch().getDistance(), fAngle - F_PI4); aHatch.appendTransformations(aMatrices); } case attribute::HATCHSTYLE_DOUBLE: { // rotated 90 degrees - texture::GeoTexSvxHatch aHatch(aOutlineRange, getHatch().getDistance(), fAngle + F_PI2); + texture::GeoTexSvxHatch aHatch(aOutlineRange, getHatch().getDistance(), fAngle - F_PI2); aHatch.appendTransformations(aMatrices); } case attribute::HATCHSTYLE_SINGLE: diff --git a/drawinglayer/source/processor2d/vclprocessor2d.cxx b/drawinglayer/source/processor2d/vclprocessor2d.cxx index e5a88812dd10..487d5bdae40c 100644 --- a/drawinglayer/source/processor2d/vclprocessor2d.cxx +++ b/drawinglayer/source/processor2d/vclprocessor2d.cxx @@ -561,7 +561,7 @@ namespace drawinglayer impDrawGradientToOutDev( *mpOutputDevice, aLocalPolyPolygon, rGradient.getStyle(), rGradient.getSteps(), aStartColor, aEndColor, rGradient.getBorder(), - -rGradient.getAngle(), rGradient.getOffsetX(), rGradient.getOffsetY(), false); + rGradient.getAngle(), rGradient.getOffsetX(), rGradient.getOffsetY(), false); } } diff --git a/drawinglayer/source/processor3d/defaultprocessor3d.cxx b/drawinglayer/source/processor3d/defaultprocessor3d.cxx index d9194ca4b5eb..9d42cf68fe60 100644 --- a/drawinglayer/source/processor3d/defaultprocessor3d.cxx +++ b/drawinglayer/source/processor3d/defaultprocessor3d.cxx @@ -106,12 +106,12 @@ namespace drawinglayer { case attribute::GRADIENTSTYLE_LINEAR: { - pNewTex = new texture::GeoTexSvxGradientLinear(aOutlineRange, aStart, aEnd, nSteps, rFillGradient.getBorder(), -rFillGradient.getAngle()); + pNewTex = new texture::GeoTexSvxGradientLinear(aOutlineRange, aStart, aEnd, nSteps, rFillGradient.getBorder(), rFillGradient.getAngle()); break; } case attribute::GRADIENTSTYLE_AXIAL: { - pNewTex = new texture::GeoTexSvxGradientAxial(aOutlineRange, aStart, aEnd, nSteps, rFillGradient.getBorder(), -rFillGradient.getAngle()); + pNewTex = new texture::GeoTexSvxGradientAxial(aOutlineRange, aStart, aEnd, nSteps, rFillGradient.getBorder(), rFillGradient.getAngle()); break; } case attribute::GRADIENTSTYLE_RADIAL: @@ -121,17 +121,17 @@ namespace drawinglayer } case attribute::GRADIENTSTYLE_ELLIPTICAL: { - pNewTex = new texture::GeoTexSvxGradientElliptical(aOutlineRange, aStart, aEnd, nSteps, rFillGradient.getBorder(), rFillGradient.getOffsetX(), rFillGradient.getOffsetY(), -rFillGradient.getAngle()); + pNewTex = new texture::GeoTexSvxGradientElliptical(aOutlineRange, aStart, aEnd, nSteps, rFillGradient.getBorder(), rFillGradient.getOffsetX(), rFillGradient.getOffsetY(), rFillGradient.getAngle()); break; } case attribute::GRADIENTSTYLE_SQUARE: { - pNewTex = new texture::GeoTexSvxGradientSquare(aOutlineRange, aStart, aEnd, nSteps, rFillGradient.getBorder(), rFillGradient.getOffsetX(), rFillGradient.getOffsetY(), -rFillGradient.getAngle()); + pNewTex = new texture::GeoTexSvxGradientSquare(aOutlineRange, aStart, aEnd, nSteps, rFillGradient.getBorder(), rFillGradient.getOffsetX(), rFillGradient.getOffsetY(), rFillGradient.getAngle()); break; } case attribute::GRADIENTSTYLE_RECT: { - pNewTex = new texture::GeoTexSvxGradientRect(aOutlineRange, aStart, aEnd, nSteps, rFillGradient.getBorder(), rFillGradient.getOffsetX(), rFillGradient.getOffsetY(), -rFillGradient.getAngle()); + pNewTex = new texture::GeoTexSvxGradientRect(aOutlineRange, aStart, aEnd, nSteps, rFillGradient.getBorder(), rFillGradient.getOffsetX(), rFillGradient.getOffsetY(), rFillGradient.getAngle()); break; } } diff --git a/drawinglayer/source/texture/texture.cxx b/drawinglayer/source/texture/texture.cxx index 4f784c71897f..934003ce5a00 100644 --- a/drawinglayer/source/texture/texture.cxx +++ b/drawinglayer/source/texture/texture.cxx @@ -165,15 +165,10 @@ namespace drawinglayer { if(maGradientInfo.mnSteps) { - const double fTop(mfBorder); - const double fStripeWidth((1.0 - fTop) / maGradientInfo.mnSteps); - + const double fStripeWidth(1.0 / maGradientInfo.mnSteps); for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++) { - const double fOffsetUpper(fStripeWidth * (double)a); - - // create matrix - const basegfx::B2DRange aRect(0.0, fTop + fOffsetUpper, 1.0, 1.0); + const basegfx::B2DRange aRect(0.0, fStripeWidth * a, 1.0, 1.0); impAppendMatrix(rMatrices, aRect); } } @@ -225,17 +220,10 @@ namespace drawinglayer { if(maGradientInfo.mnSteps) { - const double fHalfBorder(mfBorder * 0.5); - double fTop(fHalfBorder); - double fBottom(1.0 - fHalfBorder); - const double fStripeWidth((fBottom - fTop) / ((maGradientInfo.mnSteps * 2L) - 1L)); - - for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++) + const double fStripeWidth=1.0 / (maGradientInfo.mnSteps - 1L); + for(sal_uInt32 a(maGradientInfo.mnSteps-1L); a != 0; a--) { - const double fOffset(fStripeWidth * (double)a); - - // create matrix - const basegfx::B2DRange aRect(0.0, fTop + fOffset, 1.0, fBottom - fOffset); + const basegfx::B2DRange aRect(0, 0, 1.0, fStripeWidth * a); impAppendMatrix(rMatrices, aRect); } } @@ -287,34 +275,10 @@ namespace drawinglayer { if(maGradientInfo.mnSteps) { - const double fHalfBorder((1.0 - mfBorder) * 0.5); - double fLeft(0.5 - fHalfBorder); - double fTop(0.5 - fHalfBorder); - double fRight(0.5 + fHalfBorder); - double fBottom(0.5 + fHalfBorder); - double fIncrementX, fIncrementY; - - if(maGradientInfo.mfAspectRatio > 1.0) - { - fIncrementY = (fBottom - fTop) / (double)(maGradientInfo.mnSteps * 2L); - fIncrementX = fIncrementY / maGradientInfo.mfAspectRatio; - } - else - { - fIncrementX = (fRight - fLeft) / (double)(maGradientInfo.mnSteps * 2L); - fIncrementY = fIncrementX * maGradientInfo.mfAspectRatio; - } - + const double fStepSize=1.0 / maGradientInfo.mnSteps; for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++) { - // next step - fLeft += fIncrementX; - fRight -= fIncrementX; - fTop += fIncrementY; - fBottom -= fIncrementY; - - // create matrix - const basegfx::B2DRange aRect(fLeft, fTop, fRight, fBottom); + const basegfx::B2DRange aRect(0, 0, fStepSize*a, fStepSize*a); impAppendMatrix(rMatrices, aRect); } } @@ -359,34 +323,29 @@ namespace drawinglayer { if(maGradientInfo.mnSteps) { - const double fHalfBorder((1.0 - mfBorder) * 0.5); - double fLeft(0.5 - fHalfBorder); - double fTop(0.5 - fHalfBorder); - double fRight(0.5 + fHalfBorder); - double fBottom(0.5 + fHalfBorder); + double fWidth(1); + double fHeight(1); double fIncrementX, fIncrementY; if(maGradientInfo.mfAspectRatio > 1.0) { - fIncrementY = (fBottom - fTop) / (double)(maGradientInfo.mnSteps * 2L); + fIncrementY = fHeight / maGradientInfo.mnSteps; fIncrementX = fIncrementY / maGradientInfo.mfAspectRatio; } else { - fIncrementX = (fRight - fLeft) / (double)(maGradientInfo.mnSteps * 2L); + fIncrementX = fWidth / maGradientInfo.mnSteps; fIncrementY = fIncrementX * maGradientInfo.mfAspectRatio; } for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++) { // next step - fLeft += fIncrementX; - fRight -= fIncrementX; - fTop += fIncrementY; - fBottom -= fIncrementY; + fWidth -= fIncrementX; + fHeight -= fIncrementY; // create matrix - const basegfx::B2DRange aRect(fLeft, fTop, fRight, fBottom); + const basegfx::B2DRange aRect(0, 0, fWidth, fHeight); impAppendMatrix(rMatrices, aRect); } } @@ -431,42 +390,10 @@ namespace drawinglayer { if(maGradientInfo.mnSteps) { - const double fHalfBorder((1.0 - mfBorder) * 0.5); - double fLeft(0.5 - fHalfBorder); - double fTop(0.5 - fHalfBorder); - double fRight(0.5 + fHalfBorder); - double fBottom(0.5 + fHalfBorder); - double fIncrementX, fIncrementY; - - if(maGradientInfo.mfAspectRatio > 1.0) - { - const double fWidth(fRight - fLeft); - const double fHalfAspectExpansion(((maGradientInfo.mfAspectRatio - 1.0) * 0.5) * fWidth); - fTop -= fHalfAspectExpansion; - fBottom += fHalfAspectExpansion; - fIncrementX = fWidth / (double)(maGradientInfo.mnSteps * 2L); - fIncrementY = fIncrementX * maGradientInfo.mfAspectRatio; - } - else - { - const double fHeight(fBottom - fTop); - const double fHalfAspectExpansion((((1.0 / maGradientInfo.mfAspectRatio) - 1.0) * 0.5) * fHeight); - fLeft -= fHalfAspectExpansion; - fRight += fHalfAspectExpansion; - fIncrementY = fHeight / (double)(maGradientInfo.mnSteps * 2L); - fIncrementX = fIncrementY / maGradientInfo.mfAspectRatio; - } - + const double fStepSize=1.0 / maGradientInfo.mnSteps; for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++) { - // next step - fLeft += fIncrementX; - fRight -= fIncrementX; - fTop += fIncrementY; - fBottom -= fIncrementY; - - // create matrix - const basegfx::B2DRange aRect(fLeft, fTop, fRight, fBottom); + const basegfx::B2DRange aRect(0, 0, fStepSize*a, fStepSize*a); impAppendMatrix(rMatrices, aRect); } } @@ -511,34 +438,29 @@ namespace drawinglayer { if(maGradientInfo.mnSteps) { - const double fHalfBorder((1.0 - mfBorder) * 0.5); - double fLeft(0.5 - fHalfBorder); - double fTop(0.5 - fHalfBorder); - double fRight(0.5 + fHalfBorder); - double fBottom(0.5 + fHalfBorder); + double fWidth(1); + double fHeight(1); double fIncrementX, fIncrementY; if(maGradientInfo.mfAspectRatio > 1.0) { - fIncrementY = (fBottom - fTop) / (double)(maGradientInfo.mnSteps * 2L); + fIncrementY = fHeight / maGradientInfo.mnSteps; fIncrementX = fIncrementY / maGradientInfo.mfAspectRatio; } else { - fIncrementX = (fRight - fLeft) / (double)(maGradientInfo.mnSteps * 2L); + fIncrementX = fWidth / maGradientInfo.mnSteps; fIncrementY = fIncrementX * maGradientInfo.mfAspectRatio; } for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++) { // next step - fLeft += fIncrementX; - fRight -= fIncrementX; - fTop += fIncrementY; - fBottom -= fIncrementY; + fWidth -= fIncrementX; + fHeight -= fIncrementY; // create matrix - const basegfx::B2DRange aRect(fLeft, fTop, fRight, fBottom); + const basegfx::B2DRange aRect(0, 0, fWidth, fHeight); impAppendMatrix(rMatrices, aRect); } } @@ -574,6 +496,8 @@ namespace drawinglayer double fTargetOffsetX(rTargetRange.getMinX()); double fTargetOffsetY(rTargetRange.getMinY()); + fAngle = -fAngle; + // add object expansion if(0.0 != fAngle) { diff --git a/drawinglayer/source/texture/texture3d.cxx b/drawinglayer/source/texture/texture3d.cxx index 0e103ad385c9..4257faeee571 100644 --- a/drawinglayer/source/texture/texture3d.cxx +++ b/drawinglayer/source/texture/texture3d.cxx @@ -198,7 +198,7 @@ namespace drawinglayer { const attribute::FillHatchAttribute& rHatch(rPrimitive.getHatch()); const basegfx::B2DRange aOutlineRange(0.0, 0.0, rPrimitive.getTextureSize().getX(), rPrimitive.getTextureSize().getY()); - const double fAngleA(-rHatch.getAngle()); + const double fAngleA(rHatch.getAngle()); maColor = rHatch.getColor(); mbFillBackground = rHatch.isFillBackground(); mp0 = new GeoTexSvxHatch(aOutlineRange, rHatch.getDistance(), fAngleA); |