vcl/unx/gtk3/gtkinst.cxx |   71 ++++++++++++++++++++++++++++-------------------
 1 file changed, 43 insertions(+), 28 deletions(-)

New commits:
commit c57959a8efadf5c6a4a6c9a4f1fa4e482a45919c
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Tue May 25 20:36:27 2021 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Wed May 26 09:43:51 2021 +0200

    gtk4: reenable Image
    
    this is possibly wrong wrt scaling/hidpi, something of a stopgap
    for now anyway I feel
    
    Change-Id: Ia0e4bbdf760d7577c304f489795005f7252eb57b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/116131
    Tested-by: Caolán McNamara <caol...@redhat.com>
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 1ed1c0afc396..68f0367b9102 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -3971,13 +3971,13 @@ namespace
         return pixbuf;
     }
 
-    GtkWidget* image_new_from_virtual_device(const VirtualDevice& 
rImageSurface)
+#if GTK_CHECK_VERSION(4, 0, 0)
+    GdkTexture* texture_new_from_virtual_device(const VirtualDevice& 
rImageSurface)
     {
-        GtkWidget* pImage = nullptr;
         cairo_surface_t* surface = get_underlying_cairo_surface(rImageSurface);
 
         Size aSize(rImageSurface.GetOutputSizePixel());
-#if GTK_CHECK_VERSION(4, 0, 0)
+
         double x_scale(1.0), y_scale(1.0);
         cairo_surface_get_device_scale(surface, &x_scale, &y_scale);
         cairo_surface_t* target = cairo_surface_create_similar_image(surface,
@@ -3985,17 +3985,12 @@ namespace
                                                                      
aSize.Width() * x_scale,
                                                                      
aSize.Height() * y_scale);
         cairo_surface_set_device_scale(target, x_scale, y_scale);
-#else
-        cairo_surface_t* target = cairo_surface_create_similar(surface,
-                                                               
cairo_surface_get_content(surface),
-                                                               aSize.Width(),
-                                                               aSize.Height());
-#endif
+
         cairo_t* cr = cairo_create(target);
         cairo_set_source_surface(cr, surface, 0, 0);
         cairo_paint(cr);
         cairo_destroy(cr);
-#if GTK_CHECK_VERSION(4, 0, 0)
+
         GBytes* bytes = 
g_bytes_new_with_free_func(cairo_image_surface_get_data(target),
                                                    
cairo_image_surface_get_height(target) *
                                                    
cairo_image_surface_get_stride(target),
@@ -4010,13 +4005,46 @@ namespace
 
         g_bytes_unref (bytes);
 
-        pImage = gtk_image_new_from_paintable(GDK_PAINTABLE(texture));
+        cairo_surface_destroy(target);
+
+        return texture;
+    }
+
+    GtkWidget* image_new_from_virtual_device(const VirtualDevice& 
rImageSurface)
+    {
+        GdkTexture* texture = texture_new_from_virtual_device(rImageSurface);
+        return gtk_image_new_from_paintable(GDK_PAINTABLE(texture));
+    }
 #else
+    GtkWidget* image_new_from_virtual_device(const VirtualDevice& 
rImageSurface)
+    {
+        GtkWidget* pImage = nullptr;
+        cairo_surface_t* surface = get_underlying_cairo_surface(rImageSurface);
+
+        Size aSize(rImageSurface.GetOutputSizePixel());
+        cairo_surface_t* target = cairo_surface_create_similar(surface,
+                                                               
cairo_surface_get_content(surface),
+                                                               aSize.Width(),
+                                                               aSize.Height());
+        cairo_t* cr = cairo_create(target);
+        cairo_set_source_surface(cr, surface, 0, 0);
+        cairo_paint(cr);
+        cairo_destroy(cr);
+
         pImage = gtk_image_new_from_surface(target);
-#endif
         cairo_surface_destroy(target);
         return pImage;
     }
+#endif
+
+    void image_set_from_virtual_device(GtkImage* pImage, const VirtualDevice* 
pDevice)
+    {
+#if GTK_CHECK_VERSION(4, 0, 0)
+        gtk_image_set_from_paintable(pImage, pDevice ? 
GDK_PAINTABLE(texture_new_from_virtual_device(*pDevice)) : nullptr);
+#else
+        gtk_image_set_from_surface(pImage, pDevice ? 
get_underlying_cairo_surface(*pDevice) : nullptr);
+#endif
+    }
 
 #if !GTK_CHECK_VERSION(4, 0, 0)
 class MenuHelper
@@ -8781,10 +8809,7 @@ public:
     virtual void set_image(VirtualDevice* pDevice) override
     {
         ensure_image_widget();
-        if (pDevice)
-            gtk_image_set_from_surface(m_pImage, 
get_underlying_cairo_surface(*pDevice));
-        else
-            gtk_image_set_from_surface(m_pImage, nullptr);
+        image_set_from_virtual_device(m_pImage, pDevice);
     }
 
     virtual void set_image(const css::uno::Reference<css::graphic::XGraphic>& 
rImage) override
@@ -8797,7 +8822,7 @@ public:
             g_object_unref(pixbuf);
         }
         else
-            gtk_image_set_from_surface(m_pImage, nullptr);
+            image_set_from_virtual_device(m_pImage, nullptr);
     }
 
     virtual void insert_item(int pos, const OUString& rId, const OUString& 
rStr,
@@ -10332,7 +10357,6 @@ public:
     }
 };
 
-#if !GTK_CHECK_VERSION(4, 0, 0)
 class GtkInstanceImage : public GtkInstanceWidget, public virtual weld::Image
 {
 private:
@@ -10356,10 +10380,7 @@ public:
 
     virtual void set_image(VirtualDevice* pDevice) override
     {
-        if (pDevice)
-            gtk_image_set_from_surface(m_pImage, 
get_underlying_cairo_surface(*pDevice));
-        else
-            gtk_image_set_from_surface(m_pImage, nullptr);
+        image_set_from_virtual_device(m_pImage, pDevice);
     }
 
     virtual void set_image(const css::uno::Reference<css::graphic::XGraphic>& 
rImage) override
@@ -10370,7 +10391,6 @@ public:
             g_object_unref(pixbuf);
     }
 };
-#endif
 
 class GtkInstanceCalendar : public GtkInstanceWidget, public virtual 
weld::Calendar
 {
@@ -19444,16 +19464,11 @@ public:
 
     virtual std::unique_ptr<weld::Image> weld_image(const OString &id) override
     {
-#if !GTK_CHECK_VERSION(4, 0, 0)
         GtkImage* pImage = GTK_IMAGE(gtk_builder_get_object(m_pBuilder, 
id.getStr()));
         if (!pImage)
             return nullptr;
         auto_add_parentless_widgets_to_container(GTK_WIDGET(pImage));
         return std::make_unique<GtkInstanceImage>(pImage, this, false);
-#else
-        (void)id;
-        return nullptr;
-#endif
     }
 
     virtual std::unique_ptr<weld::Calendar> weld_calendar(const OString &id) 
override
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to