using imlib2 to display images doesn't seem to work correctly

Mike Ranweiler <[email protected]>
Newsgroups gmane.comp.window-managers.fluxbox.user
Message-ID <1295542835.3791.716.camel@moonarie>
I've found an odd issue where some images don't display using imlib_render_image_on_drawable() on fluxbox, but work fine elsewhere.  I found this using Fedora 14 and basically just using a modified version of the imlib test code in the documentation from Carsten Haitzler [1].  What happens is just an empty (black) window is displayed, imlib_image_get_height(), etc, return the correct results, but the image isn't displayed.  I don't know if this is a fluxbox problem or imlib, really, but I thought I'd start here.

Many larger images (like from my camera) work fine, but the problem can be recreated with these:
http://fluxbox.org/screenshots/screenshots_full/screenshot_bobbens.png
http://fluxbox.org/screenshots/screenshots_full/screenshot_zan.png

I don't think it correlates just to the image size, but I don't know why some work - just that it seems that images larger than the standard 2meg cache work fine (even if the cache is disabled).

I tried updating imlib to 1.4.4, I didn't see any changes to fluxbox that lead me to a rebuild past 1.1.1 that's in Fedora.  Let me know, I can try that.

Using imlib_render_image_on_drawable_at_size() using the size of the image does always display the image correctly, it's in the test case after the failing call.  I tried turning off the cache, both in the small test application and in fluxbox (src/FbTk/ImageImlib2.cc), but that doesn't make any difference.  I'm typically doing this under VNC, it works fine on mwm and the Fedora-standard gnome/metacity desktop - I only see this problem using the testcase on fluxbox.

I've included a test case where you provide an image file and a display time, it first tries with imlib_render_image_on_drawable(), and then with imlib_render_image_on_drawable_at_size().  With fluxbox and the images above it always just gives a black window with imlib_render_image_on_drawable(), and then the image when it imlib_render_image_on_drawable_at_size().

Anyone have any ideas?  It's confusing to me, I'm not sure if I'm missing something I should be doing or where a bug might be.  Both functions just call __imlib_RenderImage with slightly different parameters, I checked that __imlib_RenderImage is not simply exiting because of a 0 dw/dh.

It may be unrelated, but I initially had difficulties getting fbdesk to work correctly.  Certainly all the icon image files I tried to use with fbdesk fail to display with this test case, but again, it could be completely unrelated.

Thanks much,

Mike

1.  http://docs.enlightenment.org/api/imlib2/html/

Compile with gcc -o testcase testcase.c `imlib2-config --cflags` `imlib2-config --libs` as per the docs above.


/* This is based on the code provided in the documentation.
 * See either doc/index.html or online at:
 * http://docs.enlightenment.org/api/imlib2/html/
 *
 * This package is under a BSD-like license, included below:
 *
 * Copyright (C) 2000 Carsten Haitzler and various contributors (see AUTHORS)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to
 * deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies of the Software and its Copyright notices. In addition publicly
 * documented acknowledgment must be given that this software has been used if no
 * source code of this software is made available publicly. This includes
 * acknowledgments in either Copyright notices, Manuals, Publicity and Marketing
 * documents or any documentation provided with any product containing this
 * software. This License does not apply to any software that links to the
 * libraries provided by this software (statically or dynamically), but only to
 * the software provided.
 * /

/* include X11 stuff */
#include <X11/Xlib.h>
/* include Imlib2 stuff */
#include <Imlib2.h>
/* sprintf include */
#include <stdio.h>

/* some globals for our window & X display */
Display *disp;
Window   win;
Visual  *vis;
Colormap cm;
int      depth;

/* the program... */
int main(int argc, char **argv)
{
   /* image variable */
   Imlib_Image image;
   /* the height and width of the window */
   int h, w;
   /* arguments */
   char imagename[256];
   int sleeptime;

   if (argc !=3) {
      printf("This test takes 3 arguments, an image file and a time to "
             "display the image.\n");
      return 1;
   }
   snprintf(imagename, 256, "%s", argv[1]);
   sleeptime = atoi(argv[2]);

   /* connect to X */
   disp  = XOpenDisplay(NULL);
   /* get default visual , colormap etc. you could ask imlib2 for what it */
   /* thinks is the best, but this example is intended to be simple */
   vis   = DefaultVisual(disp, DefaultScreen(disp));
   depth = DefaultDepth(disp, DefaultScreen(disp));
   cm    = DefaultColormap(disp, DefaultScreen(disp));
   win = XCreateSimpleWindow(disp, DefaultRootWindow(disp), 
                             0, 0, 640,
                             480, 0, 0, 0);
   XMapWindow(disp, win);

   /* set our cache to 0 so it's unused */
   imlib_set_cache_size(0);
   /* set the maximum number of colors to allocate for 8bpp and less to 128 */
   imlib_set_color_usage(128);
   /* dither for depths < 24bpp */
   imlib_context_set_dither(1);
   /* set the display , visual, colormap and drawable we are using */
   imlib_context_set_display(disp);
   imlib_context_set_visual(vis);
   imlib_context_set_colormap(cm);
   imlib_context_set_drawable(win);


   /* load the image */
   image = imlib_load_image(imagename);
     if (!image) {
        printf("image didn't load\n");
        return -1;
     }
   imlib_context_set_image(image);

   imlib_render_image_on_drawable(0, 0);
   sleep(sleeptime);
   imlib_render_image_on_drawable_at_size(0, 0, imlib_image_get_width(),
                                          imlib_image_get_height());
   sleep(sleeptime);
   imlib_free_image_and_decache();

   return 0;
}

-- 
Mike Ranweiler


------------------------------------------------------------------------------
Protect Your Site and Customers from Malware Attacks
Learn about various malware tactics and how to avoid them. Understand 
malware threats, the impact they can have on your business, and how you 
can protect your company and customers by using code signing.
http://p.sf.net/sfu/oracle-sfdevnl
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.