Web lists-archives.com

Re: gtk_icon_theme_load_icon and GDK_SCALE=2 results in blurry icon


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.


gtk-list mailing list