vcl/headless/CairoCommon.cxx                    |   47 +++++++++++++++++
 vcl/headless/SvpGraphicsBackend.cxx             |   41 +-------------
 vcl/inc/headless/CairoCommon.hxx                |    5 +
 vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx |   26 +++++++++
 vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx |    4 +
 vcl/unx/generic/gdi/gdiimpl.cxx                 |   66 ------------------------
 vcl/unx/generic/gdi/gdiimpl.hxx                 |    8 --
 7 files changed, 89 insertions(+), 108 deletions(-)

New commits:
commit 00b62877fa2f900d1c2dcf7b721f7a956408f8a0
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Wed Jan 4 20:20:36 2023 +0000
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Thu Jan 5 10:50:36 2023 +0000

    move getPixel into CairoCommon and reuse from X11CairoSalGraphicsImpl
    
    Change-Id: I5401cc87ec228d52d98fc65840f875cfb55e30c5
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145052
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/vcl/headless/CairoCommon.cxx b/vcl/headless/CairoCommon.cxx
index 5781eff048e8..39538a9f9f40 100644
--- a/vcl/headless/CairoCommon.cxx
+++ b/vcl/headless/CairoCommon.cxx
@@ -623,6 +623,39 @@ void CairoCommon::drawPixel(cairo_t* cr, 
basegfx::B2DRange* pExtents, const Colo
         *pExtents = getClippedFillDamage(cr);
 }
 
+Color CairoCommon::getPixel(cairo_surface_t* pSurface, tools::Long nX, 
tools::Long nY)
+{
+    cairo_surface_t* target
+        = cairo_surface_create_similar_image(pSurface, CAIRO_FORMAT_ARGB32, 1, 
1);
+
+    cairo_t* cr = cairo_create(target);
+
+    cairo_rectangle(cr, 0, 0, 1, 1);
+    cairo_set_source_surface(cr, pSurface, -nX, -nY);
+    cairo_paint(cr);
+    cairo_destroy(cr);
+
+    cairo_surface_flush(target);
+#if !ENABLE_WASM_STRIP_PREMULTIPLY
+    vcl::bitmap::lookup_table const& unpremultiply_table = 
vcl::bitmap::get_unpremultiply_table();
+#endif
+    unsigned char* data = cairo_image_surface_get_data(target);
+    sal_uInt8 a = data[SVP_CAIRO_ALPHA];
+#if ENABLE_WASM_STRIP_PREMULTIPLY
+    sal_uInt8 b = vcl::bitmap::unpremultiply(a, data[SVP_CAIRO_BLUE]);
+    sal_uInt8 g = vcl::bitmap::unpremultiply(a, data[SVP_CAIRO_GREEN]);
+    sal_uInt8 r = vcl::bitmap::unpremultiply(a, data[SVP_CAIRO_RED]);
+#else
+    sal_uInt8 b = unpremultiply_table[a][data[SVP_CAIRO_BLUE]];
+    sal_uInt8 g = unpremultiply_table[a][data[SVP_CAIRO_GREEN]];
+    sal_uInt8 r = unpremultiply_table[a][data[SVP_CAIRO_RED]];
+#endif
+    Color aColor(ColorAlpha, a, r, g, b);
+    cairo_surface_destroy(target);
+
+    return aColor;
+}
+
 void CairoCommon::drawLine(cairo_t* cr, basegfx::B2DRange* pExtents, const 
Color& rLineColor,
                            bool bAntiAlias, tools::Long nX1, tools::Long nY1, 
tools::Long nX2,
                            tools::Long nY2)
