gtkD load images

Antonio Corbi via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Aug 3 23:58:00 PDT 2017


On Thursday, 3 August 2017 at 21:06:36 UTC, Johnson Jones wrote:
> On Thursday, 3 August 2017 at 13:12:03 UTC, Mengu wrote:
>> On Thursday, 3 August 2017 at 03:59:40 UTC, Johnson Jones 
>> wrote:
>>> How can be use gtkD to load images, I assume through 
>>> gdkpixbuf? While I am getting errors loading images through 
>>> glade's image:
>>>
>>> (test.exe:8188): Gtk-WARNING **: Could not load 
>>> image 'a.jpg': Couldn't recognize the image file format for 
>>> file 'test\a.jpg'
>>>
>>> (loads fine in glade)
>>>
>>> which needs to be resolved, I'd also like to be able to use 
>>> gdkpixbuf to load images programmatically. There seems to be 
>>> no demos on the gtkD github page that deals with image 
>>> loading.
>>>
>>> I've tried to do something like
>>>
>>> import gtkc.gdkpixbuf;
>>> auto x = c_gdk_pixbuf_get_formats().data;
>>>
>>> but I don't know how to interpret x.
>>>
>>> Also something like
>>>
>>> 		import gtkc.gdkpixbuf;
>>> 		void* x;
>>> 		auto p = c_gdk_pixbuf_get_formats();
>>> 		for(int i = 0; i < 10; i++)
>>> 		{			
>>> 			x = p.data;
>>> 			p = p.next;
>>> 		}
>>>
>>> which doesn't offer any help.
>>>
>>>
>>> Aside: How can we call the gtk functions directly using gtkD? 
>>> Seems it uses stuff like
>>>
>>> Linker.link(gdk_pixbuf_get_formats, "gdk_pixbuf_get_formats", 
>>> LIBRARY_GDKPIXBUF);
>>>
>>> It does seem to alias to these function but something is off 
>>> and I'm not sure what.
>>
>> hi
>>
>> - is the gtk.Image class not working for you? 
>> https://api.gtkd.org/gtkd/gtk/Image.html
>>
>> - there's also a gdkpixbuf.Pixbuf that you can use. 
>> https://api.gtkd.org/gtkd/gdkpixbuf/Pixbuf.html
>>
>> - you can import those functions from gdkpixbuf.c.functions.
>
> So, like I said, I've tried
>
> import gdkpixbuf.Pixbuf;
> auto x = Pixbuf.newFromResource("C:\\a.jpg");
>
> which gives me that error I stated before for x86. For x64 it 
> simply crashes and no exception is given.
>
> If I use a dummy image I get the same error:
>
> "Unhandled exception: glib.GException.GException The resource 
> at “C:\adf.jpg” does not exist at 
> generated\gtkd\glib\GException.d(40)"
>
> The error message makes look like like it should be
>
>
> "Unhandled exception: glib.GException.GException The resource 
> at “C:\adf.jpg” does not exist at “C:\” 
> generated\gtkd\glib\GException.d(40)"
>
>
> I'd rather use Pixbuf than image because I don't need to 
> generate a full blow image widget.
>
> If I do
>
> GError* err = null;
> auto p = 
> gdk_pixbuf_new_from_resource(Str.toStringz("C:\\a.jpg"), &err);
>
> p is null and err is
>
> The resource at “D:\a.jpgâ€. does not exist.
>
> which is clearly not true.
>
> So not sure what is going on ;/ Seems to be a bug in pixbuf or 
> am I specifying the path wrong? If gtk.Image uses these 
> internally then it is working so...

Hi!

I load images using Gtk like this (I use gtk under gnu/linux):

  Pixbuf pixbuf = new Pixbuf (filename);

And draw them in a GtkDrawingArea like this:

// redrawPage is a method from my window class
//    theCanvas = cast(DrawingArea) 
theBuilder.getObject("wCanvas");
//    theCanvas.addOnDraw (&redrawPage);

private bool redrawPage (Scoped!Context ctx, Widget wda) {
     if (pixbuf !is null) {
       Pixbuf img;
       int w, h;

       ctx.scale (drawingScale, drawingScale);

       w = cast(int) (pixbuf.getWidth  * drawingScale);
       h = cast(int) (pixbuf.getHeight * drawingScale);

       theCanvas.setSizeRequest (w, h);

       ctx.setSourcePixbuf (cast(Pixbuf) thePixmap, 0.0, 0.0);
       ctx.paint ();
     }
     return true;
   }

Hope it helps you.
A. Corbi



More information about the Digitalmars-d-learn mailing list