diff options
Diffstat (limited to 'drawinglayer/source/primitive2d/gridprimitive2d.cxx')
-rw-r--r-- | drawinglayer/source/primitive2d/gridprimitive2d.cxx | 350 |
1 files changed, 175 insertions, 175 deletions
diff --git a/drawinglayer/source/primitive2d/gridprimitive2d.cxx b/drawinglayer/source/primitive2d/gridprimitive2d.cxx index 232c35fa66c2..66a747452103 100644 --- a/drawinglayer/source/primitive2d/gridprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/gridprimitive2d.cxx @@ -32,221 +32,221 @@ namespace drawinglayer::primitive2d { void GridPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const { - if(!rViewInformation.getViewport().isEmpty() && getWidth() > 0.0 && getHeight() > 0.0) + if(!(!rViewInformation.getViewport().isEmpty() && getWidth() > 0.0 && getHeight() > 0.0)) + return; + + // decompose grid matrix to get logic size + basegfx::B2DVector aScale, aTranslate; + double fRotate, fShearX; + getTransform().decompose(aScale, aTranslate, fRotate, fShearX); + + // create grid matrix which transforms from scaled logic to view + basegfx::B2DHomMatrix aRST(basegfx::utils::createShearXRotateTranslateB2DHomMatrix( + fShearX, fRotate, aTranslate.getX(), aTranslate.getY())); + aRST *= rViewInformation.getObjectToViewTransformation(); + + // get step widths + double fStepX(getWidth()); + double fStepY(getHeight()); + const double fMinimalStep(10.0); + + // guarantee a step width of 10.0 + if(basegfx::fTools::less(fStepX, fMinimalStep)) { - // decompose grid matrix to get logic size - basegfx::B2DVector aScale, aTranslate; - double fRotate, fShearX; - getTransform().decompose(aScale, aTranslate, fRotate, fShearX); - - // create grid matrix which transforms from scaled logic to view - basegfx::B2DHomMatrix aRST(basegfx::utils::createShearXRotateTranslateB2DHomMatrix( - fShearX, fRotate, aTranslate.getX(), aTranslate.getY())); - aRST *= rViewInformation.getObjectToViewTransformation(); - - // get step widths - double fStepX(getWidth()); - double fStepY(getHeight()); - const double fMinimalStep(10.0); - - // guarantee a step width of 10.0 - if(basegfx::fTools::less(fStepX, fMinimalStep)) - { - fStepX = fMinimalStep; - } + fStepX = fMinimalStep; + } - if(basegfx::fTools::less(fStepY, fMinimalStep)) - { - fStepY = fMinimalStep; - } + if(basegfx::fTools::less(fStepY, fMinimalStep)) + { + fStepY = fMinimalStep; + } - // get relative distances in view coordinates - double fViewStepX((rViewInformation.getObjectToViewTransformation() * basegfx::B2DVector(fStepX, 0.0)).getLength()); - double fViewStepY((rViewInformation.getObjectToViewTransformation() * basegfx::B2DVector(0.0, fStepY)).getLength()); - double fSmallStepX(1.0), fViewSmallStepX(1.0), fSmallStepY(1.0), fViewSmallStepY(1.0); - sal_uInt32 nSmallStepsX(0), nSmallStepsY(0); + // get relative distances in view coordinates + double fViewStepX((rViewInformation.getObjectToViewTransformation() * basegfx::B2DVector(fStepX, 0.0)).getLength()); + double fViewStepY((rViewInformation.getObjectToViewTransformation() * basegfx::B2DVector(0.0, fStepY)).getLength()); + double fSmallStepX(1.0), fViewSmallStepX(1.0), fSmallStepY(1.0), fViewSmallStepY(1.0); + sal_uInt32 nSmallStepsX(0), nSmallStepsY(0); - // setup subdivisions - if(getSubdivisionsX()) - { - fSmallStepX = fStepX / getSubdivisionsX(); - fViewSmallStepX = fViewStepX / getSubdivisionsX(); - } + // setup subdivisions + if(getSubdivisionsX()) + { + fSmallStepX = fStepX / getSubdivisionsX(); + fViewSmallStepX = fViewStepX / getSubdivisionsX(); + } - if(getSubdivisionsY()) - { - fSmallStepY = fStepY / getSubdivisionsY(); - fViewSmallStepY = fViewStepY / getSubdivisionsY(); - } + if(getSubdivisionsY()) + { + fSmallStepY = fStepY / getSubdivisionsY(); + fViewSmallStepY = fViewStepY / getSubdivisionsY(); + } - // correct step width - while(fViewStepX < getSmallestViewDistance()) - { - fViewStepX *= 2.0; - fStepX *= 2.0; - } + // correct step width + while(fViewStepX < getSmallestViewDistance()) + { + fViewStepX *= 2.0; + fStepX *= 2.0; + } - while(fViewStepY < getSmallestViewDistance()) + while(fViewStepY < getSmallestViewDistance()) + { + fViewStepY *= 2.0; + fStepY *= 2.0; + } + + // correct small step width + if(getSubdivisionsX()) + { + while(fViewSmallStepX < getSmallestSubdivisionViewDistance()) { - fViewStepY *= 2.0; - fStepY *= 2.0; + fViewSmallStepX *= 2.0; + fSmallStepX *= 2.0; } - // correct small step width - if(getSubdivisionsX()) - { - while(fViewSmallStepX < getSmallestSubdivisionViewDistance()) - { - fViewSmallStepX *= 2.0; - fSmallStepX *= 2.0; - } + nSmallStepsX = static_cast<sal_uInt32>(fStepX / fSmallStepX); + } - nSmallStepsX = static_cast<sal_uInt32>(fStepX / fSmallStepX); + if(getSubdivisionsY()) + { + while(fViewSmallStepY < getSmallestSubdivisionViewDistance()) + { + fViewSmallStepY *= 2.0; + fSmallStepY *= 2.0; } - if(getSubdivisionsY()) - { - while(fViewSmallStepY < getSmallestSubdivisionViewDistance()) - { - fViewSmallStepY *= 2.0; - fSmallStepY *= 2.0; - } + nSmallStepsY = static_cast<sal_uInt32>(fStepY / fSmallStepY); + } - nSmallStepsY = static_cast<sal_uInt32>(fStepY / fSmallStepY); - } + // calculate extended viewport in which grid points may lie at all + basegfx::B2DRange aExtendedViewport; - // calculate extended viewport in which grid points may lie at all - basegfx::B2DRange aExtendedViewport; + if(rViewInformation.getDiscreteViewport().isEmpty()) + { + // not set, use logic size to travel over all potential grid points + aExtendedViewport = basegfx::B2DRange(0.0, 0.0, aScale.getX(), aScale.getY()); + } + else + { + // transform unit range to discrete view + aExtendedViewport = basegfx::B2DRange(0.0, 0.0, 1.0, 1.0); + basegfx::B2DHomMatrix aTrans(rViewInformation.getObjectToViewTransformation() * getTransform()); + aExtendedViewport.transform(aTrans); - if(rViewInformation.getDiscreteViewport().isEmpty()) - { - // not set, use logic size to travel over all potential grid points - aExtendedViewport = basegfx::B2DRange(0.0, 0.0, aScale.getX(), aScale.getY()); - } - else + // intersect with visible part + aExtendedViewport.intersect(rViewInformation.getDiscreteViewport()); + + if(!aExtendedViewport.isEmpty()) { - // transform unit range to discrete view - aExtendedViewport = basegfx::B2DRange(0.0, 0.0, 1.0, 1.0); - basegfx::B2DHomMatrix aTrans(rViewInformation.getObjectToViewTransformation() * getTransform()); + // convert back and apply scale + aTrans.invert(); + aTrans.scale(aScale.getX(), aScale.getY()); aExtendedViewport.transform(aTrans); - // intersect with visible part - aExtendedViewport.intersect(rViewInformation.getDiscreteViewport()); - - if(!aExtendedViewport.isEmpty()) - { - // convert back and apply scale - aTrans.invert(); - aTrans.scale(aScale.getX(), aScale.getY()); - aExtendedViewport.transform(aTrans); - - // crop start/end in X/Y to multiples of logical step width - const double fHalfCrossSize((rViewInformation.getInverseObjectToViewTransformation() * basegfx::B2DVector(3.0, 0.0)).getLength()); - const double fMinX(floor((aExtendedViewport.getMinX() - fHalfCrossSize) / fStepX) * fStepX); - const double fMaxX(ceil((aExtendedViewport.getMaxX() + fHalfCrossSize) / fStepX) * fStepX); - const double fMinY(floor((aExtendedViewport.getMinY() - fHalfCrossSize) / fStepY) * fStepY); - const double fMaxY(ceil((aExtendedViewport.getMaxY() + fHalfCrossSize) / fStepY) * fStepY); - - // put to aExtendedViewport and crop on object logic size - aExtendedViewport = basegfx::B2DRange( - std::max(fMinX, 0.0), - std::max(fMinY, 0.0), - std::min(fMaxX, aScale.getX()), - std::min(fMaxY, aScale.getY())); - } + // crop start/end in X/Y to multiples of logical step width + const double fHalfCrossSize((rViewInformation.getInverseObjectToViewTransformation() * basegfx::B2DVector(3.0, 0.0)).getLength()); + const double fMinX(floor((aExtendedViewport.getMinX() - fHalfCrossSize) / fStepX) * fStepX); + const double fMaxX(ceil((aExtendedViewport.getMaxX() + fHalfCrossSize) / fStepX) * fStepX); + const double fMinY(floor((aExtendedViewport.getMinY() - fHalfCrossSize) / fStepY) * fStepY); + const double fMaxY(ceil((aExtendedViewport.getMaxY() + fHalfCrossSize) / fStepY) * fStepY); + + // put to aExtendedViewport and crop on object logic size + aExtendedViewport = basegfx::B2DRange( + std::max(fMinX, 0.0), + std::max(fMinY, 0.0), + std::min(fMaxX, aScale.getX()), + std::min(fMaxY, aScale.getY())); } + } - if(!aExtendedViewport.isEmpty()) + if(aExtendedViewport.isEmpty()) + return; + + // prepare point vectors for point and cross markers + std::vector< basegfx::B2DPoint > aPositionsPoint; + std::vector< basegfx::B2DPoint > aPositionsCross; + + for(double fX(aExtendedViewport.getMinX()); fX < aExtendedViewport.getMaxX(); fX += fStepX) + { + const bool bXZero(basegfx::fTools::equalZero(fX)); + + for(double fY(aExtendedViewport.getMinY()); fY < aExtendedViewport.getMaxY(); fY += fStepY) { - // prepare point vectors for point and cross markers - std::vector< basegfx::B2DPoint > aPositionsPoint; - std::vector< basegfx::B2DPoint > aPositionsCross; + const bool bYZero(basegfx::fTools::equalZero(fY)); - for(double fX(aExtendedViewport.getMinX()); fX < aExtendedViewport.getMaxX(); fX += fStepX) + if(!bXZero && !bYZero) { - const bool bXZero(basegfx::fTools::equalZero(fX)); - - for(double fY(aExtendedViewport.getMinY()); fY < aExtendedViewport.getMaxY(); fY += fStepY) + // get discrete position and test against 3x3 area surrounding it + // since it's a cross + const double fHalfCrossSize(3.0 * 0.5); + const basegfx::B2DPoint aViewPos(aRST * basegfx::B2DPoint(fX, fY)); + const basegfx::B2DRange aDiscreteRangeCross( + aViewPos.getX() - fHalfCrossSize, aViewPos.getY() - fHalfCrossSize, + aViewPos.getX() + fHalfCrossSize, aViewPos.getY() + fHalfCrossSize); + + if(rViewInformation.getDiscreteViewport().overlaps(aDiscreteRangeCross)) { - const bool bYZero(basegfx::fTools::equalZero(fY)); + const basegfx::B2DPoint aLogicPos(rViewInformation.getInverseObjectToViewTransformation() * aViewPos); + aPositionsCross.push_back(aLogicPos); + } + } - if(!bXZero && !bYZero) - { - // get discrete position and test against 3x3 area surrounding it - // since it's a cross - const double fHalfCrossSize(3.0 * 0.5); - const basegfx::B2DPoint aViewPos(aRST * basegfx::B2DPoint(fX, fY)); - const basegfx::B2DRange aDiscreteRangeCross( - aViewPos.getX() - fHalfCrossSize, aViewPos.getY() - fHalfCrossSize, - aViewPos.getX() + fHalfCrossSize, aViewPos.getY() + fHalfCrossSize); - - if(rViewInformation.getDiscreteViewport().overlaps(aDiscreteRangeCross)) - { - const basegfx::B2DPoint aLogicPos(rViewInformation.getInverseObjectToViewTransformation() * aViewPos); - aPositionsCross.push_back(aLogicPos); - } - } + if(getSubdivisionsX() && !bYZero) + { + double fF(fX + fSmallStepX); - if(getSubdivisionsX() && !bYZero) - { - double fF(fX + fSmallStepX); - - for(sal_uInt32 a(1); a < nSmallStepsX && fF < aExtendedViewport.getMaxX(); a++, fF += fSmallStepX) - { - const basegfx::B2DPoint aViewPos(aRST * basegfx::B2DPoint(fF, fY)); - - if(rViewInformation.getDiscreteViewport().isInside(aViewPos)) - { - const basegfx::B2DPoint aLogicPos(rViewInformation.getInverseObjectToViewTransformation() * aViewPos); - aPositionsPoint.push_back(aLogicPos); - } - } - } + for(sal_uInt32 a(1); a < nSmallStepsX && fF < aExtendedViewport.getMaxX(); a++, fF += fSmallStepX) + { + const basegfx::B2DPoint aViewPos(aRST * basegfx::B2DPoint(fF, fY)); - if(getSubdivisionsY() && !bXZero) + if(rViewInformation.getDiscreteViewport().isInside(aViewPos)) { - double fF(fY + fSmallStepY); - - for(sal_uInt32 a(1); a < nSmallStepsY && fF < aExtendedViewport.getMaxY(); a++, fF += fSmallStepY) - { - const basegfx::B2DPoint aViewPos(aRST * basegfx::B2DPoint(fX, fF)); - - if(rViewInformation.getDiscreteViewport().isInside(aViewPos)) - { - const basegfx::B2DPoint aLogicPos(rViewInformation.getInverseObjectToViewTransformation() * aViewPos); - aPositionsPoint.push_back(aLogicPos); - } - } + const basegfx::B2DPoint aLogicPos(rViewInformation.getInverseObjectToViewTransformation() * aViewPos); + aPositionsPoint.push_back(aLogicPos); } } } - // prepare return value - const sal_uInt32 nCountPoint(aPositionsPoint.size()); - const sal_uInt32 nCountCross(aPositionsCross.size()); - - // add PointArrayPrimitive2D if point markers were added - if(nCountPoint) + if(getSubdivisionsY() && !bXZero) { - rContainer.push_back(new PointArrayPrimitive2D(aPositionsPoint, getBColor())); - } + double fF(fY + fSmallStepY); - // add MarkerArrayPrimitive2D if cross markers were added - if(nCountCross) - { - if(!getSubdivisionsX() && !getSubdivisionsY()) - { - // no subdivisions, so fall back to points at grid positions, no need to - // visualize a difference between divisions and sub-divisions - rContainer.push_back(new PointArrayPrimitive2D(aPositionsCross, getBColor())); - } - else + for(sal_uInt32 a(1); a < nSmallStepsY && fF < aExtendedViewport.getMaxY(); a++, fF += fSmallStepY) { - rContainer.push_back(new MarkerArrayPrimitive2D(aPositionsCross, getCrossMarker())); + const basegfx::B2DPoint aViewPos(aRST * basegfx::B2DPoint(fX, fF)); + + if(rViewInformation.getDiscreteViewport().isInside(aViewPos)) + { + const basegfx::B2DPoint aLogicPos(rViewInformation.getInverseObjectToViewTransformation() * aViewPos); + aPositionsPoint.push_back(aLogicPos); + } } } } } + + // prepare return value + const sal_uInt32 nCountPoint(aPositionsPoint.size()); + const sal_uInt32 nCountCross(aPositionsCross.size()); + + // add PointArrayPrimitive2D if point markers were added + if(nCountPoint) + { + rContainer.push_back(new PointArrayPrimitive2D(aPositionsPoint, getBColor())); + } + + // add MarkerArrayPrimitive2D if cross markers were added + if(!nCountCross) + return; + + if(!getSubdivisionsX() && !getSubdivisionsY()) + { + // no subdivisions, so fall back to points at grid positions, no need to + // visualize a difference between divisions and sub-divisions + rContainer.push_back(new PointArrayPrimitive2D(aPositionsCross, getBColor())); + } + else + { + rContainer.push_back(new MarkerArrayPrimitive2D(aPositionsCross, getCrossMarker())); + } } GridPrimitive2D::GridPrimitive2D( |