vcl/unx/gtk3/gtkinst.cxx             |   11 +++++++++++
 vcl/unx/gtk4/surfacecellrenderer.cxx |   32 ++++++++++++++++++++++----------
 2 files changed, 33 insertions(+), 10 deletions(-)

New commits:
commit 01cb63b986d0879e10b58991959e0989b125b577
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Tue Apr 12 17:44:57 2022 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Tue Apr 12 20:58:47 2022 +0200

    gtk4: GtkCellRendererPixbuf no longer takes a surface
    
    so use our own replacement when we want to continue to use a cairo_surface
    
    Change-Id: I4a1a0e7f5a86d27a4290cf71c0719ea017be3f0b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132930
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index a3449e02c3cb..4d6679a31ef7 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -19189,6 +19189,7 @@ public:
         SAL_WARN_IF(!m_pMenuWindow, "vcl.gtk", "GtkInstanceComboBox: couldn't 
find popup menu");
 
         bool bHasEntry = gtk_combo_box_get_has_entry(m_pComboBox);
+        bool bPixbufUsedSurface = gtk_tree_model_get_n_columns(m_pTreeModel) 
== 4;
 
         bool bFindButtonTextRenderer = !bHasEntry;
         GtkCellLayout* pCellLayout = GTK_CELL_LAYOUT(m_pComboBox);
@@ -19206,6 +19207,16 @@ public:
             }
         }
 
+        // Seeing as GtkCellRendererPixbuf no longer takes a surface, then 
insert our own replacement
+        // to render that instead here
+        if (bPixbufUsedSurface)
+        {
+            GtkCellRenderer* pSurfaceRenderer = surface_cell_renderer_new();
+            gtk_cell_layout_pack_start(pCellLayout, pSurfaceRenderer, false);
+            gtk_cell_layout_reorder(pCellLayout, pSurfaceRenderer, 0);
+            gtk_cell_layout_set_attributes(pCellLayout, pSurfaceRenderer, 
"surface", 3, nullptr);
+        }
+
         if (bHasEntry)
         {
             m_bAutoComplete = true;
diff --git a/vcl/unx/gtk4/surfacecellrenderer.cxx 
b/vcl/unx/gtk4/surfacecellrenderer.cxx
index f8015bb110b2..2ae0782b984c 100644
--- a/vcl/unx/gtk4/surfacecellrenderer.cxx
+++ b/vcl/unx/gtk4/surfacecellrenderer.cxx
@@ -165,6 +165,17 @@ GtkCellRenderer* surface_cell_renderer_new()
     return GTK_CELL_RENDERER(g_object_new(SURFACE_TYPE_CELL_RENDERER, 
nullptr));
 }
 
+static void get_surface_size(cairo_surface_t* pSurface, int& rWidth, int& 
rHeight)
+{
+    double x1, x2, y1, y2;
+    cairo_t* cr = cairo_create(pSurface);
+    cairo_clip_extents(cr, &x1, &y1, &x2, &y2);
+    cairo_destroy(cr);
+
+    rWidth = x2 - x1;
+    rHeight = y2 - y1;
+}
+
 bool surface_cell_renderer_get_preferred_size(GtkCellRenderer* cell, 
GtkOrientation orientation,
                                               gint* minimum_size, gint* 
natural_size)
 {
@@ -174,15 +185,7 @@ bool 
surface_cell_renderer_get_preferred_size(GtkCellRenderer* cell, GtkOrientat
     int nHeight = 0;
 
     if (cellsurface->surface)
-    {
-        double x1, x2, y1, y2;
-        cairo_t* cr = cairo_create(cellsurface->surface);
-        cairo_clip_extents(cr, &x1, &y1, &x2, &y2);
-        cairo_destroy(cr);
-
-        nWidth = x2 - x1;
-        nHeight = y2 - y1;
-    }
+        get_surface_size(cellsurface->surface, nWidth, nHeight);
 
     if (orientation == GTK_ORIENTATION_HORIZONTAL)
     {
@@ -209,7 +212,16 @@ void surface_cell_renderer_render(GtkCellRenderer* cell, 
cairo_t* cr, GtkWidget*
                                   const GdkRectangle* cell_area, 
GtkCellRendererState /*flags*/)
 {
     SurfaceCellRenderer* cellsurface = SURFACE_CELL_RENDERER(cell);
-    cairo_set_source_surface(cr, cellsurface->surface, cell_area->x, 
cell_area->y);
+    if (!cellsurface->surface)
+        return;
+
+    int nWidth, nHeight;
+    get_surface_size(cellsurface->surface, nWidth, nHeight);
+    int nXOffset = (cell_area->width - nWidth) / 2;
+    int nYOffset = (cell_area->height - nHeight) / 2;
+
+    cairo_set_source_surface(cr, cellsurface->surface, cell_area->x + nXOffset,
+                             cell_area->y + nYOffset);
     cairo_paint(cr);
 }
 

Reply via email to