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

Reply via email to