summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2019-01-09 11:34:45 +0000
committerCaolán McNamara <caolanm@redhat.com>2019-01-09 22:12:29 +0100
commitf22f28e722a8a2efdc42bddba80a3a43025a61fd (patch)
treef04e0643c3c185bfba58267a2202a2cc168b8b7c /vcl
parent473d4f84ae7e2ad39342e099c9219d1ee99539c4 (diff)
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@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx62
1 files changed, 38 insertions, 24 deletions
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;