diff --git a/vcl/headless/SvpGraphicsBackend.cxx 
b/vcl/headless/SvpGraphicsBackend.cxx
index 84d6aa1dcd09..efff52387575 100644
--- a/vcl/headless/SvpGraphicsBackend.cxx
+++ b/vcl/headless/SvpGraphicsBackend.cxx
@@ -566,35 +566,7 @@ void SvpGraphicsBackend::drawBitmapBuffer(const 
SalTwoRect& rTR, const BitmapBuf
 
 Color SvpGraphicsBackend::getPixel(tools::Long nX, tools::Long nY)
 {
-    cairo_surface_t* target
-        = cairo_surface_create_similar_image(m_rCairoCommon.m_pSurface, 
CAIRO_FORMAT_ARGB32, 1, 1);
-
-    cairo_t* cr = cairo_create(target);
-
-    cairo_rectangle(cr, 0, 0, 1, 1);
-    cairo_set_source_surface(cr, m_rCairoCommon.m_pSurface, -nX, -nY);
-    cairo_paint(cr);
-    cairo_destroy(cr);
-
-    cairo_surface_flush(target);
-#if !ENABLE_WASM_STRIP_PREMULTIPLY
-    vcl::bitmap::lookup_table const& unpremultiply_table = 
vcl::bitmap::get_unpremultiply_table();
-#endif
-    unsigned char* data = cairo_image_surface_get_data(target);
-    sal_uInt8 a = data[SVP_CAIRO_ALPHA];
-#if ENABLE_WASM_STRIP_PREMULTIPLY
-    sal_uInt8 b = vcl::bitmap::unpremultiply(a, data[SVP_CAIRO_BLUE]);
-    sal_uInt8 g = vcl::bitmap::unpremultiply(a, data[SVP_CAIRO_GREEN]);
-    sal_uInt8 r = vcl::bitmap::unpremultiply(a, data[SVP_CAIRO_RED]);
-#else
-    sal_uInt8 b = unpremultiply_table[a][data[SVP_CAIRO_BLUE]];
-    sal_uInt8 g = unpremultiply_table[a][data[SVP_CAIRO_GREEN]];
-    sal_uInt8 r = unpremultiply_table[a][data[SVP_CAIRO_RED]];
-#endif
-    Color aColor(ColorAlpha, a, r, g, b);
-    cairo_surface_destroy(target);
-
-    return aColor;
+    return CairoCommon::getPixel(m_rCairoCommon.m_pSurface, nX, nY);
 }
 
 void SvpGraphicsBackend::invert(tools::Long nX, tools::Long nY, tools::Long 
nWidth,
diff --git a/vcl/inc/headless/CairoCommon.hxx b/vcl/inc/headless/CairoCommon.hxx
index 743c962c9423..3e78b435dbc5 100644
--- a/vcl/inc/headless/CairoCommon.hxx
+++ b/vcl/inc/headless/CairoCommon.hxx
@@ -155,6 +155,8 @@ struct VCL_DLLPUBLIC CairoCommon
     static void drawPixel(cairo_t* cr, basegfx::B2DRange* pExtents, const 
Color& rLineColor,
                           tools::Long nX, tools::Long nY);
 
+    static Color getPixel(cairo_surface_t* pSurface, tools::Long nX, 
tools::Long nY);
+
     static void drawLine(cairo_t* cr, basegfx::B2DRange* pExtents, const 
Color& rLineColor,
                          bool bAntiAlias, tools::Long nX1, tools::Long nY1, 
tools::Long nX2,
                          tools::Long nY2);
diff --git a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx 
b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx
index f1b7f172150b..b8cf58b16125 100644
--- a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx
+++ b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx
@@ -140,6 +140,17 @@ void X11CairoSalGraphicsImpl::drawPixel(tools::Long nX, 
tools::Long nY, Color nC
     X11Common::releaseCairoContext(cr);
 }
 
+Color X11CairoSalGraphicsImpl::getPixel(tools::Long nX, tools::Long nY)
+{
+    cairo_t* cr = mrX11Common.getCairoContext();
+
+    Color aRet = CairoCommon::getPixel(cairo_get_target(cr), nX, nY);
+
+    X11Common::releaseCairoContext(cr);
+
+    return aRet;
+}
+
 void X11CairoSalGraphicsImpl::drawLine(tools::Long nX1, tools::Long nY1, 
tools::Long nX2,
                                        tools::Long nY2)
 {
diff --git a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx 
b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx
index 7462089ab29f..314e441aaac6 100644
--- a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx
+++ b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx
@@ -78,6 +78,7 @@ public:
 
     void drawPixel(tools::Long nX, tools::Long nY) override;
     void drawPixel(tools::Long nX, tools::Long nY, Color nColor) override;
+    Color getPixel(tools::Long nX, tools::Long nY) override;
 
     void drawLine(tools::Long nX1, tools::Long nY1, tools::Long nX2, 
tools::Long nY2) override;
 
diff --git a/vcl/unx/generic/gdi/gdiimpl.cxx b/vcl/unx/generic/gdi/gdiimpl.cxx
index 68d44afdb684..9f9f45afb4ad 100644
--- a/vcl/unx/generic/gdi/gdiimpl.cxx
+++ b/vcl/unx/generic/gdi/gdiimpl.cxx
@@ -1789,40 +1789,6 @@ bool X11SalGraphicsImpl::drawPolyLine(
     return bDrawnOk;
 }
 
-Color X11SalGraphicsImpl::getPixel( tools::Long nX, tools::Long nY )
-{
-    if( mrParent.bWindow_ && !mrParent.bVirDev_ )
-    {
-        XWindowAttributes aAttrib;
-
-        XGetWindowAttributes( mrParent.GetXDisplay(), mrParent.GetDrawable(), 
&aAttrib );
-        if( aAttrib.map_state != IsViewable )
-        {
-            SAL_WARN( "vcl", "X11SalGraphics::GetPixel drawable not viewable" 
);
-            return 0;
-        }
-    }
-
-    XImage *pXImage = XGetImage( mrParent.GetXDisplay(),
-                                     mrParent.GetDrawable(),
-                                 nX, nY,
-                                 1,  1,
-                                 AllPlanes,
-                                 ZPixmap );
-    if( !pXImage )
-    {
-        SAL_WARN( "vcl", "X11SalGraphics::GetPixel !XGetImage()" );
-        return 0;
-    }
-
-    XColor aXColor;
-
-    aXColor.pixel = XGetPixel( pXImage, 0, 0 );
-    XDestroyImage( pXImage );
-
-    return mrParent.GetColormap().GetColor( aXColor.pixel );
-}
-
 std::shared_ptr<SalBitmap> X11SalGraphicsImpl::getBitmap( tools::Long nX, 
tools::Long nY, tools::Long nDX, tools::Long nDY )
 {
     bool bFakeWindowBG = false;
diff --git a/vcl/unx/generic/gdi/gdiimpl.hxx b/vcl/unx/generic/gdi/gdiimpl.hxx
index 0963a85892cd..4f9a96d7177a 100644
--- a/vcl/unx/generic/gdi/gdiimpl.hxx
+++ b/vcl/unx/generic/gdi/gdiimpl.hxx
@@ -214,8 +214,6 @@ public:
 
     virtual std::shared_ptr<SalBitmap> getBitmap( tools::Long nX, tools::Long 
nY, tools::Long nWidth, tools::Long nHeight ) override;
 
-    virtual Color getPixel( tools::Long nX, tools::Long nY ) override;
-
     // invert --> ClipRegion (only Windows or VirDevs)
     virtual void invert(
                 tools::Long nX, tools::Long nY,
commit 39038ed8dac3d896d261a76e11f9004f7d68f989
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Wed Jan 4 20:02:38 2023 +0000
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Thu Jan 5 10:50:25 2023 +0000

    move drawPixel into CairoCommon and reuse from X11CairoSalGraphicsImpl
    
    Change-Id: I0638403ab54039793e851583937b09674f05c36d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145051
    Tested-by: Caolán McNamara <caol...@redhat.com>
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/vcl/headless/CairoCommon.cxx b/vcl/headless/CairoCommon.cxx
index 9f890067b7e9..5781eff048e8 100644
--- a/vcl/headless/CairoCommon.cxx
+++ b/vcl/headless/CairoCommon.cxx
@@ -609,6 +609,20 @@ void CairoCommon::clipRegion(cairo_t* cr, const 
vcl::Region& rClipRegion)
 
 void CairoCommon::clipRegion(cairo_t* cr) { CairoCommon::clipRegion(cr, 
m_aClipRegion); }
 
+void CairoCommon::drawPixel(cairo_t* cr, basegfx::B2DRange* pExtents, const 
Color& rLineColor,
+                            tools::Long nX, tools::Long nY)
+{
+    if (rLineColor == SALCOLOR_NONE)
+        return;
+
+    cairo_rectangle(cr, nX, nY, 1, 1);
+    CairoCommon::applyColor(cr, rLineColor, 0.0);
+    cairo_fill(cr);
+
+    if (pExtents)
+        *pExtents = getClippedFillDamage(cr);
+}
+
 void CairoCommon::drawLine(cairo_t* cr, basegfx::B2DRange* pExtents, const 
Color& rLineColor,
                            bool bAntiAlias, tools::Long nX1, tools::Long nY1, 
tools::Long nX2,
                            tools::Long nY2)
diff --git a/vcl/headless/SvpGraphicsBackend.cxx 
b/vcl/headless/SvpGraphicsBackend.cxx
index b1920f576d81..84d6aa1dcd09 100644
--- a/vcl/headless/SvpGraphicsBackend.cxx
+++ b/vcl/headless/SvpGraphicsBackend.cxx
@@ -100,22 +100,17 @@ void SvpGraphicsBackend::SetROPFillColor(SalROPColor 
nROPColor)
 
 void SvpGraphicsBackend::drawPixel(tools::Long nX, tools::Long nY)
 {
-    if (m_rCairoCommon.m_aLineColor != SALCOLOR_NONE)
-    {
-        drawPixel(nX, nY, m_rCairoCommon.m_aLineColor);
-    }
+    drawPixel(nX, nY, m_rCairoCommon.m_aLineColor);
 }
 
 void SvpGraphicsBackend::drawPixel(tools::Long nX, tools::Long nY, Color 
aColor)
 {
     cairo_t* cr = m_rCairoCommon.getCairoContext(true, getAntiAlias());
+    basegfx::B2DRange extents;
     m_rCairoCommon.clipRegion(cr);
 
-    cairo_rectangle(cr, nX, nY, 1, 1);
-    CairoCommon::applyColor(cr, aColor, 0.0);
-    cairo_fill(cr);
+    CairoCommon::drawPixel(cr, &extents, aColor, nX, nY);
 
-    basegfx::B2DRange extents = getClippedFillDamage(cr);
     m_rCairoCommon.releaseCairoContext(cr, true, extents);
 }
 
diff --git a/vcl/inc/headless/CairoCommon.hxx b/vcl/inc/headless/CairoCommon.hxx
index 029060c31962..743c962c9423 100644
--- a/vcl/inc/headless/CairoCommon.hxx
+++ b/vcl/inc/headless/CairoCommon.hxx
@@ -152,6 +152,9 @@ struct VCL_DLLPUBLIC CairoCommon
     void clipRegion(cairo_t* cr);
     static void clipRegion(cairo_t* cr, const vcl::Region& rClipRegion);
 
+    static void drawPixel(cairo_t* cr, basegfx::B2DRange* pExtents, const 
Color& rLineColor,
+                          tools::Long nX, tools::Long nY);
+
     static void drawLine(cairo_t* cr, basegfx::B2DRange* pExtents, const 
Color& rLineColor,
                          bool bAntiAlias, tools::Long nX1, tools::Long nY1, 
tools::Long nX2,
                          tools::Long nY2);
diff --git a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx 
b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx
index 13156fc13295..f1b7f172150b 100644
--- a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx
+++ b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx
@@ -125,6 +125,21 @@ bool X11CairoSalGraphicsImpl::drawPolyPolygon(const 
basegfx::B2DHomMatrix& rObje
     return true;
 }
 
+void X11CairoSalGraphicsImpl::drawPixel(tools::Long nX, tools::Long nY)
+{
+    drawPixel(nX, nY, mnPenColor);
+}
+
+void X11CairoSalGraphicsImpl::drawPixel(tools::Long nX, tools::Long nY, Color 
nColor)
+{
+    cairo_t* cr = mrX11Common.getCairoContext();
+    clipRegion(cr);
+
+    CairoCommon::drawPixel(cr, nullptr, nColor, nX, nY);
+
+    X11Common::releaseCairoContext(cr);
+}
+
 void X11CairoSalGraphicsImpl::drawLine(tools::Long nX1, tools::Long nY1, 
tools::Long nX2,
                                        tools::Long nY2)
 {
diff --git a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx 
b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx
index 0b7bb51e2333..7462089ab29f 100644
--- a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx
+++ b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx
@@ -76,6 +76,9 @@ public:
 
     void clipRegion(cairo_t* cr) { CairoCommon::clipRegion(cr, maClipRegion); }
 
+    void drawPixel(tools::Long nX, tools::Long nY) override;
+    void drawPixel(tools::Long nX, tools::Long nY, Color nColor) override;
+
     void drawLine(tools::Long nX1, tools::Long nY1, tools::Long nX2, 
tools::Long nY2) override;
 
     bool drawPolyPolygon(const basegfx::B2DHomMatrix& rObjectToDevice,
diff --git a/vcl/unx/generic/gdi/gdiimpl.cxx b/vcl/unx/generic/gdi/gdiimpl.cxx
index b75a78fc002f..68d44afdb684 100644
--- a/vcl/unx/generic/gdi/gdiimpl.cxx
+++ b/vcl/unx/generic/gdi/gdiimpl.cxx
@@ -1087,40 +1087,12 @@ void X11SalGraphicsImpl::SetXORMode( bool bSet, bool )
     }
 }
 
-void X11SalGraphicsImpl::drawPixel( tools::Long nX, tools::Long nY )
+void X11SalGraphicsImpl::internalDrawPixel( tools::Long nX, tools::Long nY )
 {
     if( mnPenColor !=  SALCOLOR_NONE )
         XDrawPoint( mrParent.GetXDisplay(), mrParent.GetDrawable(), 
SelectPen(), nX, nY );
 }
 
-void X11SalGraphicsImpl::drawPixel( tools::Long nX, tools::Long nY, Color 
nColor )
-{
-    if( nColor == SALCOLOR_NONE )
-        return;
-
-    Display *pDisplay = mrParent.GetXDisplay();
-
-    if( (mnPenColor == SALCOLOR_NONE) && !mbPenGC )
-    {
-        SetLineColor( nColor );
-        XDrawPoint( pDisplay, mrParent.GetDrawable(), SelectPen(), nX, nY );
-        mnPenColor = SALCOLOR_NONE;
-        mbPenGC = False;
-    }
-    else
-    {
-        GC pGC = SelectPen();
-
-        if( nColor != mnPenColor )
-            XSetForeground( pDisplay, pGC, mrParent.GetPixel( nColor ) );
-
-        XDrawPoint( pDisplay, mrParent.GetDrawable(), pGC, nX, nY );
-
-        if( nColor != mnPenColor )
-            XSetForeground( pDisplay, pGC, mnPenPixel );
-    }
-}
-
 void X11SalGraphicsImpl::internalDrawLine( tools::Long nX1, tools::Long nY1, 
tools::Long nX2, tools::Long nY2 )
 {
     if( mnPenColor != SALCOLOR_NONE )
@@ -1172,7 +1144,7 @@ void X11SalGraphicsImpl::drawPolygon( sal_uInt32 nPoints, 
const Point* pPtAry )
         if( !mbXORMode )
         {
             if( 1 == nPoints  )
-                drawPixel( pPtAry[0].getX(), pPtAry[0].getY() );
+                internalDrawPixel( pPtAry[0].getX(), pPtAry[0].getY() );
             else
                 internalDrawLine( pPtAry[0].getX(), pPtAry[0].getY(),
                           pPtAry[1].getX(), pPtAry[1].getY() );
diff --git a/vcl/unx/generic/gdi/gdiimpl.hxx b/vcl/unx/generic/gdi/gdiimpl.hxx
index 033247685beb..0963a85892cd 100644
--- a/vcl/unx/generic/gdi/gdiimpl.hxx
+++ b/vcl/unx/generic/gdi/gdiimpl.hxx
@@ -102,7 +102,7 @@ private:
                                               const SalBitmap& 
rTransparentBitmap );
 
     void internalDrawPolyLine( sal_uInt32 nPoints, const Point* pPtAry, bool 
bClose );
-
+    void internalDrawPixel( tools::Long nX, tools::Long nY );
     void internalDrawLine( tools::Long nX1, tools::Long nY1, tools::Long nX2, 
tools::Long nY2 );
 
 public:
@@ -149,10 +149,6 @@ public:
     // set fill color for raster operations
     virtual void SetROPFillColor( SalROPColor nROPColor ) override;
 
-    // draw --> LineColor and FillColor and RasterOp and ClipRegion
-    virtual void drawPixel( tools::Long nX, tools::Long nY ) override;
-    virtual void drawPixel( tools::Long nX, tools::Long nY, Color nColor ) 
override;
-
     virtual void drawRect( tools::Long nX, tools::Long nY, tools::Long nWidth, 
tools::Long nHeight ) override;
 
     virtual void drawPolyLine( sal_uInt32 nPoints, const Point* pPtAry ) 
override;

Reply via email to