drawinglayer/source/processor2d/cairopixelprocessor2d.cxx | 122 ++++++++++++- drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx | 7 include/drawinglayer/processor2d/cairopixelprocessor2d.hxx | 24 -- 3 files changed, 131 insertions(+), 22 deletions(-)
New commits: commit f2e8422f2fc5753745ef272c621b24b0614c0ec7 Author: Caolán McNamara <[email protected]> AuthorDate: Wed Dec 21 17:18:37 2022 +0000 Commit: Caolán McNamara <[email protected]> CommitDate: Wed Dec 21 20:18:30 2022 +0000 sync with latest additions to d2dpixelprocessor2d commit 7d948d5c7edbbfd29a77b97a5101aa43917e5ec2 Date: Tue Dec 20 18:42:42 2022 +0100 SDPR: Add handling/direct rendering of some simple Primitives Change-Id: If5432ac02f51f4b9194ec5df347f93e11f58959b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/144694 Tested-by: Jenkins Reviewed-by: Caolán McNamara <[email protected]> diff --git a/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx b/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx index 4b79ff89592d..83edd51be0b3 100644 --- a/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx +++ b/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx @@ -493,9 +493,9 @@ void CairoPixelProcessor2D::processPolygonStrokePrimitive2D( const basegfx::B2DHomMatrix& rObjectToView( getViewInformation2D().getObjectToViewTransformation()); const double fDiscreteLineWidth( - bHairline ? 1.0 - : ceil((rObjectToView * basegfx::B2DVector(rLineAttribute.getWidth(), 0.0)) - .getLength())); + bHairline + ? 1.0 + : (rObjectToView * basegfx::B2DVector(rLineAttribute.getWidth(), 0.0)).getLength()); // Here for every combination which the system-specific implementation is not // capable of visualizing, use the (for decomposable Primitives always possible) @@ -615,6 +615,104 @@ void CairoPixelProcessor2D::processPolygonStrokePrimitive2D( cairo_restore(mpRT); } +void CairoPixelProcessor2D::processLineRectanglePrimitive2D( + const primitive2d::LineRectanglePrimitive2D& rLineRectanglePrimitive2D) +{ + if (rLineRectanglePrimitive2D.getB2DRange().isEmpty()) + { + // no geometry, done + return; + } + + cairo_save(mpRT); + + cairo_matrix_t aMatrix; + const double fAAOffset(getViewInformation2D().getUseAntiAliasing() ? 0.5 : 0.0); + const basegfx::B2DHomMatrix& rObjectToView( + getViewInformation2D().getObjectToViewTransformation()); + cairo_matrix_init(&aMatrix, rObjectToView.a(), rObjectToView.b(), rObjectToView.c(), + rObjectToView.d(), rObjectToView.e() + fAAOffset, + rObjectToView.f() + fAAOffset); + + // set linear transformation + cairo_set_matrix(mpRT, &aMatrix); + + const basegfx::BColor aHairlineColor( + maBColorModifierStack.getModifiedColor(rLineRectanglePrimitive2D.getBColor())); + cairo_set_source_rgb(mpRT, aHairlineColor.getRed(), aHairlineColor.getGreen(), + aHairlineColor.getBlue()); + + const double fDiscreteLineWidth((getViewInformation2D().getInverseObjectToViewTransformation() + * basegfx::B2DVector(1.44, 0.0)) + .getLength()); + cairo_set_line_width(mpRT, fDiscreteLineWidth); + + const basegfx::B2DRange& rRange(rLineRectanglePrimitive2D.getB2DRange()); + cairo_rectangle(mpRT, rRange.getMinX(), rRange.getMinY(), rRange.getWidth(), + rRange.getHeight()); + cairo_stroke(mpRT); + + cairo_restore(mpRT); +} + +void CairoPixelProcessor2D::processFilledRectanglePrimitive2D( + const primitive2d::FilledRectanglePrimitive2D& rFilledRectanglePrimitive2D) +{ + if (rFilledRectanglePrimitive2D.getB2DRange().isEmpty()) + { + // no geometry, done + return; + } + + cairo_save(mpRT); + + cairo_matrix_t aMatrix; + const double fAAOffset(getViewInformation2D().getUseAntiAliasing() ? 0.5 : 0.0); + const basegfx::B2DHomMatrix& rObjectToView( + getViewInformation2D().getObjectToViewTransformation()); + cairo_matrix_init(&aMatrix, rObjectToView.a(), rObjectToView.b(), rObjectToView.c(), + rObjectToView.d(), rObjectToView.e() + fAAOffset, + rObjectToView.f() + fAAOffset); + + // set linear transformation + cairo_set_matrix(mpRT, &aMatrix); + + const basegfx::BColor aFillColor( + maBColorModifierStack.getModifiedColor(rFilledRectanglePrimitive2D.getBColor())); + cairo_set_source_rgb(mpRT, aFillColor.getRed(), aFillColor.getGreen(), aFillColor.getBlue()); + + const basegfx::B2DRange& rRange(rFilledRectanglePrimitive2D.getB2DRange()); + cairo_rectangle(mpRT, rRange.getMinX(), rRange.getMinY(), rRange.getWidth(), + rRange.getHeight()); + cairo_fill(mpRT); + + cairo_restore(mpRT); +} + +void CairoPixelProcessor2D::processSingleLinePrimitive2D( + const primitive2d::SingleLinePrimitive2D& rSingleLinePrimitive2D) +{ + cairo_save(mpRT); + + const basegfx::BColor aLineColor( + maBColorModifierStack.getModifiedColor(rSingleLinePrimitive2D.getBColor())); + cairo_set_source_rgb(mpRT, aLineColor.getRed(), aLineColor.getGreen(), aLineColor.getBlue()); + + const double fAAOffset(getViewInformation2D().getUseAntiAliasing() ? 0.5 : 0.0); + const basegfx::B2DHomMatrix& rObjectToView( + getViewInformation2D().getObjectToViewTransformation()); + const basegfx::B2DPoint aStart(rObjectToView * rSingleLinePrimitive2D.getStart()); + const basegfx::B2DPoint aEnd(rObjectToView * rSingleLinePrimitive2D.getEnd()); + + cairo_set_line_width(mpRT, 1.44f); + + cairo_move_to(mpRT, aStart.getX() + fAAOffset, aStart.getY() + fAAOffset); + cairo_line_to(mpRT, aEnd.getX() + fAAOffset, aEnd.getY() + fAAOffset); + cairo_stroke(mpRT); + + cairo_restore(mpRT); +} + void CairoPixelProcessor2D::processBasePrimitive2D(const primitive2d::BasePrimitive2D& rCandidate) { switch (rCandidate.getPrimitive2DID()) @@ -706,6 +804,24 @@ void CairoPixelProcessor2D::processBasePrimitive2D(const primitive2d::BasePrimit static_cast<const primitive2d::PolygonStrokePrimitive2D&>(rCandidate)); break; } + case PRIMITIVE2D_ID_LINERECTANGLEPRIMITIVE2D: + { + processLineRectanglePrimitive2D( + static_cast<const primitive2d::LineRectanglePrimitive2D&>(rCandidate)); + break; + } + case PRIMITIVE2D_ID_FILLEDRECTANGLEPRIMITIVE2D: + { + processFilledRectanglePrimitive2D( + static_cast<const primitive2d::FilledRectanglePrimitive2D&>(rCandidate)); + break; + } + case PRIMITIVE2D_ID_SINGLELINEPRIMITIVE2D: + { + processSingleLinePrimitive2D( + static_cast<const primitive2d::SingleLinePrimitive2D&>(rCandidate)); + break; + } // continue with decompose default: diff --git a/drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx b/drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx index e2657d9cf677..6edce17ee5ed 100644 --- a/drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx +++ b/drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx @@ -1478,8 +1478,7 @@ void D2DPixelProcessor2D::processPolygonStrokePrimitive2D( const double fDiscreteLineWidth( bHairline ? 1.0 - : basegfx::B2DVector(rObjectToView * basegfx::B2DVector(rLineAttribute.getWidth(), 0.0)) - .getLength()); + : (rObjectToView * basegfx::B2DVector(rLineAttribute.getWidth(), 0.0)).getLength()); // Here for every combination which the system-specific implementation is not // capable of visualizing, use the (for decomposable Primitives always possible) @@ -1701,8 +1700,8 @@ void D2DPixelProcessor2D::processLineRectanglePrimitive2D( const D2D1_RECT_F rect = { rRange.getMinX(), rRange.getMinY(), rRange.getMaxX(), rRange.getMaxY() }; const double fDiscreteLineWidth( - basegfx::B2DVector(getViewInformation2D().getInverseObjectToViewTransformation() - * basegfx::B2DVector(1.44, 0.0)) + (getViewInformation2D().getInverseObjectToViewTransformation() + * basegfx::B2DVector(1.44, 0.0)) .getLength()); getRenderTarget().DrawRectangle(&rect, pColorBrush, fDiscreteLineWidth); diff --git a/include/drawinglayer/processor2d/cairopixelprocessor2d.hxx b/include/drawinglayer/processor2d/cairopixelprocessor2d.hxx index 326d649da330..c940039abb66 100644 --- a/include/drawinglayer/processor2d/cairopixelprocessor2d.hxx +++ b/include/drawinglayer/processor2d/cairopixelprocessor2d.hxx @@ -30,6 +30,9 @@ class TransformPrimitive2D; class PointArrayPrimitive2D; class MarkerArrayPrimitive2D; class PolygonStrokePrimitive2D; +class LineRectanglePrimitive2D; +class FilledRectanglePrimitive2D; +class SingleLinePrimitive2D; } namespace drawinglayer::processor2d @@ -47,38 +50,29 @@ class DRAWINGLAYER_DLLPUBLIC CairoPixelProcessor2D : public BaseProcessor2D const primitive2d::PolygonHairlinePrimitive2D& rPolygonHairlinePrimitive2D); void processPolyPolygonColorPrimitive2D( const primitive2d::PolyPolygonColorPrimitive2D& rPolyPolygonColorPrimitive2D); -#if 0 void processBitmapPrimitive2D(const primitive2d::BitmapPrimitive2D& rBitmapCandidate); -#endif void processTransparencePrimitive2D(const primitive2d::TransparencePrimitive2D& rTransCandidate); -#if 0 void processUnifiedTransparencePrimitive2D( const primitive2d::UnifiedTransparencePrimitive2D& rTransCandidate); -#endif void processMaskPrimitive2DPixel(const primitive2d::MaskPrimitive2D& rMaskCandidate); void processModifiedColorPrimitive2D( const primitive2d::ModifiedColorPrimitive2D& rModifiedCandidate); void processTransformPrimitive2D(const primitive2d::TransformPrimitive2D& rTransformCandidate); void processPointArrayPrimitive2D(const primitive2d::PointArrayPrimitive2D& rPointArrayCandidate); -#if 0 void processMarkerArrayPrimitive2D(const primitive2d::MarkerArrayPrimitive2D& rMarkerArrayCandidate); void processBackgroundColorPrimitive2D( const primitive2d::BackgroundColorPrimitive2D& rBackgroundColorCandidate); -#endif void processPolygonStrokePrimitive2D( const primitive2d::PolygonStrokePrimitive2D& rPolygonStrokeCandidate); -#if 0 - // common helpers - ID2D1Bitmap* implCreateAlpha_Direct(const primitive2d::TransparencePrimitive2D& rTransCandidate, - const basegfx::B2DRange& rVisibleRange); - ID2D1Bitmap* - implCreateAlpha_B2DBitmap(const primitive2d::TransparencePrimitive2D& rTransCandidate, - const basegfx::B2DRange& rVisibleRange, - D2D1_MATRIX_3X2_F& rMaskScale); -#endif + void processLineRectanglePrimitive2D( + const primitive2d::LineRectanglePrimitive2D& rLineRectanglePrimitive2D); + void processFilledRectanglePrimitive2D( + const primitive2d::FilledRectanglePrimitive2D& rFilledRectanglePrimitive2D); + void + processSingleLinePrimitive2D(const primitive2d::SingleLinePrimitive2D& rSingleLinePrimitive2D); /* the local processor for BasePrimitive2D-Implementation based primitives, called from the common process()-implementation
