[Libreoffice-commits] core.git: vcl/unx

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Wed Jan 9 21:13:01 UTC 2019


 vcl/unx/gtk3/gtk3gtkinst.cxx |   62 ++++++++++++++++++++++++++-----------------
 1 file changed, 38 insertions(+), 24 deletions(-)

New commits:
commit f22f28e722a8a2efdc42bddba80a3a43025a61fd
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Wed Jan 9 11:34:45 2019 +0000
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Wed Jan 9 22:12:29 2019 +0100

    Related: tdf#122527 gtk < 3.20 and gtk_image_new_from_surface
    
    seems to be a problem
    
    Change-Id: I2aac780a44ce392372af9f688cde594d67fea3df
    Reviewed-on: https://gerrit.libreoffice.org/66013
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index a589b2af38b6..c914191e33db 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -1747,6 +1747,35 @@ namespace
         cairo_surface_get_device_scale(surface, &m_fXScale, &m_fYScale);
         return gdk_pixbuf_get_from_surface(surface, 0, 0, aSize.Width() * m_fXScale, aSize.Height() * m_fYScale);
     }
+
+    GtkWidget* image_new_from_virtual_device(VirtualDevice& rImageSurface)
+    {
+        GtkWidget* pImage = nullptr;
+        if (gtk_check_version(3, 20, 0) == 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);
+            cairo_surface_destroy(target);
+        }
+        else
+        {
+            GdkPixbuf* pixbuf = load_icon_from_surface(rImageSurface);
+            pImage = gtk_image_new_from_pixbuf(pixbuf);
+            g_object_unref(pixbuf);
+        }
+        return pImage;
+    }
 }
 
 class MenuHelper
@@ -1809,7 +1838,7 @@ public:
     }
 
     void insert_item(int pos, const OUString& rId, const OUString& rStr,
-                     const OUString* pIconName, VirtualDevice* pImageSufface,
+                     const OUString* pIconName, VirtualDevice* pImageSurface,
                      bool bCheck)
     {
         GtkWidget* pImage = nullptr;
@@ -1822,8 +1851,8 @@ public:
                 g_object_unref(pixbuf);
             }
         }
-        else if (pImageSufface)
-            pImage = gtk_image_new_from_surface(get_underlying_cairo_surface(*pImageSufface));
+        else if (pImageSurface)
+            pImage = image_new_from_virtual_device(*pImageSurface);
 
         GtkWidget *pItem;
         if (pImage)
@@ -3625,7 +3654,7 @@ public:
         gtk_button_set_always_show_image(m_pButton, true);
         gtk_button_set_image_position(m_pButton, GTK_POS_LEFT);
         if (pDevice)
-            gtk_button_set_image(m_pButton, gtk_image_new_from_surface(get_underlying_cairo_surface(*pDevice)));
+            gtk_button_set_image(m_pButton, image_new_from_virtual_device(*pDevice));
         else
             gtk_button_set_image(m_pButton, nullptr);
     }
@@ -4014,9 +4043,9 @@ public:
     }
 
     virtual void insert_item(int pos, const OUString& rId, const OUString& rStr,
-                        const OUString* pIconName, VirtualDevice* pImageSufface, bool bCheck) override
+                        const OUString* pIconName, VirtualDevice* pImageSurface, bool bCheck) override
     {
-        MenuHelper::insert_item(pos, rId, rStr, pIconName, pImageSufface, bCheck);
+        MenuHelper::insert_item(pos, rId, rStr, pIconName, pImageSurface, bCheck);
     }
 
     virtual void set_item_active(const OString& rIdent, bool bActive) override
@@ -4220,7 +4249,7 @@ public:
     }
 
     virtual void insert(int pos, const OUString& rId, const OUString& rStr,
-                        const OUString* pIconName, VirtualDevice* pImageSufface,
+                        const OUString* pIconName, VirtualDevice* pImageSurface,
                         bool bCheck) override
     {
         GtkWidget* pImage = nullptr;
@@ -4233,24 +4262,9 @@ public:
                 g_object_unref(pixbuf);
             }
         }
-        else if (pImageSufface)
+        else if (pImageSurface)
         {
-            cairo_surface_t* surface = get_underlying_cairo_surface(*pImageSufface);
-
-            Size aSize(pImageSufface->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);
-
-            cairo_surface_destroy(target);
+            pImage = image_new_from_virtual_device(*pImageSurface);
         }
 
         GtkWidget *pItem;


More information about the Libreoffice-commits mailing list