diff options
Diffstat (limited to 'graphics/magicpoint/patches/patch-image_imlib__loader.c')
-rw-r--r-- | graphics/magicpoint/patches/patch-image_imlib__loader.c | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/graphics/magicpoint/patches/patch-image_imlib__loader.c b/graphics/magicpoint/patches/patch-image_imlib__loader.c new file mode 100644 index 00000000000..ff29847738c --- /dev/null +++ b/graphics/magicpoint/patches/patch-image_imlib__loader.c @@ -0,0 +1,182 @@ +$NetBSD: patch-image_imlib__loader.c,v 1.1 2011/02/25 17:02:53 wiz Exp $ + +imlib2 patch from suse. + +--- image/imlib_loader.c.orig 2008-01-16 14:52:14.000000000 +0000 ++++ image/imlib_loader.c +@@ -6,13 +6,14 @@ + #include <X11/Xlib.h> + #include <X11/Xutil.h> + #include <X11/extensions/shape.h> +-#include <Imlib.h> ++#include <Imlib2.h> + + #define IMFILENUM 500 + static char imfile[IMFILENUM][1024]; +-static ImlibImage *imdata[IMFILENUM]; ++static Imlib_Image *imdata[IMFILENUM]; ++static Image *imagedata[IMFILENUM]; + static int imnum; +-static ImlibData *id; ++static Imlib_Context *id; + + int imIdent(char *fullname, char *name) + { +@@ -22,32 +23,71 @@ int imIdent(char *fullname, char *name) + Image *imLoad(char *fullname, char *name, unsigned int verbose) + { + static Display *disp = NULL; +- Image *image; +- ImlibImage *im; +- ImlibColor shape; +- unsigned int w,h, size; +- ImlibImage *search_imdata(); ++ Image *image = NULL; ++ Imlib_Image *im; ++ unsigned int w,h, size, i; ++ DATA32 * argb_data; ++ byte * rgb_ptr; ++ Imlib_Image *search_imdata(); + void regist_imdata(); + + if (disp == NULL) { + disp=XOpenDisplay(NULL); + } +- if (id == NULL) id=Imlib_init(disp); +- if ((im = search_imdata(fullname)) == NULL) { +- im = Imlib_load_image(id, fullname); ++ /* if (id == NULL) id=Imlib_init(disp); */ ++ /* might needs more work */ ++ if (id == NULL) { ++ /* dither for non-truecolor displays */ ++ imlib_context_set_dither(1); ++ imlib_context_set_display(disp); ++ imlib_context_set_visual(DefaultVisual(disp, DefaultScreen(disp))); ++ imlib_context_set_colormap(DefaultColormap(disp, DefaultScreen(disp))); ++ } ++ if ((im = search_imdata(fullname), image) == NULL) { ++ /* im = Imlib_load_image(id, fullname); */ ++ im = imlib_load_image(fullname); + } + if (im == NULL) { + return NULL; + } +- w = im->rgb_width; +- h = im->rgb_height; +- size = w * h * 3; +- +- image = newTrueImage(w, h); +- memcpy(image->data, im->rgb_data, size); +- +- Imlib_get_image_shape(id, im, &shape); +- ++ imlib_context_set_image(im); ++ w = imlib_image_get_width(); ++ h = imlib_image_get_height(); ++ size = w * h; ++ ++ if (image == NULL) image = newTrueImage(w, h); ++ ++ /* Imlib2 stores images in ARGB format (32 bpp). MagicPoint ++ * wants RGB data (24 bpp). So we need a conversion pass. */ ++ argb_data = imlib_image_get_data_for_reading_only(); ++ rgb_ptr = image->data; ++ for (i = 0; i < size; ++i) ++ { ++ if ((argb_data[i] >> 24) < 128) ++ { ++ /* If this is a transparent pixel, we store #FE00FE. */ ++ *rgb_ptr++ = 0xFE; ++ *rgb_ptr++ = 0x00; ++ *rgb_ptr++ = 0xFE; ++ /* Tell mgp we have transparent pixels. */ ++ image->trans = 0xFE00FE; ++ } ++ else if ((argb_data[i] & 0x00FFFFFF) == 0x00FE00FE) ++ { ++ /* If that color is actually used, we substitute something close. */ ++ *rgb_ptr++ = 0xFF; ++ *rgb_ptr++ = 0x00; ++ *rgb_ptr++ = 0xFE; ++ } ++ else ++ { ++ /* Otherwise, we can copy the pixel. */ ++ *rgb_ptr++ = (argb_data[i] >> 16) & 0xFF; /* red */ ++ *rgb_ptr++ = (argb_data[i] >> 8) & 0xFF; /* green */ ++ *rgb_ptr++ = argb_data[i] & 0xFF; /* blue */ ++ } ++ } ++#if 0 + /* + * bug fix for transparent gif handling + * suggested by Jose Geraldo Alves Brito Neto <jgabrito@iq.usp.br> +@@ -57,44 +97,52 @@ Image *imLoad(char *fullname, char *name + ((shape.r & 0xff) << 16) | + ((shape.g & 0xff) << 8) | + ((shape.b & 0xff) << 0); ++#endif + + image->title = dupString(name); + #if 0 + Imlib_kill_image(id, im); + #else +- regist_imdata(name, im); ++ regist_imdata(name, im, image); + #endif + + return image; + } + +-ImlibImage *search_imdata(char *fullname) ++Imlib_Image *search_imdata(char *fullname, Image *image) + { + int i; + for (i = 0; i < imnum; i ++){ + if (!strcmp(imfile[i], fullname)) { ++ image = imagedata[i]; + return imdata[i]; + } + } + return NULL; + } + +-void regist_imdata(fullname, im) ++void regist_imdata(fullname, im, image) + char *fullname; +- ImlibImage *im; ++ Imlib_Image *im; ++ Image *image; + { + strcpy(imfile[imnum], fullname); + imdata[imnum] = im; ++ imagedata[imnum] = image; + imnum ++; + } + + Pixmap pixmap_fromimimage(imimage, width, height) +- ImlibImage *imimage; ++ Imlib_Image *imimage; + int width, height; + { + static Pixmap pixmap; ++#if 0 + Imlib_render(id, imimage, width, height); + pixmap = Imlib_move_image(id, imimage); ++#else ++ imlib_render_pixmaps_for_whole_image_at_size(&pixmap, NULL, width, height); ++#endif + + return pixmap; + } +@@ -125,8 +173,8 @@ manage_pixmap(pixmap, add, page) + ppage[i] = page; + } else { + for (i = 0; i < MAXPMAP; i ++) { +- if (ppage[i] == page){ +- Imlib_free_pixmap(id, pmap[i]); ++ if (ppage[i] == page && pmap[i] != 0){ ++ imlib_free_pixmap_and_mask(pmap[i]); + pmap[i] = 0; + } + } |