summaryrefslogtreecommitdiffstats
path: root/debian/imlib/imlib-1.9.15/gdk_imlib/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'debian/imlib/imlib-1.9.15/gdk_imlib/misc.c')
-rw-r--r--debian/imlib/imlib-1.9.15/gdk_imlib/misc.c1365
1 files changed, 1365 insertions, 0 deletions
diff --git a/debian/imlib/imlib-1.9.15/gdk_imlib/misc.c b/debian/imlib/imlib-1.9.15/gdk_imlib/misc.c
new file mode 100644
index 00000000..b372dde4
--- /dev/null
+++ b/debian/imlib/imlib-1.9.15/gdk_imlib/misc.c
@@ -0,0 +1,1365 @@
+#define _GNU_SOURCE
+#include <config.h>
+#include "gdk_imlib.h"
+#define id _gdk_imlib_data
+#include "gdk_imlib_private.h"
+#include <gdk/gdk.h>
+#include <gdk/gdkx.h>
+#include <locale.h>
+
+static char x_error;
+
+static void
+HandleXError(Display * d, XErrorEvent * ev)
+{
+ x_error = 1;
+}
+
+gint
+gdk_imlib_get_render_type()
+{
+ if (id->x.disp)
+ return id->render_type;
+ else
+ return -1;
+}
+
+void
+gdk_imlib_set_render_type(gint rend_type)
+{
+ if (id->x.depth > 8)
+ id->render_type = rend_type;
+ else
+ {
+ if ((rend_type == RT_PLAIN_TRUECOL) ||
+ (rend_type == RT_DITHER_TRUECOL))
+ id->render_type = RT_DITHER_PALETTE_FAST;
+ else
+ id->render_type = rend_type;
+ }
+ return;
+}
+
+static void
+gdk_imlib_set_fast_render(ImlibData * id, Display * disp)
+{
+ /* Turn off fastrender if there is an endianess diff between */
+ /* client and Xserver in all but 24 bit mode */
+ int byt, bit;
+
+ byt = ImageByteOrder(id->x.disp); /* LSBFirst | MSBFirst */
+ bit = BitmapBitOrder(id->x.disp); /* LSBFirst | MSBFirst */
+
+ id->x.byte_order = byt;
+ id->x.bit_order = bit; /* We ignore this for now in the fastrend */
+ /* if little endian && server big */
+ if (htonl(1) != 1 && byt == MSBFirst)
+ id->fastrend = 0;
+ /* if big endian && server little */
+ if (htonl(1) == 1 && byt == LSBFirst)
+ id->fastrend = 0;
+}
+
+static int
+gdk_imlib_set_color_map(ImlibData * id, Display * disp)
+{
+ XSetWindowAttributes at;
+ unsigned long mask;
+ int newcm = 0;
+ GdkWindowPrivate *private;
+
+ at.border_pixel = 0;
+ at.backing_store = NotUseful;
+ at.background_pixel = 0;
+ at.save_under = False;
+ at.override_redirect = True;
+ mask = CWOverrideRedirect | CWBackPixel | CWBorderPixel |
+ CWBackingStore | CWSaveUnder;
+ newcm = 0;
+ private = (GdkWindowPrivate *) & gdk_root_parent;
+ if (id->x.visual != DefaultVisual(disp, id->x.screen))
+ {
+ Colormap cm;
+
+ cm = XCreateColormap(id->x.disp, private->xwindow,
+ id->x.visual, AllocNone);
+ if (cm)
+ {
+ mask |= CWColormap;
+ id->x.root_cmap = cm;
+ at.colormap = cm;
+ newcm = 1;
+ }
+ }
+ id->x.base_window = XCreateWindow(id->x.disp, private->xwindow,
+ -100, -100, 10, 10, 0,
+ id->x.depth, InputOutput,
+ id->x.visual, mask, &at);
+ id->x.gdk_win = gdk_window_foreign_new(id->x.base_window);
+ if (newcm)
+ id->x.gdk_cmap = gdk_colormap_new(gdk_window_get_visual
+ (id->x.gdk_win), FALSE);
+ else
+ id->x.gdk_cmap = gdk_colormap_get_system();
+ return newcm;
+}
+
+#ifdef HAVE_SHM
+int
+ XShmGetEventBase(Display * disp);
+
+#endif
+
+static int initialized = 0;
+
+void
+gdk_imlib_init()
+{
+ Display *disp;
+ XWindowAttributes xwa;
+ XVisualInfo xvi, *xvir;
+ GdkVisual *visual;
+ char *homedir;
+ char s[4096];
+ char *s1;
+ char *s2;
+ FILE *f;
+ int override = 0;
+ int dither = 0;
+ int remap = 1;
+ int num;
+ int i, max, maxn;
+ int clas;
+ char *palfile = 0;
+ int loadpal;
+ int vis;
+ int newcm;
+ char *old_locale;
+
+ disp = (Display *) gdk_display;
+ if (!disp)
+ {
+ fprintf(stderr, "gdk_imlib ERROR: gdk has not connected to the display\n");
+ return;
+ }
+ vis = -1;
+ loadpal = 0;
+ if (initialized)
+ return;
+
+ initialized = 1;
+ id->palette = NULL;
+ id->palette_orig = NULL;
+ id->fast_rgb = NULL;
+ id->fast_err = NULL;
+ id->fast_erg = NULL;
+ id->fast_erb = NULL;
+ id->x.disp = disp;
+ id->x.screen = DefaultScreen(disp); /* the screen number */
+ id->x.root = DefaultRootWindow(disp); /* the root window id */
+ visual = gdk_rgb_get_visual();
+ id->x.visual = GDK_VISUAL_XVISUAL(visual); /* the visual type */
+ id->x.depth = visual->depth; /* the depth of the screen in bpp */
+
+ id->x.shm = 0;
+ id->x.shmp = 0;
+ id->max_shm = 0;
+#ifdef HAVE_SHM
+ if (gdk_get_use_xshm())
+ {
+ if (XShmQueryExtension(id->x.disp) == True)
+ {
+ int maj, min, dum;
+ Bool pm;
+
+ if (XQueryExtension(id->x.disp, "MIT-SHM", &dum, &dum, &dum))
+ {
+ if (XShmQueryVersion(id->x.disp, &maj, &min, &pm) == True)
+ {
+ id->x.shm = 1;
+ id->x.shm_event = XShmGetEventBase(id->x.disp) +
+ ShmCompletion;
+ id->x.last_xim = NULL;
+ id->x.last_sxim = NULL;
+ id->max_shm = 0x7fffffff;
+ if ((XShmPixmapFormat(id->x.disp) == ZPixmap) &&
+ (pm == True))
+ id->x.shmp = 1;
+ }
+ }
+ }
+ }
+#endif
+ id->cache.on_image = 0;
+ id->cache.size_image = 0;
+ id->cache.num_image = 0;
+ id->cache.used_image = 0;
+ id->cache.image = NULL;
+ id->cache.on_pixmap = 0;
+ id->cache.size_pixmap = 0;
+ id->cache.num_pixmap = 0;
+ id->cache.used_pixmap = 0;
+ id->cache.pixmap = NULL;
+ id->byte_order = 0;
+ id->fastrend = 0;
+ id->hiq = 0;
+ id->fallback = 1;
+ id->mod.gamma = 256;
+ id->mod.brightness = 256;
+ id->mod.contrast = 256;
+ id->rmod.gamma = 256;
+ id->rmod.brightness = 256;
+ id->rmod.contrast = 256;
+ id->gmod.gamma = 256;
+ id->gmod.brightness = 256;
+ id->gmod.contrast = 256;
+ id->bmod.gamma = 256;
+ id->bmod.brightness = 256;
+ id->bmod.contrast = 256;
+ id->ordered_dither = 1;
+
+ if (XGetWindowAttributes(disp, id->x.root, &xwa))
+ {
+ if (xwa.colormap)
+ id->x.root_cmap = xwa.colormap;
+ else
+ id->x.root_cmap = 0;
+ }
+ else
+ id->x.root_cmap = 0;
+
+ id->num_colors = 0;
+ homedir = getenv("HOME");
+ g_snprintf(s, sizeof(s), "%s/.imrc", homedir);
+ old_locale = g_strdup(setlocale(LC_NUMERIC, NULL));
+ setlocale(LC_NUMERIC, "C");
+ f = fopen(s, "r");
+ if (!f)
+ f = fopen(SYSTEM_IMRC, "r");
+ if (f)
+ {
+ while (fgets(s, sizeof (s), f))
+ {
+ if (s[0] == '#')
+ continue;
+
+ s1 = strtok(s, " \t\n");
+
+ /* Blank line ? */
+
+ if (s1 == NULL)
+ continue;
+
+ s2 = strtok(NULL, " \t\n");
+ if (s2 == NULL)
+ s2 = ""; /* NULL argument */
+
+ if (!strcasecmp("PaletteFile", s1))
+ {
+ palfile = strdup(s2);
+ }
+ else if (!strcasecmp("PaletteOverride", s1))
+ {
+ if (!strcasecmp("yes", s2))
+ override = 1;
+ else
+ override = 0;
+ }
+ else if (!strcasecmp("Dither", s1))
+ {
+ if (!strcasecmp("yes", s2))
+ dither = 1;
+ else
+ dither = 0;
+ }
+ else if (!strcasecmp("Remap", s1))
+ {
+ if (!strcasecmp("fast", s2))
+ remap = 1;
+ else
+ remap = 0;
+ }
+ else if (!strcasecmp("Mit-Shm", s1))
+ {
+#ifdef HAVE_SHM
+ if (!strcasecmp("off", s2))
+#endif
+ {
+ id->x.shm = 0;
+ id->x.shmp = 0;
+ }
+ }
+ else if (!strcasecmp("SharedPixmaps", s1))
+ {
+#ifdef HAVE_SHM
+ if (!strcasecmp("off", s2))
+#endif
+ id->x.shmp = 0;
+ }
+ else if (!strcasecmp("FastRender", s1))
+ {
+ if (!strcasecmp("on", s2))
+ id->fastrend = 1;
+ }
+ else if (!strcasecmp("HighQuality", s1))
+ {
+ if (!strcasecmp("on", s2))
+ id->hiq = 1;
+ }
+ else if (!strcasecmp("Shm_Max_Size", s1))
+ {
+ num = atoi(s2);
+ id->max_shm = num;
+ }
+ else if (!strcasecmp("Image_Cache_Size", s1))
+ {
+ num = atoi(s2);
+ id->cache.size_image = num;
+ }
+ else if (!strcasecmp("Pixmap_Cache_Size", s1))
+ {
+ num = atoi(s2);
+ id->cache.size_pixmap = num;
+ }
+ else if (!strcasecmp("Image_Cache", s1))
+ {
+ if (!strcasecmp("on", s2))
+ id->cache.on_image = 1;
+ }
+ else if (!strcasecmp("Pixmap_Cache", s1))
+ {
+ if (!strcasecmp("on", s2))
+ id->cache.on_pixmap = 1;
+ }
+ else if (!strcasecmp("ForceVisualID", s1))
+ {
+ if (sscanf (s2, "%x", &num) == 1)
+ vis = num;
+ }
+ else if (!strcasecmp("Fallback", s1))
+ {
+ if (!strcasecmp("off", s2))
+ id->fallback = 0;
+ else
+ id->fallback = 1;
+ }
+ else if (!strcasecmp("Gamma", s1))
+ {
+ id->mod.gamma = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Brightness", s1))
+ {
+ id->mod.brightness = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Contrast", s1))
+ {
+ id->mod.contrast = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Red_Gamma", s1))
+ {
+ id->rmod.gamma = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Red_Brightness", s1))
+ {
+ id->rmod.brightness = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Red_Contrast", s1))
+ {
+ id->rmod.contrast = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Green_Gamma", s1))
+ {
+ id->gmod.gamma = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Green_Brightness", s1))
+ {
+ id->gmod.brightness = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Green_Contrast", s1))
+ {
+ id->gmod.contrast = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Blue_Gamma", s1))
+ {
+ id->bmod.gamma = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Blue_Brightness", s1))
+ {
+ id->bmod.brightness = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Blue_Contrast", s1))
+ {
+ id->bmod.contrast = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Ordered_Dither", s1))
+ {
+ if (!strcasecmp("off", s2))
+ id->ordered_dither = 0;
+ else
+ id->ordered_dither = 1;
+ }
+ }
+ fclose(f);
+ }
+ setlocale(LC_NUMERIC, old_locale);
+ g_free(old_locale);
+
+ /* list all visuals for the default screen */
+ xvi.screen = id->x.screen;
+ xvir = XGetVisualInfo(disp, VisualScreenMask, &xvi, &num);
+ if (vis >= 0)
+ {
+ /* use the forced visual id */
+ maxn = 0;
+ for (i = 0; i < num; i++)
+ {
+ if (xvir[i].visualid == (VisualID) vis)
+ maxn = i;
+ }
+ if (maxn >= 0)
+ {
+ unsigned long rmsk, gmsk, bmsk;
+
+ id->x.depth = xvir[maxn].depth;
+ id->x.visual = xvir[maxn].visual;
+ rmsk = xvir[maxn].red_mask;
+ gmsk = xvir[maxn].green_mask;
+ bmsk = xvir[maxn].blue_mask;
+
+ if ((rmsk > gmsk) && (gmsk > bmsk))
+ id->byte_order = BYTE_ORD_24_RGB;
+ else if ((rmsk > bmsk) && (bmsk > gmsk))
+ id->byte_order = BYTE_ORD_24_RBG;
+ else if ((bmsk > rmsk) && (rmsk > gmsk))
+ id->byte_order = BYTE_ORD_24_BRG;
+ else if ((bmsk > gmsk) && (gmsk > rmsk))
+ id->byte_order = BYTE_ORD_24_BGR;
+ else if ((gmsk > rmsk) && (rmsk > bmsk))
+ id->byte_order = BYTE_ORD_24_GRB;
+ else if ((gmsk > bmsk) && (bmsk > rmsk))
+ id->byte_order = BYTE_ORD_24_GBR;
+ else
+ id->byte_order = 0;
+ }
+ else
+ fprintf(stderr, "Visual Id no 0x%x specified in the imrc file is invalid on this display.\nUsing Default Visual.\n", vis);
+ }
+ else
+ {
+ if (xvir)
+ {
+ /* find the highest bit-depth supported by visuals */
+ max = 0;
+ for (i = 0; i < num; i++)
+ {
+ if (xvir[i].depth > max)
+ max = xvir[i].depth;
+ }
+ if (max > 8)
+ {
+ id->x.depth = max;
+ clas = -1;
+ maxn = -1;
+ for (i = 0; i < num; i++)
+ {
+ if (xvir[i].depth == id->x.depth)
+ {
+ if ((xvir[i].class > clas) && (xvir[i].class != DirectColor))
+ {
+ maxn = i;
+ clas = xvir[i].class;
+ }
+ }
+ }
+ if (maxn >= 0)
+ {
+ unsigned long rmsk, gmsk, bmsk;
+
+ id->x.visual = xvir[maxn].visual;
+ rmsk = xvir[maxn].red_mask;
+ gmsk = xvir[maxn].green_mask;
+ bmsk = xvir[maxn].blue_mask;
+
+ if ((rmsk > gmsk) && (gmsk > bmsk))
+ id->byte_order = BYTE_ORD_24_RGB;
+ else if ((rmsk > bmsk) && (bmsk > gmsk))
+ id->byte_order = BYTE_ORD_24_RBG;
+ else if ((bmsk > rmsk) && (rmsk > gmsk))
+ id->byte_order = BYTE_ORD_24_BRG;
+ else if ((bmsk > gmsk) && (gmsk > rmsk))
+ id->byte_order = BYTE_ORD_24_BGR;
+ else if ((gmsk > rmsk) && (rmsk > bmsk))
+ id->byte_order = BYTE_ORD_24_GRB;
+ else if ((gmsk > bmsk) && (bmsk > rmsk))
+ id->byte_order = BYTE_ORD_24_GBR;
+ else
+ id->byte_order = 0;
+ }
+ }
+ }
+ }
+ id->x.render_depth = id->x.depth;
+ XFree(xvir);
+
+ if (id->x.depth == 16)
+ {
+ xvi.visual = id->x.visual;
+ xvi.visualid = XVisualIDFromVisual(id->x.visual);
+ xvir = XGetVisualInfo(disp, VisualIDMask, &xvi, &num);
+ if (xvir)
+ {
+ if (xvir->red_mask == 0xf800)
+ id->x.render_depth = 16;
+ /* This is a butt ugly hack to get the iPAQ to work! */
+ /* The proper way is to fix it, counting bits and storing
+ * mask values, but I dont think I can do this w/o breaking
+ * the API! Damn...
+ */
+ else if (xvir->red_mask == 0xf000) {
+ printf("Detected an iPAQ...\n");
+ id->x.render_depth = 12;
+ } else
+ id->x.render_depth=15;
+
+ XFree(xvir);
+ }
+ }
+ if (id->x.depth < 8)
+ id->x.shmp = 0;
+ if (id->x.depth <= 8 || override == 1)
+ loadpal = 1;
+ if (loadpal)
+ {
+ int have_pal;
+
+ if (dither == 1)
+ {
+ if (remap == 1)
+ id->render_type = RT_DITHER_PALETTE_FAST;
+ else
+ id->render_type = RT_DITHER_PALETTE;
+ }
+ else
+ {
+ if (remap == 1)
+ id->render_type = RT_PLAIN_PALETTE_FAST;
+ else
+ id->render_type = RT_PLAIN_PALETTE;
+ }
+
+ have_pal = 0;
+
+ if (palfile != NULL)
+ have_pal = gdk_imlib_load_colors(palfile);
+
+ if (!have_pal)
+ gdk_imlib_load_default_colors__private ();
+
+ if (id->num_colors == 0)
+ {
+ fprintf(stderr, "gdk_imlib: Unable to allocate a palette.\n");
+ if (palfile)
+ free(palfile);
+ exit (EXIT_FAILURE);
+ }
+ }
+ else
+ {
+ if (id->hiq == 1)
+ id->render_type = RT_DITHER_TRUECOL;
+ else
+ id->render_type = RT_PLAIN_TRUECOL;
+ }
+
+ newcm = gdk_imlib_set_color_map(id, disp);
+
+ gdk_imlib_set_fast_render(id, disp);
+
+ if (palfile)
+ free(palfile);
+#ifdef HAVE_SHM
+ if (id->x.shm)
+ {
+ XImage *xim;
+
+ xim = XShmCreateImage(id->x.disp, id->x.visual, id->x.depth,
+ ZPixmap, NULL, &id->x.last_shminfo, 10, 10);
+ if (!xim)
+ {
+ id->x.shm = 0;
+ id->x.shmp = 0;
+ }
+ else
+ {
+ id->x.last_shminfo.shmid =
+ shmget(IPC_PRIVATE, xim->bytes_per_line * xim->height,
+ IPC_CREAT | 0777);
+ if (id->x.last_shminfo.shmid < 0)
+ {
+ XDestroyImage(xim);
+ id->x.shm = 0;
+ id->x.shmp = 0;
+ }
+ else
+ {
+ XErrorHandler preh;
+
+ id->x.last_shminfo.shmaddr = xim->data =
+ shmat(id->x.last_shminfo.shmid, 0, 0);
+ id->x.last_shminfo.readOnly = False;
+ preh = XSetErrorHandler((XErrorHandler) HandleXError);
+ x_error = 0;
+ XShmAttach(id->x.disp, &id->x.last_shminfo);
+ XSync(disp, False);
+ if (x_error)
+ {
+ id->x.shm = 0;
+ id->x.shmp = 0;
+ }
+ else
+ XShmDetach(id->x.disp, &id->x.last_shminfo);
+ XDestroyImage(xim);
+ shmdt(id->x.last_shminfo.shmaddr);
+ shmctl(id->x.last_shminfo.shmid, IPC_RMID, 0);
+ XSetErrorHandler((XErrorHandler) preh);
+ }
+ }
+ }
+#endif /* HAVE_SHM */
+}
+
+void
+gdk_imlib_init_params(GdkImlibInitParams * p)
+{
+ Display *disp;
+ XWindowAttributes xwa;
+ XVisualInfo xvi, *xvir;
+ GdkVisual *visual;
+ char *homedir;
+ char s[4096], *s1, *s2;
+ FILE *f;
+ int override = 0;
+ int dither = 0;
+ int remap = 1;
+ int num;
+ int i, max, maxn;
+ int clas;
+ char *palfile;
+ int loadpal;
+ int vis;
+ int newcm;
+ char *old_locale;
+
+ palfile = NULL;
+ disp = (Display *) gdk_display;
+ if (!disp)
+ {
+ fprintf(stderr, "gdk_imlib ERROR: gdk has not connected to the display\n");
+ return;
+ }
+ vis = -1;
+ loadpal = 0;
+ if (initialized)
+ return;
+ initialized = 1;
+ id->palette = NULL;
+ id->palette_orig = NULL;
+ id->fast_rgb = NULL;
+ id->fast_err = NULL;
+ id->fast_erg = NULL;
+ id->fast_erb = NULL;
+ id->x.disp = disp;
+ id->x.screen = DefaultScreen(disp); /* the screen number */
+ id->x.root = DefaultRootWindow(disp); /* the root window id */
+ visual = gdk_rgb_get_visual();
+ id->x.visual = GDK_VISUAL_XVISUAL(visual); /* the visual type */
+ id->x.depth = visual->depth; /* the depth of the screen in bpp */
+#ifdef HAVE_SHM
+ if (XShmQueryExtension(id->x.disp))
+ {
+ int maj, min, dum;
+ Bool pm;
+
+ if (XQueryExtension(id->x.disp, "MIT-SHM", &dum, &dum, &dum))
+ {
+ if (XShmQueryVersion(id->x.disp, &maj, &min, &pm) == True)
+ {
+ id->x.shm = 1;
+ id->x.shm_event = XShmGetEventBase(id->x.disp) + ShmCompletion;
+ id->x.last_xim = NULL;
+ id->x.last_sxim = NULL;
+ id->max_shm = 0x7fffffff;
+ if (XShmPixmapFormat(id->x.disp) == ZPixmap)
+ id->x.shmp = 1;
+ }
+ }
+ }
+ else
+#endif
+ {
+ id->x.shm = 0;
+ id->x.shmp = 0;
+ }
+ id->cache.on_image = 0;
+ id->cache.size_image = 0;
+ id->cache.num_image = 0;
+ id->cache.used_image = 0;
+ id->cache.image = NULL;
+ id->cache.on_pixmap = 0;
+ id->cache.size_pixmap = 0;
+ id->cache.num_pixmap = 0;
+ id->cache.used_pixmap = 0;
+ id->cache.pixmap = NULL;
+ id->byte_order = 0;
+ id->fastrend = 0;
+ id->hiq = 0;
+ id->fallback = 1;
+ id->mod.gamma = 256;
+ id->mod.brightness = 256;
+ id->mod.contrast = 256;
+ id->rmod.gamma = 256;
+ id->rmod.brightness = 256;
+ id->rmod.contrast = 256;
+ id->gmod.gamma = 256;
+ id->gmod.brightness = 256;
+ id->gmod.contrast = 256;
+ id->bmod.gamma = 256;
+ id->bmod.brightness = 256;
+ id->bmod.contrast = 256;
+
+ if (XGetWindowAttributes(disp, id->x.root, &xwa))
+ {
+ if (xwa.colormap)
+ id->x.root_cmap = xwa.colormap;
+ else
+ id->x.root_cmap = 0;
+ }
+ else
+ id->x.root_cmap = 0;
+ id->num_colors = 0;
+ homedir = getenv("HOME");
+ g_snprintf(s, sizeof(s), "%s/.imrc", homedir);
+
+ old_locale = g_strdup(setlocale(LC_NUMERIC, NULL));
+ setlocale(LC_NUMERIC, "C");
+
+ f = fopen(s, "r");
+ if (!f)
+ f = fopen(SYSTEM_IMRC, "r");
+ if (f)
+ {
+ while (fgets(s, sizeof (s), f))
+ {
+ if (s[0] == '#')
+ continue;
+
+ s1 = strtok(s, " \t\n");
+
+ /* Blank line ? */
+
+ if (s1 == NULL)
+ continue;
+
+ s2 = strtok(NULL, " \t\n");
+ if (s2 == NULL)
+ s2 = ""; /* NULL argument */
+
+ if (!strcasecmp("PaletteFile", s1))
+ {
+ palfile = strdup(s2);
+ }
+ else if (!strcasecmp("PaletteOverride", s1))
+ {
+ if (!strcasecmp("yes", s2))
+ override = 1;
+ else
+ override = 0;
+ }
+ else if (!strcasecmp("Dither", s1))
+ {
+ if (!strcasecmp("yes", s2))
+ dither = 1;
+ else
+ dither = 0;
+ }
+ else if (!strcasecmp("Remap", s1))
+ {
+ if (!strcasecmp("fast", s2))
+ remap = 1;
+ else
+ remap = 0;
+ }
+ else if (!strcasecmp("Mit-Shm", s1))
+ {
+#ifdef HAVE_SHM
+ if (!strcasecmp("off", s2))
+#endif
+ {
+ id->x.shm = 0;
+ id->x.shmp = 0;
+ }
+ }
+ else if (!strcasecmp("SharedPixmaps", s1))
+ {
+#ifdef HAVE_SHM
+ if (!strcasecmp("off", s2))
+#endif
+ id->x.shmp = 0;
+ }
+ else if (!strcasecmp("FastRender", s1))
+ {
+ if (!strcasecmp("on", s2))
+ id->fastrend = 1;
+ }
+ else if (!strcasecmp("HighQuality", s1))
+ {
+ if (!strcasecmp("on", s2))
+ id->hiq = 1;
+ }
+ else if (!strcasecmp("Shm_Max_Size", s1))
+ {
+ num = atoi(s2);
+ id->max_shm = num;
+ }
+ if (!strcasecmp("Image_Cache_Size", s1))
+ {
+ num = atoi(s2);
+ id->cache.size_image = num;
+ }
+ else if (!strcasecmp("Pixmap_Cache_Size", s1))
+ {
+ num = atoi(s2);
+ id->cache.size_pixmap = num;
+ }
+ else if (!strcasecmp("Image_Cache", s1))
+ {
+ if (!strcasecmp("on", s2))
+ id->cache.on_image = 1;
+ }
+ else if (!strcasecmp("Pixmap_Cache", s1))
+ {
+ if (!strcasecmp("on", s2))
+ id->cache.on_pixmap = 1;
+ }
+ else if (!strcasecmp("ForceVisualID", s1))
+ {
+ if (sscanf (s2, "%x", &num) == 1)
+ vis = num;
+ }
+ else if (!strcasecmp("Fallback", s1))
+ {
+ if (!strcasecmp("off", s2))
+ id->fallback = 0;
+ else
+ id->fallback = 1;
+ }
+ else if (!strcasecmp("Gamma", s1))
+ {
+ id->mod.gamma = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Brightness", s1))
+ {
+ id->mod.brightness = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Contrast", s1))
+ {
+ id->mod.contrast = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Red_Gamma", s1))
+ {
+ id->rmod.gamma = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Red_Brightness", s1))
+ {
+ id->rmod.brightness = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Red_Contrast", s1))
+ {
+ id->rmod.contrast = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Green_Gamma", s1))
+ {
+ id->gmod.gamma = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Green_Brightness", s1))
+ {
+ id->gmod.brightness = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Green_Contrast", s1))
+ {
+ id->gmod.contrast = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Blue_Gamma", s1))
+ {
+ id->bmod.gamma = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Blue_Brightness", s1))
+ {
+ id->bmod.brightness = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Blue_Contrast", s1))
+ {
+ id->bmod.contrast = (int)(256.0 * atof(s2));
+ }
+ else if (!strcasecmp("Ordered_Dither", s1))
+ {
+ if (!strcasecmp("off", s2))
+ id->ordered_dither = 0;
+ else
+ id->ordered_dither = 1;
+ }
+ }
+ fclose(f);
+ }
+ setlocale(LC_NUMERIC, old_locale);
+ g_free(old_locale);
+
+ if (p)
+ {
+ if (p->flags & PARAMS_VISUALID)
+ vis = p->visualid;
+ if (p->flags & PARAMS_PALETTEFILE)
+ palfile = strdup(p->palettefile);
+ if (p->flags & PARAMS_SHAREDMEM)
+ {
+ if (!p->sharedmem)
+ {
+ id->x.shm = 0;
+ id->x.shmp = 0;
+ }
+ else
+ {
+ id->x.shm = 1;
+ id->x.shmp = 0;
+ }
+ }
+ if (p->flags & PARAMS_SHAREDPIXMAPS)
+ {
+ if (id->x.shm)
+ id->x.shmp = p->sharedpixmaps;
+ }
+ if (p->flags & PARAMS_PALETTEOVERRIDE)
+ override = p->paletteoverride;
+ if (p->flags & PARAMS_REMAP)
+ remap = p->remap;
+ if (p->flags & PARAMS_FASTRENDER)
+ id->fastrend = p->fastrender;
+ if (p->flags & PARAMS_HIQUALITY)
+ id->hiq = p->hiquality;
+ if (p->flags & PARAMS_DITHER)
+ dither = p->dither;
+ if (p->flags & PARAMS_IMAGECACHESIZE)
+ id->cache.size_image = p->imagecachesize;
+ if (p->flags & PARAMS_PIXMAPCACHESIZE)
+ id->cache.size_pixmap = p->pixmapcachesize;
+ }
+ /* list all visuals for the default screen */
+ xvi.screen = id->x.screen;
+ xvir = XGetVisualInfo(disp, VisualScreenMask, &xvi, &num);
+ if (vis >= 0)
+ {
+ /* use the forced visual id */
+ maxn = 0;
+ for (i = 0; i < num; i++)
+ {
+ if (xvir[i].visualid == (VisualID) vis)
+ maxn = i;
+ }
+ if (maxn >= 0)
+ {
+ unsigned long rmsk, gmsk, bmsk;
+
+ id->x.depth = xvir[maxn].depth;
+ id->x.visual = xvir[maxn].visual;
+ rmsk = xvir[maxn].red_mask;
+ gmsk = xvir[maxn].green_mask;
+ bmsk = xvir[maxn].blue_mask;
+
+ if ((rmsk > gmsk) && (gmsk > bmsk))
+ id->byte_order = BYTE_ORD_24_RGB;
+ else if ((rmsk > bmsk) && (bmsk > gmsk))
+ id->byte_order = BYTE_ORD_24_RBG;
+ else if ((bmsk > rmsk) && (rmsk > gmsk))
+ id->byte_order = BYTE_ORD_24_BRG;
+ else if ((bmsk > gmsk) && (gmsk > rmsk))
+ id->byte_order = BYTE_ORD_24_BGR;
+ else if ((gmsk > rmsk) && (rmsk > bmsk))
+ id->byte_order = BYTE_ORD_24_GRB;
+ else if ((gmsk > bmsk) && (bmsk > rmsk))
+ id->byte_order = BYTE_ORD_24_GBR;
+ else
+ id->byte_order = 0;
+ }
+ else
+ fprintf(stderr, "Visual Id no 0x%x specified in the imrc file is invalid on this display.\nUsing Default Visual.\n", vis);
+ }
+ else
+ {
+ if (xvir)
+ {
+ /* find the highest bit-depth supported by visuals */
+ max = 0;
+ for (i = 0; i < num; i++)
+ {
+ if (xvir[i].depth > max)
+ max = xvir[i].depth;
+ }
+ if (max > 8)
+ {
+ id->x.depth = max;
+ clas = -1;
+ maxn = -1;
+ for (i = 0; i < num; i++)
+ {
+ if (xvir[i].depth == id->x.depth)
+ {
+ if ((xvir[i].class > clas) && (xvir[i].class != DirectColor))
+ {
+ maxn = i;
+ clas = xvir[i].class;
+ }
+ }
+ }
+ if (maxn >= 0)
+ {
+ unsigned long rmsk, gmsk, bmsk;
+
+ id->x.visual = xvir[maxn].visual;
+ rmsk = xvir[maxn].red_mask;
+ gmsk = xvir[maxn].green_mask;
+ bmsk = xvir[maxn].blue_mask;
+
+ if ((rmsk > gmsk) && (gmsk > bmsk))
+ id->byte_order = BYTE_ORD_24_RGB;
+ else if ((rmsk > bmsk) && (bmsk > gmsk))
+ id->byte_order = BYTE_ORD_24_RBG;
+ else if ((bmsk > rmsk) && (rmsk > gmsk))
+ id->byte_order = BYTE_ORD_24_BRG;
+ else if ((bmsk > gmsk) && (gmsk > rmsk))
+ id->byte_order = BYTE_ORD_24_BGR;
+ else if ((gmsk > rmsk) && (rmsk > bmsk))
+ id->byte_order = BYTE_ORD_24_GRB;
+ else if ((gmsk > bmsk) && (bmsk > rmsk))
+ id->byte_order = BYTE_ORD_24_GBR;
+ else
+ id->byte_order = 0;
+ }
+ }
+ }
+ }
+ id->x.render_depth = id->x.depth;
+ XFree(xvir);
+ if (id->x.depth == 16)
+ {
+ xvi.visual = id->x.visual;
+ xvi.visualid = XVisualIDFromVisual(id->x.visual);
+ xvir = XGetVisualInfo(disp, VisualIDMask, &xvi, &num);
+ if (xvir)
+ {
+ if (xvir->red_mask == 0xf800)
+ id->x.render_depth = 16;
+ /* This is a butt ugly hack to get the iPAQ to work! */
+ /* The proper way is to fix it, counting bits and storing
+ * mask values, but I dont think I can do this w/o breaking
+ * the API! Damn...
+ */
+ else if (xvir->red_mask == 0xf000) {
+ printf("Detected an iPAQ...\n");
+ id->x.render_depth = 12;
+ } else
+ id->x.render_depth = 15;
+
+ XFree(xvir);
+ }
+ }
+ if (id->x.depth < 8)
+ id->x.shmp = 0;
+ if ((id->x.depth <= 8) || (override == 1))
+ loadpal = 1;
+ if (loadpal)
+ {
+ if (dither == 1)
+ {
+ if (remap == 1)
+ id->render_type = RT_DITHER_PALETTE_FAST;
+ else
+ id->render_type = RT_DITHER_PALETTE;
+ }
+ else
+ {
+ if (remap == 1)
+ id->render_type = RT_PLAIN_PALETTE_FAST;
+ else
+ id->render_type = RT_PLAIN_PALETTE;
+ }
+ gdk_imlib_load_colors(palfile);
+ if (id->num_colors == 0)
+ {
+ fprintf(stderr, "gdk_imlib: Cannot Find Palette. A Palette is required for this mode\n");
+ id->x.disp = NULL;
+ initialized = 0;
+ if (palfile)
+ free(palfile);
+ return;
+ }
+ }
+ else
+ {
+ if (id->hiq == 1)
+ id->render_type = RT_DITHER_TRUECOL;
+ else
+ id->render_type = RT_PLAIN_TRUECOL;
+ }
+
+ newcm = gdk_imlib_set_color_map(id, disp);
+ gdk_imlib_set_fast_render(id, disp);
+ if (palfile)
+ free(palfile);
+#ifdef HAVE_SHM
+ if (id->x.shm)
+ {
+ XImage *xim;
+
+ xim = XShmCreateImage(id->x.disp, id->x.visual, id->x.depth,
+ ZPixmap, NULL, &id->x.last_shminfo, 10, 10);
+ if (!xim)
+ {
+ id->x.shm = 0;
+ id->x.shmp = 0;
+ }
+ else
+ {
+ id->x.last_shminfo.shmid =
+ shmget(IPC_PRIVATE, xim->bytes_per_line * xim->height,
+ IPC_CREAT | 0777);
+ if (id->x.last_shminfo.shmid < 0)
+ {
+ XDestroyImage(xim);
+ id->x.shm = 0;
+ id->x.shmp = 0;
+ }
+ else
+ {
+ id->x.last_shminfo.shmaddr = xim->data =
+ shmat(id->x.last_shminfo.shmid, 0, 0);
+ id->x.last_shminfo.readOnly = False;
+ XSetErrorHandler((XErrorHandler) HandleXError);
+ x_error = 0;
+ XShmAttach(id->x.disp, &id->x.last_shminfo);
+ XSync(disp, False);
+ if (x_error)
+ {
+ id->x.shm = 0;
+ id->x.shmp = 0;
+ }
+ else
+ XShmDetach(id->x.disp, &id->x.last_shminfo);
+ XDestroyImage(xim);
+ shmdt(id->x.last_shminfo.shmaddr);
+ shmctl(id->x.last_shminfo.shmid, IPC_RMID, 0);
+ }
+ }
+ }
+#endif /* HAVE_SHM */
+}
+
+GdkPixmap *
+gdk_imlib_copy_image(GdkImlibImage * im)
+{
+ GdkPixmap *p;
+ GdkGC *gc;
+
+ if ((!im) || (!im->pixmap))
+ return NULL;
+ p = gdk_pixmap_new(id->x.gdk_win, im->width, im->height, id->x.depth);
+ gc = gdk_gc_new(p);
+ gdk_draw_pixmap(p, gc, im->pixmap, 0, 0, 0, 0, im->width, im->height);
+ gdk_gc_destroy(gc);
+ return p;
+}
+
+GdkPixmap *
+gdk_imlib_move_image(GdkImlibImage * im)
+{
+ GdkPixmap *p;
+
+ if (!im)
+ return NULL;
+ p = im->pixmap;
+ im->pixmap = NULL;
+ return p;
+}
+
+GdkBitmap *
+gdk_imlib_copy_mask(GdkImlibImage * im)
+{
+ GdkBitmap *p;
+ GdkGC *gc;
+
+ if ((!im) || (!im->shape_mask))
+ return NULL;
+ p = gdk_pixmap_new(id->x.gdk_win, im->width, im->height, 1);
+ gc = gdk_gc_new(p);
+ gdk_draw_pixmap(p, gc, im->shape_mask, 0, 0, 0, 0, im->width, im->height);
+ gdk_gc_destroy(gc);
+ return p;
+}
+
+GdkBitmap *
+gdk_imlib_move_mask(GdkImlibImage * im)
+{
+ GdkBitmap *p;
+
+ if (!im)
+ return NULL;
+ p = im->shape_mask;
+ im->shape_mask = NULL;
+ return p;
+}
+
+void
+gdk_imlib_destroy_image(GdkImlibImage * im)
+{
+ if (im)
+ {
+ if (id->cache.on_image)
+ {
+ _gdk_imlib_free_image(im);
+ _gdk_imlib_clean_caches();
+ }
+ else
+ _gdk_imlib_nullify_image(im);
+ }
+}
+
+void
+gdk_imlib_kill_image(GdkImlibImage * im)
+{
+ if (im)
+ {
+ if (id->cache.on_image)
+ {
+ _gdk_imlib_free_image(im);
+ _gdk_imlib_flush_image(im);
+ _gdk_imlib_clean_caches();
+ }
+ else
+ _gdk_imlib_nullify_image(im);
+ }
+}
+
+void
+gdk_imlib_free_pixmap(GdkPixmap * pmap)
+{
+ if (pmap)
+ {
+ _gdk_imlib_free_pixmappmap(pmap);
+ _gdk_imlib_clean_caches();
+ }
+}
+
+void
+gdk_imlib_free_bitmap(GdkBitmap * pmap)
+{
+ if (pmap)
+ {
+ _gdk_imlib_free_pixmappmap(pmap);
+ _gdk_imlib_clean_caches();
+ }
+}
+
+void
+gdk_imlib_set_image_border(GdkImlibImage * im, GdkImlibBorder * border)
+{
+ if ((im) && (border))
+ {
+ if ((im->border.left != border->left) ||
+ (im->border.right != border->right) ||
+ (im->border.top != border->top) ||
+ (im->border.bottom != border->bottom))
+ {
+ _gdk_imlib_dirty_pixmaps(im);
+
+ im->border.left = border->left;
+ im->border.right = border->right;
+ im->border.top = border->top;
+ im->border.bottom = border->bottom;
+ }
+ }
+}
+
+void
+gdk_imlib_get_image_border(GdkImlibImage * im, GdkImlibBorder * border)
+{
+ if ((im) && (border))
+ {
+ border->left = im->border.left;
+ border->right = im->border.right;
+ border->top = im->border.top;
+ border->bottom = im->border.bottom;
+ }
+}
+
+void
+gdk_imlib_get_image_shape(GdkImlibImage * im, GdkImlibColor * color)
+{
+ if ((!im) || (!color))
+ return;
+ color->r = im->shape_color.r;
+ color->g = im->shape_color.g;
+ color->b = im->shape_color.b;
+}
+
+void
+gdk_imlib_set_image_shape(GdkImlibImage * im, GdkImlibColor * color)
+{
+ if ((!im) || (!color))
+ return;
+ im->shape_color.r = color->r;
+ im->shape_color.g = color->g;
+ im->shape_color.b = color->b;
+ _gdk_imlib_dirty_pixmaps(im);
+}
+
+gint
+gdk_imlib_get_fallback()
+{
+ return id->fallback;
+}
+
+void
+gdk_imlib_set_fallback(gint fallback)
+{
+ id->fallback = fallback;
+}
+
+GdkVisual *
+gdk_imlib_get_visual()
+{
+ return gdk_window_get_visual(id->x.gdk_win);
+}
+
+GdkColormap *
+gdk_imlib_get_colormap()
+{
+ return (id->x.gdk_cmap);
+}
+
+gchar *
+gdk_imlib_get_sysconfig()
+{
+ if (!id->x.disp)
+ return NULL;
+ return strdup(SYSTEM_IMRC);
+}
+
+/*
+ * Make sure we don't wrap on our memory allocations
+ */
+
+void *_gdk_malloc_image(unsigned int w, unsigned int h)
+{
+ if( w > 32767 || h > 32767)
+ return NULL;
+ return malloc(w * h * 3);
+}