Re: gtk_icon_theme_load_icon and GDK_SCALE=2 results in blurry icon
- From: Alexander Shaduri <ashaduri gmail com>
- To: infirit <infirit gmail com>, gtk-list gnome org
- Subject: Re: gtk_icon_theme_load_icon and GDK_SCALE=2 results in blurry icon
- Date: Tue, 03 Oct 2017 21:49:17 +0400
Hi,
On Tue, 2017-10-03 at 19:32 +0200, infirit wrote:
Op 10/03/2017 om 03:28 PM schreef Alexander Shaduri:
I have a HiDPI Screen with DPI set to 192, GDK_SCALE=2 and GDK_DPI_SCALE=-1.
I need to get an icon as a pixbuf for GtkIconView.
Short answer, there is no way to do scaling properly with pixbufs. The
only way I found to do this was setting icon names and using cairo surfaces.
Unfortunately, GtkIconView expects pixbufs in the model.
I don't see a way to pass cairo surfaces to it.
This is the code in gtkmm:
Glib::RefPtr<Gtk::IconTheme> default_icon_theme = Gtk::IconTheme::get_default();
Glib::RefPtr<Gdk::Pixbuf> icon = default_icon_theme->load_icon("drive-harddisk", 64,
Gtk::IconLookupFlags(0));
As others have mentioned use the _at_scale() version of the icon theme
functions, it handles all the necessary scaling for you. To get the
scale factor use gtk_widget_get_scale_factor on the window/widget.
Yes, tried that, GtkIconView scales the resulting pixbuf.
Another thing to think about is the quality of the icons. I added proper
scaling for a project and found that the a couple of png icons it used
where in only a single size and of low quality. No matter what you do in
this case there is no way to prevent blurry icons.
The quality is not an issue here. I can get a sharp 128-size icon when not
using GDK_SCALE=2.
Internally Gtk handles this transparently as long as use icon-names
instead of pixbufs. I highly recommend you use icon-names whenever
possible and use cairo surfaces if you need to draw over or transform
the icon.
I ended up using gtk_icon_theme_lookup_icon_for_scale and then retrieve
the surface at the very last moment with gtk_icon_info_load_surface.
gtk_icon_info_load_surface also sets the correct scaling factor on the
surface so there is no need to change it with
cairo_surface_set_device_scale. Most widgets will accept the surface
these days and you should start using them.
Not GtkIconView, it seems.
Is there a way to get a sharp icon with gtk_icon_theme_load_icon?
Yes I managed it as described above. I have a silly experiment in python
that uses cairo surfaces at [1], maybe this helps. The moment you write
to png and use it as source on a widget things go blurry.
~infirit
[1] https://gist.github.com/infirit/7434371b93cf727f7517c4601df602b9
I'm at loss here, I guess this can be viewed as a bug in GtkIconView.
Thanks
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]