parent
8a957fb01b
commit
8898389aba
13
Makefile
13
Makefile
|
@ -70,9 +70,9 @@ LN_S = ln -s
|
|||
LTLIBOBJS =
|
||||
MAKEINFO = makeinfo
|
||||
NM = /usr/bin/nm -B
|
||||
OBJDUMP =
|
||||
PACKAGE = imlib
|
||||
RANLIB = ranlib
|
||||
USE_SYMBOL_UNDERSCORE = no
|
||||
VERSION = 2.0
|
||||
pkglibdir = ${libdir}/loaders
|
||||
|
||||
|
@ -95,7 +95,7 @@ png_la_LDFLAGS = -no-undefined -module -avoid-version
|
|||
png_la_LIBADD = -lpng -lz -lX11 -lXext
|
||||
|
||||
bin_PROGRAMS = imlib2
|
||||
imlib2_SOURCES = rend.c ximage.c scale.c main.c rgba.c image.c color.c grab.c blend.c file.c rgbadraw.c api.c draw.c
|
||||
imlib2_SOURCES = rend.c ximage.c scale.c main.c rgba.c image.c color.c grab.c blend.c file.c rgbadraw.c api.c draw.c context.c
|
||||
|
||||
imlib2_LDADD = -export-dynamic $(top_builddir)/libltdl/libltdlc.la -lX11 -lXext
|
||||
|
||||
|
@ -115,7 +115,7 @@ png_la_OBJECTS = loader_png.lo
|
|||
PROGRAMS = $(bin_PROGRAMS)
|
||||
|
||||
imlib2_OBJECTS = rend.o ximage.o scale.o main.o rgba.o image.o color.o \
|
||||
grab.o blend.o file.o rgbadraw.o api.o draw.o
|
||||
grab.o blend.o file.o rgbadraw.o api.o draw.o context.o
|
||||
imlib2_DEPENDENCIES = $(top_builddir)/libltdl/libltdlc.la
|
||||
imlib2_LDFLAGS =
|
||||
CFLAGS = -O2 -mpentium -mcpu=pentium -march=pentium -malign-loops=2 -malign-jumps=2 -malign-functions=2 -g -W -Wall -Wmissing-prototypes -Wmissing-declarations -Wpointer-arith
|
||||
|
@ -132,9 +132,10 @@ DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
|||
|
||||
TAR = gtar
|
||||
GZIP_ENV = --best
|
||||
DEP_FILES = .deps/api.P .deps/blend.P .deps/color.P .deps/draw.P \
|
||||
.deps/file.P .deps/grab.P .deps/image.P .deps/loader_png.P .deps/main.P \
|
||||
.deps/rend.P .deps/rgba.P .deps/rgbadraw.P .deps/scale.P .deps/ximage.P
|
||||
DEP_FILES = .deps/api.P .deps/blend.P .deps/color.P .deps/context.P \
|
||||
.deps/draw.P .deps/file.P .deps/grab.P .deps/image.P .deps/loader_png.P \
|
||||
.deps/main.P .deps/rend.P .deps/rgba.P .deps/rgbadraw.P .deps/scale.P \
|
||||
.deps/ximage.P
|
||||
SOURCES = $(png_la_SOURCES) $(imlib2_SOURCES)
|
||||
OBJECTS = $(png_la_OBJECTS) $(imlib2_OBJECTS)
|
||||
|
||||
|
|
|
@ -21,7 +21,8 @@ png_la_LIBADD = -lpng -lz -lX11 -lXext
|
|||
|
||||
bin_PROGRAMS = imlib2
|
||||
imlib2_SOURCES = rend.c ximage.c scale.c main.c rgba.c image.c \
|
||||
color.c grab.c blend.c file.c rgbadraw.c api.c draw.c
|
||||
color.c grab.c blend.c file.c rgbadraw.c api.c draw.c \
|
||||
context.c
|
||||
imlib2_LDADD = @DLLDFLAGS@ $(top_builddir)/libltdl/libltdlc.la -lX11 -lXext
|
||||
|
||||
SYS_LOADERS_PATH = @pkglibdir@
|
||||
|
|
19
api.c
19
api.c
|
@ -3,6 +3,7 @@
|
|||
#include "scale.h"
|
||||
#include "image.h"
|
||||
#include "rend.h"
|
||||
#include "context.h"
|
||||
#include "rgba.h"
|
||||
#include "color.h"
|
||||
#include "file.h"
|
||||
|
@ -19,7 +20,6 @@ typedef void (*Imlib_Internal_Progress_Function)(ImlibImage*, char,
|
|||
char
|
||||
imlib_init(void)
|
||||
{
|
||||
__imlib_RGBA_init();
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -35,6 +35,12 @@ imlib_set_cache_size(int bytes)
|
|||
__imlib_SetCacheSize(bytes);
|
||||
}
|
||||
|
||||
int
|
||||
imlib_get_color_usage(void)
|
||||
{
|
||||
return (int)_max_colors;
|
||||
}
|
||||
|
||||
void
|
||||
imlib_set_color_usage(int max)
|
||||
{
|
||||
|
@ -163,7 +169,7 @@ imlib_image_has_alpha(Imlib_Image image)
|
|||
}
|
||||
|
||||
void
|
||||
imlib_set_image_never_changes_on_disk(Imlib_Image image)
|
||||
imlib_image_set_never_changes_on_disk(Imlib_Image image)
|
||||
{
|
||||
ImlibImage *im;
|
||||
|
||||
|
@ -210,6 +216,15 @@ imlib_image_format(Imlib_Image image)
|
|||
return im->format;
|
||||
}
|
||||
|
||||
void
|
||||
imlib_image_set_has_alpha(Imlib_Image image, char has_alpha)
|
||||
{
|
||||
ImlibImage *im;
|
||||
|
||||
CAST_IMAGE(im, image);
|
||||
UNSET_FLAG(im->flags, F_HAS_ALPHA);
|
||||
}
|
||||
|
||||
void
|
||||
imlib_render_pixmaps_for_whole_image(Imlib_Image image, Display *display,
|
||||
Drawable drawable, Visual *visual,
|
||||
|
|
37
api.h
37
api.h
|
@ -25,6 +25,7 @@ typedef void (*Imlib_Progress_Function)(Imlib_Image *im, char percent,
|
|||
char imlib_init(void);
|
||||
int imlib_get_cache_size(void);
|
||||
void imlib_set_cache_size(int bytes);
|
||||
int imlib_get_color_usage(void);
|
||||
void imlib_set_color_usage(int max);
|
||||
|
||||
/* image loading functions */
|
||||
|
@ -47,12 +48,13 @@ void imlib_free_image_and_decache(Imlib_Image image);
|
|||
int imlib_get_image_width(Imlib_Image image);
|
||||
int imlib_get_image_height(Imlib_Image image);
|
||||
DATA32 *imlib_get_image_data(Imlib_Image image);
|
||||
void imlib_put_back_image_data(Imlib_Image image);
|
||||
char imlib_image_has_alpha(Imlib_Image image);
|
||||
void imlib_set_image_never_changes_on_disk(Imlib_Image image);
|
||||
char *imlib_image_format(Imlib_Image image);
|
||||
void imlib_put_back_image_data(Imlib_Image image);
|
||||
void imlib_image_set_has_alpha(Imlib_Image image, char has_alpha);
|
||||
void imlib_image_set_never_changes_on_disk(Imlib_Image image);
|
||||
void imlib_image_get_border(Imlib_Image image, Imlib_Border *border);
|
||||
void imlib_image_set_border(Imlib_Image image, Imlib_Border *border);
|
||||
char *imlib_image_format(Imlib_Image image);
|
||||
|
||||
/* image drawing/rendering functions */
|
||||
|
||||
|
@ -95,6 +97,9 @@ void imlib_blend_image_onto_image(Imlib_Image source_image,
|
|||
int destination_x, int destination_y,
|
||||
int destination_width, int destination_height);
|
||||
|
||||
/* draw line, polygon, rect - with option of drawing in rgb or alpha or both */
|
||||
/* apply alpha of one image to another */
|
||||
|
||||
/* image creation and grabbing */
|
||||
Imlib_Image imlib_create_image_using_data(int width, int height,
|
||||
DATA32 *data);
|
||||
|
@ -106,6 +111,30 @@ Imlib_Image imlib_create_image_from_drawable(Display *display,
|
|||
Colormap colormap, int depth,
|
||||
int x, int y,
|
||||
int width, int height);
|
||||
|
||||
Imlib_Image imlib_clone_image(Imlib_Image image);
|
||||
#if 0
|
||||
Imlib_image imlib_create_cropped_image(Imlib_Image image,
|
||||
int x, int y, int width, int height);
|
||||
Imlib_image imlib_create_cropped_scaled_image(Imlib_Image image,
|
||||
int source_x, int source_y,
|
||||
int source_width,
|
||||
int source_height,
|
||||
int destination_width,
|
||||
int destination_height);
|
||||
/* image modification - geometry */
|
||||
void imlib_create_cropped_image(Imlib_Image image, int x, int y, int width,
|
||||
int height);
|
||||
void imlib_cropp_scale_image(Imlib_Image image, int source_x, int source_y,
|
||||
int source_width, int source_height);
|
||||
|
||||
/* image modification - color */
|
||||
|
||||
/* image modification - rotation */
|
||||
|
||||
/* image modification - blur / sharpen */
|
||||
|
||||
/* image modification - special (seamless tile (h, v & both) etc) */
|
||||
|
||||
/* image saving functions */
|
||||
#endif
|
||||
#endif
|
||||
|
|
153
color.c
153
color.c
|
@ -1,35 +1,56 @@
|
|||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
#include "common.h"
|
||||
#include "color.h"
|
||||
|
||||
DATA8 _dither_color_lut[256];
|
||||
DATA8 _pal_type = 0;
|
||||
DATA16 _max_colors = 256;
|
||||
|
||||
void
|
||||
__imlib_AllocColorTable(Display *d, Colormap cmap)
|
||||
DATA8 *
|
||||
__imlib_AllocColorTable(Display *d, Colormap cmap, DATA8 *type_return)
|
||||
{
|
||||
if ((_max_colors >= 256) && (__imlib_AllocColors332(d, cmap)))
|
||||
return;
|
||||
if ((_max_colors >= 128) &&(__imlib_AllocColors232(d, cmap)))
|
||||
return;
|
||||
if ((_max_colors >= 64) &&(__imlib_AllocColors222(d, cmap)))
|
||||
return;
|
||||
if ((_max_colors >= 32) &&(__imlib_AllocColors221(d, cmap)))
|
||||
return;
|
||||
if ((_max_colors >= 16) &&(__imlib_AllocColors121(d, cmap)))
|
||||
return;
|
||||
if ((_max_colors >= 8) &&(__imlib_AllocColors111(d, cmap)))
|
||||
return;
|
||||
DATA8 *color_lut = NULL;
|
||||
|
||||
if ((_max_colors >= 256) && (color_lut = __imlib_AllocColors332(d, cmap)))
|
||||
{
|
||||
*type_return = _pal_type;
|
||||
return color_lut;
|
||||
}
|
||||
if ((_max_colors >= 128) && (color_lut = __imlib_AllocColors232(d, cmap)))
|
||||
{
|
||||
*type_return = _pal_type;
|
||||
return color_lut;
|
||||
}
|
||||
if ((_max_colors >= 64) && (color_lut = __imlib_AllocColors222(d, cmap)))
|
||||
{
|
||||
*type_return = _pal_type;
|
||||
return color_lut;
|
||||
}
|
||||
if ((_max_colors >= 32) && (color_lut = __imlib_AllocColors221(d, cmap)))
|
||||
{
|
||||
*type_return = _pal_type;
|
||||
return color_lut;
|
||||
}
|
||||
if ((_max_colors >= 16) && (color_lut = __imlib_AllocColors121(d, cmap)))
|
||||
{
|
||||
*type_return = _pal_type;
|
||||
return color_lut;
|
||||
}
|
||||
if ((_max_colors >= 8) && (color_lut = __imlib_AllocColors111(d, cmap)))
|
||||
{
|
||||
*type_return = _pal_type;
|
||||
return color_lut;
|
||||
}
|
||||
__imlib_AllocColors1(d, cmap);
|
||||
return color_lut;
|
||||
}
|
||||
|
||||
char
|
||||
DATA8 *
|
||||
__imlib_AllocColors332(Display *d, Colormap cmap)
|
||||
{
|
||||
int r, g, b, i = 0;
|
||||
|
||||
DATA8 *color_lut;
|
||||
|
||||
color_lut = malloc(256 * sizeof(DATA8));
|
||||
for (r = 0; r < 8; r++)
|
||||
{
|
||||
for (g = 0; g < 8; g++)
|
||||
|
@ -53,25 +74,28 @@ __imlib_AllocColors332(Display *d, Colormap cmap)
|
|||
if (i > 0)
|
||||
{
|
||||
for(j = 0; j < i; j++)
|
||||
pixels[j] = (unsigned long) _dither_color_lut[j];
|
||||
pixels[j] = (unsigned long) color_lut[j];
|
||||
XFreeColors(d, cmap, pixels, i, 0);
|
||||
}
|
||||
return 0;
|
||||
free(color_lut);
|
||||
return NULL;
|
||||
}
|
||||
_dither_color_lut[i] = xcl.pixel;
|
||||
color_lut[i] = xcl.pixel;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
_pal_type = 0;
|
||||
return 1;
|
||||
return color_lut;
|
||||
}
|
||||
|
||||
char
|
||||
DATA8 *
|
||||
__imlib_AllocColors232(Display *d, Colormap cmap)
|
||||
{
|
||||
int r, g, b, i = 0;
|
||||
|
||||
DATA8 *color_lut;
|
||||
|
||||
color_lut = malloc(128 * sizeof(DATA8));
|
||||
for (r = 0; r < 4; r++)
|
||||
{
|
||||
for (g = 0; g < 8; g++)
|
||||
|
@ -95,25 +119,28 @@ __imlib_AllocColors232(Display *d, Colormap cmap)
|
|||
if (i > 0)
|
||||
{
|
||||
for(j = 0; j < i; j++)
|
||||
pixels[j] = (unsigned long) _dither_color_lut[j];
|
||||
pixels[j] = (unsigned long) color_lut[j];
|
||||
XFreeColors(d, cmap, pixels, i, 0);
|
||||
}
|
||||
return 0;
|
||||
free(color_lut);
|
||||
return NULL;
|
||||
}
|
||||
_dither_color_lut[i] = xcl.pixel;
|
||||
color_lut[i] = xcl.pixel;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
_pal_type = 1;
|
||||
return 1;
|
||||
return color_lut;
|
||||
}
|
||||
|
||||
char
|
||||
DATA8 *
|
||||
__imlib_AllocColors222(Display *d, Colormap cmap)
|
||||
{
|
||||
int r, g, b, i = 0;
|
||||
|
||||
DATA8 *color_lut;
|
||||
|
||||
color_lut = malloc(64 * sizeof(DATA8));
|
||||
for (r = 0; r < 4; r++)
|
||||
{
|
||||
for (g = 0; g < 4; g++)
|
||||
|
@ -137,25 +164,28 @@ __imlib_AllocColors222(Display *d, Colormap cmap)
|
|||
if (i > 0)
|
||||
{
|
||||
for(j = 0; j < i; j++)
|
||||
pixels[j] = (unsigned long) _dither_color_lut[j];
|
||||
pixels[j] = (unsigned long) color_lut[j];
|
||||
XFreeColors(d, cmap, pixels, i, 0);
|
||||
}
|
||||
return 0;
|
||||
free(color_lut);
|
||||
return NULL;
|
||||
}
|
||||
_dither_color_lut[i] = xcl.pixel;
|
||||
color_lut[i] = xcl.pixel;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
_pal_type = 2;
|
||||
return 1;
|
||||
return color_lut;
|
||||
}
|
||||
|
||||
char
|
||||
DATA8 *
|
||||
__imlib_AllocColors221(Display *d, Colormap cmap)
|
||||
{
|
||||
int r, g, b, i = 0;
|
||||
|
||||
DATA8 *color_lut;
|
||||
|
||||
color_lut = malloc(32 * sizeof(DATA8));
|
||||
for (r = 0; r < 4; r++)
|
||||
{
|
||||
for (g = 0; g < 4; g++)
|
||||
|
@ -179,25 +209,28 @@ __imlib_AllocColors221(Display *d, Colormap cmap)
|
|||
if (i > 0)
|
||||
{
|
||||
for(j = 0; j < i; j++)
|
||||
pixels[j] = (unsigned long) _dither_color_lut[j];
|
||||
pixels[j] = (unsigned long) color_lut[j];
|
||||
XFreeColors(d, cmap, pixels, i, 0);
|
||||
}
|
||||
return 0;
|
||||
free(color_lut);
|
||||
return NULL;
|
||||
}
|
||||
_dither_color_lut[i] = xcl.pixel;
|
||||
color_lut[i] = xcl.pixel;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
_pal_type = 3;
|
||||
return 1;
|
||||
return color_lut;
|
||||
}
|
||||
|
||||
char
|
||||
DATA8 *
|
||||
__imlib_AllocColors121(Display *d, Colormap cmap)
|
||||
{
|
||||
int r, g, b, i = 0;
|
||||
|
||||
DATA8 *color_lut;
|
||||
|
||||
color_lut = malloc(16 * sizeof(DATA8));
|
||||
for (r = 0; r < 2; r++)
|
||||
{
|
||||
for (g = 0; g < 4; g++)
|
||||
|
@ -221,25 +254,28 @@ __imlib_AllocColors121(Display *d, Colormap cmap)
|
|||
if (i > 0)
|
||||
{
|
||||
for(j = 0; j < i; j++)
|
||||
pixels[j] = (unsigned long) _dither_color_lut[j];
|
||||
pixels[j] = (unsigned long) color_lut[j];
|
||||
XFreeColors(d, cmap, pixels, i, 0);
|
||||
}
|
||||
return 0;
|
||||
free(color_lut);
|
||||
return NULL;
|
||||
}
|
||||
_dither_color_lut[i] = xcl.pixel;
|
||||
color_lut[i] = xcl.pixel;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
_pal_type = 4;
|
||||
return 1;
|
||||
return color_lut;
|
||||
}
|
||||
|
||||
char
|
||||
DATA8 *
|
||||
__imlib_AllocColors111(Display *d, Colormap cmap)
|
||||
{
|
||||
int r, g, b, i = 0;
|
||||
|
||||
DATA8 *color_lut;
|
||||
|
||||
color_lut = malloc(8 * sizeof(DATA8));
|
||||
for (r = 0; r < 2; r++)
|
||||
{
|
||||
for (g = 0; g < 2; g++)
|
||||
|
@ -263,35 +299,38 @@ __imlib_AllocColors111(Display *d, Colormap cmap)
|
|||
if (i > 0)
|
||||
{
|
||||
for(j = 0; j < i; j++)
|
||||
pixels[j] = (unsigned long) _dither_color_lut[j];
|
||||
pixels[j] = (unsigned long) color_lut[j];
|
||||
XFreeColors(d, cmap, pixels, i, 0);
|
||||
}
|
||||
return 0;
|
||||
free(color_lut);
|
||||
return NULL;
|
||||
}
|
||||
_dither_color_lut[i] = xcl.pixel;
|
||||
color_lut[i] = xcl.pixel;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
_pal_type = 5;
|
||||
return 1;
|
||||
return color_lut;
|
||||
}
|
||||
|
||||
char
|
||||
DATA8 *
|
||||
__imlib_AllocColors1(Display *d, Colormap cmap)
|
||||
{
|
||||
XColor xcl;
|
||||
|
||||
DATA8 *color_lut;
|
||||
|
||||
color_lut = malloc(2 * sizeof(DATA8));
|
||||
xcl.red = (unsigned short)(0x0000);
|
||||
xcl.green = (unsigned short)(0x0000);
|
||||
xcl.blue = (unsigned short)(0x0000);
|
||||
XAllocColor(d, cmap, &xcl);
|
||||
_dither_color_lut[0] = xcl.pixel;
|
||||
color_lut[0] = xcl.pixel;
|
||||
xcl.red = (unsigned short)(0xffff);
|
||||
xcl.green = (unsigned short)(0xffff);
|
||||
xcl.blue = (unsigned short)(0xffff);
|
||||
XAllocColor(d, cmap, &xcl);
|
||||
_dither_color_lut[1] = xcl.pixel;
|
||||
color_lut[1] = xcl.pixel;
|
||||
_pal_type = 6;
|
||||
return 1;
|
||||
return color_lut;
|
||||
}
|
||||
|
|
20
color.h
20
color.h
|
@ -1,24 +1,22 @@
|
|||
#ifndef __COLOR
|
||||
#define __COLOR 1
|
||||
/* FIXME: DATA32 must become DATA8 */
|
||||
extern DATA8 _dither_color_lut[256];
|
||||
extern DATA8 _pal_type;
|
||||
extern DATA16 _max_colors;
|
||||
|
||||
void
|
||||
__imlib_AllocColorTable(Display *d, Colormap cmap);
|
||||
char
|
||||
DATA8 *
|
||||
__imlib_AllocColorTable(Display *d, Colormap cmap, DATA8 *type_return);
|
||||
DATA8 *
|
||||
__imlib_AllocColors332(Display *d, Colormap cmap);
|
||||
char
|
||||
DATA8 *
|
||||
__imlib_AllocColors232(Display *d, Colormap cmap);
|
||||
char
|
||||
DATA8 *
|
||||
__imlib_AllocColors222(Display *d, Colormap cmap);
|
||||
char
|
||||
DATA8 *
|
||||
__imlib_AllocColors221(Display *d, Colormap cmap);
|
||||
char
|
||||
DATA8 *
|
||||
__imlib_AllocColors121(Display *d, Colormap cmap);
|
||||
char
|
||||
DATA8 *
|
||||
__imlib_AllocColors111(Display *d, Colormap cmap);
|
||||
char
|
||||
DATA8 *
|
||||
__imlib_AllocColors1(Display *d, Colormap cmap);
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,196 @@
|
|||
#include <X11/Xlib.h>
|
||||
#include "common.h"
|
||||
#include "image.h"
|
||||
#include "context.h"
|
||||
#include "color.h"
|
||||
#include "rgba.h"
|
||||
|
||||
static Context *context = NULL;
|
||||
static int max_context_count = 128;
|
||||
static int context_counter = 0;
|
||||
|
||||
void
|
||||
__imlib_SetMaxContexts(int num)
|
||||
{
|
||||
max_context_count = num;
|
||||
__imlib_FlushContexts();
|
||||
}
|
||||
|
||||
int
|
||||
__imlib_GetMaxContexts(void)
|
||||
{
|
||||
return max_context_count;
|
||||
}
|
||||
|
||||
void
|
||||
__imlib_FlushContexts(void)
|
||||
{
|
||||
Context *ct, *pct, *ctt;
|
||||
|
||||
ct = context;
|
||||
pct = NULL;
|
||||
while (ct)
|
||||
{
|
||||
ctt = ct;
|
||||
ct = ct->next;
|
||||
/* it hasnt been referenced in the last max_context_count refernces */
|
||||
/* thus old and getrid of it */
|
||||
if (ctt->last_use < (context_counter - max_context_count))
|
||||
{
|
||||
if (pct)
|
||||
context = ctt->next;
|
||||
else
|
||||
pct->next = ctt->next;
|
||||
if (ctt->palette)
|
||||
{
|
||||
free(ctt->palette);
|
||||
free(ctt->r_dither);
|
||||
free(ctt->g_dither);
|
||||
free(ctt->b_dither);
|
||||
}
|
||||
else if (ctt->r_dither)
|
||||
{
|
||||
free(ctt->r_dither);
|
||||
free(ctt->g_dither);
|
||||
free(ctt->b_dither);
|
||||
}
|
||||
free(ctt);
|
||||
}
|
||||
else
|
||||
pct = ctt;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
__imlib_FreeContextForDisplay(Display *d)
|
||||
{
|
||||
Context *ct;
|
||||
|
||||
ct = context;
|
||||
while (ct)
|
||||
{
|
||||
if (ct->display == d)
|
||||
ct->last_use = - (max_context_count * 2);
|
||||
ct = ct->next;
|
||||
}
|
||||
__imlib_FlushContexts();
|
||||
}
|
||||
|
||||
void
|
||||
__imlib_FreeContextForColormap(Display *d, Colormap cm)
|
||||
{
|
||||
Context *ct;
|
||||
|
||||
ct = context;
|
||||
while (ct)
|
||||
{
|
||||
if ((ct->display == d) && (ct->colormap == cm))
|
||||
ct->last_use = - (max_context_count * 2);
|
||||
ct = ct->next;
|
||||
}
|
||||
__imlib_FlushContexts();
|
||||
}
|
||||
|
||||
void
|
||||
__imlib_FreeContextForVisual(Display *d, Visual *v)
|
||||
{
|
||||
Context *ct;
|
||||
|
||||
ct = context;
|
||||
while (ct)
|
||||
{
|
||||
if ((ct->display == d) && (ct->visual == v))
|
||||
ct->last_use = - (max_context_count * 2);
|
||||
ct = ct->next;
|
||||
}
|
||||
__imlib_FlushContexts();
|
||||
}
|
||||
|
||||
Context *
|
||||
__imlib_FindContext(Display *d, Visual *v, Colormap c, int depth)
|
||||
{
|
||||
Context *ct, *pct;
|
||||
|
||||
pct = NULL;
|
||||
ct = context;
|
||||
while (ct)
|
||||
{
|
||||
if ((ct->display == d) && (ct->visual == v) &&
|
||||
(ct->colormap == c) && (ct->depth == depth))
|
||||
{
|
||||
if (pct)
|
||||
{
|
||||
pct->next = ct->next;
|
||||
ct->next = context;
|
||||
context = ct;
|
||||
}
|
||||
return ct;
|
||||
}
|
||||
pct = ct;
|
||||
ct = ct->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Context *
|
||||
__imlib_NewContext(Display *d, Visual *v, Colormap c, int depth)
|
||||
{
|
||||
Context *ct;
|
||||
|
||||
context_counter++;
|
||||
ct = malloc(sizeof(Context));
|
||||
ct->last_use = context_counter;
|
||||
ct->display = d;
|
||||
ct->visual = v;
|
||||
ct->colormap = c;
|
||||
ct->depth = depth;
|
||||
ct->next = NULL;
|
||||
|
||||
if (depth <= 8)
|
||||
{
|
||||
ct->palette = __imlib_AllocColorTable(d, c, &(ct->palette_type));
|
||||
ct->r_dither = malloc(sizeof(DATA8) * 8 * 8 * 256);
|
||||
ct->g_dither = malloc(sizeof(DATA8) * 8 * 8 * 256);
|
||||
ct->b_dither = malloc(sizeof(DATA8) * 8 * 8 * 256);
|
||||
__imlib_RGBA_init((void *)ct->r_dither, (void *)ct->g_dither,
|
||||
(void *)ct->b_dither, depth, ct->palette_type);
|
||||
}
|
||||
else
|
||||
{
|
||||
ct->palette = NULL;
|
||||
ct->palette_type = 0;
|
||||
if ((depth > 8) && (depth <= 16))
|
||||
{
|
||||
ct->r_dither = malloc(sizeof(DATA16) * 4 * 4 * 256);
|
||||
ct->g_dither = malloc(sizeof(DATA16) * 4 * 4 * 256);
|
||||
ct->b_dither = malloc(sizeof(DATA16) * 4 * 4 * 256);
|
||||
__imlib_RGBA_init((void *)ct->r_dither, (void *)ct->g_dither,
|
||||
(void *)ct->b_dither, depth, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
ct->r_dither = NULL;
|
||||
ct->g_dither = NULL;
|
||||
ct->b_dither = NULL;
|
||||
}
|
||||
}
|
||||
return ct;
|
||||
}
|
||||
|
||||
Context *
|
||||
__imlib_GetContext(Display *d, Visual *v, Colormap c, int depth)
|
||||
{
|
||||
Context *ct;
|
||||
|
||||
ct = __imlib_FindContext(d, v, c, depth);
|
||||
if (ct)
|
||||
{
|
||||
ct->last_use = context_counter;
|
||||
return ct;
|
||||
}
|
||||
ct = __imlib_NewContext(d, v, c, depth);
|
||||
ct->next = context;
|
||||
context = ct;
|
||||
__imlib_FlushContexts();
|
||||
return ct;
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
#ifndef __CONTEXT
|
||||
#define __CONTEXT 1
|
||||
|
||||
typedef struct _context Context;
|
||||
|
||||
struct _context
|
||||
{
|
||||
int last_use;
|
||||
Display *display;
|
||||
Visual *visual;
|
||||
Colormap colormap;
|
||||
int depth;
|
||||
Context *next;
|
||||
|
||||
DATA8 *palette;
|
||||
DATA8 palette_type;
|
||||
void *r_dither;
|
||||
void *g_dither;
|
||||
void *b_dither;
|
||||
};
|
||||
|
||||
void __imlib_SetMaxContexts(int num);
|
||||
int __imlib_GetMaxContexts(void);
|
||||
void __imlib_FlushContexts(void);
|
||||
void __imlib_FreeContextForDisplay(Display *d);
|
||||
void __imlib_FreeContextForColormap(Display *d, Colormap cm);
|
||||
void __imlib_FreeContextForVisual(Display *d, Visual *v);
|
||||
Context *__imlib_FindContext(Display *d, Visual *v, Colormap c, int depth);
|
||||
Context *__imlib_NewContext(Display *d, Visual *v, Colormap c, int depth);
|
||||
Context *__imlib_GetContext(Display *d, Visual *v, Colormap c, int depth);
|
||||
|
||||
#endif
|
7
image.c
7
image.c
|
@ -161,6 +161,7 @@ __imlib_CurrentCacheSize(void)
|
|||
}
|
||||
ip = ip->next;
|
||||
}
|
||||
return current_cache;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -300,7 +301,7 @@ __imlib_RemoveImagePixmapFromCache(ImlibImagePixmap *ip)
|
|||
}
|
||||
|
||||
void
|
||||
__imlib_CleanupImagePixmapCache()
|
||||
__imlib_CleanupImagePixmapCache(void)
|
||||
{
|
||||
ImlibImagePixmap *ip, *ip_last;
|
||||
int current_cache;
|
||||
|
@ -348,9 +349,8 @@ LTDL_Init(void)
|
|||
{
|
||||
static int errors = LOADERS_UNINITIALISED;
|
||||
|
||||
|
||||
/* Do this only once! */
|
||||
if (errors = LOADERS_UNINITIALISED)
|
||||
if ((errors = LOADERS_UNINITIALISED))
|
||||
{
|
||||
errors = lt_dlinit();
|
||||
|
||||
|
@ -614,6 +614,7 @@ __imlib_CreateImage(int w, int h, DATA32 *data)
|
|||
im->data = data;
|
||||
im->references = 1;
|
||||
SET_FLAG(im->flags, F_UNCACHEABLE);
|
||||
return im;
|
||||
}
|
||||
|
||||
ImlibImage *
|
||||
|
|
2
image.h
2
image.h
|
@ -92,7 +92,7 @@ ImlibImagePixmap *__imlib_FindCachedImagePixmap(ImlibImage *im, int w, int h,
|
|||
char aa, char hiq, char dmask);
|
||||
void __imlib_AddImagePixmapToCache(ImlibImagePixmap *ip);
|
||||
void __imlib_RemoveImagePixmapFromCache(ImlibImagePixmap *ip);
|
||||
void __imlib_CleanupImagePixmapCache();
|
||||
void __imlib_CleanupImagePixmapCache(void);
|
||||
ImlibLoader *__imlib_ProduceLoader(char *file);
|
||||
char **__imlib_ListLoaders(int *num_ret);
|
||||
void __imlib_ConsumeLoader(ImlibLoader *l);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
# A brief demonstration of using Automake with Libtool. -*-Makefile-*-
|
||||
#
|
||||
AUTOMAKE_OPTIONS = no-dependencies foreign
|
||||
|
||||
if INSTALL_LTDL
|
||||
|
@ -20,25 +20,6 @@ libltdl_la_LIBADD = $(LIBADD_DL)
|
|||
libltdlc_la_SOURCES = ltdl.c
|
||||
libltdlc_la_LIBADD = $(LIBADD_DL)
|
||||
|
||||
## Because we do not have automatic dependency tracking:
|
||||
ltdl.lo: ltdl.h config.h
|
||||
|
||||
$(OBJECTS): libtool
|
||||
libtool: $(LIBTOOL_DEPS)
|
||||
$(SHELL) ./config.status --recheck
|
||||
|
||||
## This allows us to install libltdl without using ln and without creating
|
||||
## a world writeable directory.
|
||||
## FIXME: Removed this rule once automake can do this properly by itself.
|
||||
local-install-files: $(DISTFILES)
|
||||
-rm -rf $(DESTDIR)$(datadir)/libtool/libltdl
|
||||
$(mkinstalldirs) $(DESTDIR)$(datadir)/libtool/libltdl
|
||||
@for file in $(DISTFILES); do \
|
||||
d=$(srcdir); \
|
||||
if test -d $$d/$$file; then \
|
||||
cp -pr $$d/$$file $(DESTDIR)$(datadir)/libtool/libltdl/$$file; \
|
||||
else \
|
||||
test -f $(DESTDIR)$(datadir)/libtool/libltdl/$$file \
|
||||
|| cp -p $$d/$$file $(DESTDIR)$(datadir)/libtool/libltdl/$$file || :; \
|
||||
fi; \
|
||||
done
|
||||
|
|
|
@ -10,6 +10,9 @@
|
|||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
# A brief demonstration of using Automake with Libtool. -*-Makefile-*-
|
||||
#
|
||||
|
||||
|
||||
SHELL = @SHELL@
|
||||
|
||||
|
@ -70,9 +73,9 @@ LN_S = @LN_S@
|
|||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
NM = @NM@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
PACKAGE = @PACKAGE@
|
||||
RANLIB = @RANLIB@
|
||||
USE_SYMBOL_UNDERSCORE = @USE_SYMBOL_UNDERSCORE@
|
||||
VERSION = @VERSION@
|
||||
|
||||
AUTOMAKE_OPTIONS = no-dependencies foreign
|
||||
|
@ -112,8 +115,8 @@ CCLD = $(CC)
|
|||
LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
|
||||
HEADERS = $(include_HEADERS) $(noinst_HEADERS)
|
||||
|
||||
DIST_COMMON = README ./stamp-h.in COPYING.LIB Makefile.am Makefile.in \
|
||||
acconfig.h acinclude.m4 aclocal.m4 config.h.in configure configure.in
|
||||
DIST_COMMON = README ./stamp-h.in Makefile.am Makefile.in acinclude.m4 \
|
||||
aclocal.m4 config.h.in configure configure.in
|
||||
|
||||
|
||||
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||
|
@ -156,7 +159,7 @@ $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@$(srcdir)/stamp-h.in
|
|||
rm -f $(srcdir)/stamp-h.in; \
|
||||
$(MAKE) $(srcdir)/stamp-h.in; \
|
||||
else :; fi
|
||||
$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h
|
||||
$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
||||
cd $(top_srcdir) && $(AUTOHEADER)
|
||||
@echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null
|
||||
|
||||
|
@ -430,25 +433,10 @@ mostlyclean-generic distclean-generic clean-generic \
|
|||
maintainer-clean-generic clean mostlyclean distclean maintainer-clean
|
||||
|
||||
|
||||
ltdl.lo: ltdl.h config.h
|
||||
|
||||
$(OBJECTS): libtool
|
||||
libtool: $(LIBTOOL_DEPS)
|
||||
$(SHELL) ./config.status --recheck
|
||||
|
||||
local-install-files: $(DISTFILES)
|
||||
-rm -rf $(DESTDIR)$(datadir)/libtool/libltdl
|
||||
$(mkinstalldirs) $(DESTDIR)$(datadir)/libtool/libltdl
|
||||
@for file in $(DISTFILES); do \
|
||||
d=$(srcdir); \
|
||||
if test -d $$d/$$file; then \
|
||||
cp -pr $$d/$$file $(DESTDIR)$(datadir)/libtool/libltdl/$$file; \
|
||||
else \
|
||||
test -f $(DESTDIR)$(datadir)/libtool/libltdl/$$file \
|
||||
|| cp -p $$d/$$file $(DESTDIR)$(datadir)/libtool/libltdl/$$file || :; \
|
||||
fi; \
|
||||
done
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
## libtool.m4 - Configure libtool for the target system. -*-Shell-script-*-
|
||||
## Copyright (C) 1996-1999 Free Software Foundation, Inc.
|
||||
## Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
|
||||
## Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
|
||||
##
|
||||
## This program is free software; you can redistribute it and/or modify
|
||||
## it under the terms of the GNU General Public License as published by
|
||||
|
@ -21,7 +21,7 @@
|
|||
## configuration script generated by Autoconf, you may include it under
|
||||
## the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# serial 40 AC_PROG_LIBTOOL
|
||||
# serial 35 AC_PROG_LIBTOOL
|
||||
AC_DEFUN(AC_PROG_LIBTOOL,
|
||||
[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
|
||||
|
||||
|
@ -30,9 +30,8 @@ AC_CACHE_SAVE
|
|||
|
||||
# Actually configure libtool. ac_aux_dir is where install-sh is found.
|
||||
CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
|
||||
LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \
|
||||
LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \
|
||||
DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \
|
||||
LD="$LD" NM="$NM" RANLIB="$RANLIB" LN_S="$LN_S" \
|
||||
DLLTOOL="$DLLTOOL" AS="$AS" \
|
||||
${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \
|
||||
$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \
|
||||
|| AC_MSG_ERROR([libtool configure failed])
|
||||
|
@ -63,24 +62,25 @@ AC_REQUIRE([AC_PROG_RANLIB])dnl
|
|||
AC_REQUIRE([AC_PROG_CC])dnl
|
||||
AC_REQUIRE([AC_PROG_LD])dnl
|
||||
AC_REQUIRE([AC_PROG_NM])dnl
|
||||
AC_REQUIRE([AC_SYS_NM_PARSE])dnl
|
||||
AC_REQUIRE([AC_SYS_SYMBOL_UNDERSCORE])dnl
|
||||
AC_REQUIRE([AC_PROG_LN_S])dnl
|
||||
dnl
|
||||
|
||||
# Check for any special flags to pass to ltconfig.
|
||||
libtool_flags="--cache-file=$cache_file"
|
||||
#
|
||||
# the following will cause an existing older ltconfig to fail, so
|
||||
# we ignore this at the expense of the cache file... Checking this
|
||||
# will just take longer ... bummer!
|
||||
#libtool_flags="--cache-file=$cache_file"
|
||||
#
|
||||
test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
|
||||
test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
|
||||
test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install"
|
||||
test "$lt_dlopen" = yes && libtool_flags="$libtool_flags --enable-dlopen"
|
||||
test "$silent" = yes && libtool_flags="$libtool_flags --silent"
|
||||
test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
|
||||
test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
|
||||
ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN],
|
||||
[libtool_flags="$libtool_flags --enable-dlopen"])
|
||||
ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],
|
||||
[libtool_flags="$libtool_flags --enable-win32-dll"])
|
||||
AC_ARG_ENABLE(libtool-lock,
|
||||
[ --disable-libtool-lock avoid locking (might break parallel builds)])
|
||||
test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock"
|
||||
test x"$silent" = xyes && libtool_flags="$libtool_flags --silent"
|
||||
|
||||
# Some flags need to be propagated to the compiler or linker for good
|
||||
# libtool support.
|
||||
|
@ -116,28 +116,33 @@ case "$host" in
|
|||
fi
|
||||
;;
|
||||
|
||||
ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],
|
||||
[*-*-cygwin* | *-*-mingw*)
|
||||
AC_CHECK_TOOL(DLLTOOL, dlltool, false)
|
||||
AC_CHECK_TOOL(AS, as, false)
|
||||
AC_CHECK_TOOL(OBJDUMP, objdump, false)
|
||||
*-*-cygwin*)
|
||||
AC_SYS_LIBTOOL_CYGWIN
|
||||
;;
|
||||
])
|
||||
|
||||
esac
|
||||
|
||||
# enable the --disable-libtool-lock switch
|
||||
|
||||
AC_ARG_ENABLE(libtool-lock,
|
||||
[ --disable-libtool-lock force libtool not to do file locking],
|
||||
need_locks=$enableval,
|
||||
need_locks=yes)
|
||||
|
||||
if test x"$need_locks" = xno; then
|
||||
libtool_flags="$libtool_flags --disable-lock"
|
||||
fi
|
||||
])
|
||||
|
||||
# AC_LIBTOOL_DLOPEN - enable checks for dlopen support
|
||||
AC_DEFUN(AC_LIBTOOL_DLOPEN, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])])
|
||||
|
||||
# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's
|
||||
AC_DEFUN(AC_LIBTOOL_WIN32_DLL, [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])])
|
||||
# AC_LIBTOOL_DLOPEN - check for dlopen support
|
||||
AC_DEFUN(AC_LIBTOOL_DLOPEN, [lt_dlopen=yes])
|
||||
|
||||
# AC_ENABLE_SHARED - implement the --enable-shared flag
|
||||
# Usage: AC_ENABLE_SHARED[(DEFAULT)]
|
||||
# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
|
||||
# `yes'.
|
||||
AC_DEFUN(AC_ENABLE_SHARED, [dnl
|
||||
define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
|
||||
AC_DEFUN(AC_ENABLE_SHARED,
|
||||
[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
|
||||
AC_ARG_ENABLE(shared,
|
||||
changequote(<<, >>)dnl
|
||||
<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT],
|
||||
|
@ -162,15 +167,15 @@ enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl
|
|||
])
|
||||
|
||||
# AC_DISABLE_SHARED - set the default shared flag to --disable-shared
|
||||
AC_DEFUN(AC_DISABLE_SHARED, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
|
||||
AC_ENABLE_SHARED(no)])
|
||||
AC_DEFUN(AC_DISABLE_SHARED,
|
||||
[AC_ENABLE_SHARED(no)])
|
||||
|
||||
# AC_ENABLE_STATIC - implement the --enable-static flag
|
||||
# Usage: AC_ENABLE_STATIC[(DEFAULT)]
|
||||
# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
|
||||
# `yes'.
|
||||
AC_DEFUN(AC_ENABLE_STATIC, [dnl
|
||||
define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
|
||||
AC_DEFUN(AC_ENABLE_STATIC,
|
||||
[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
|
||||
AC_ARG_ENABLE(static,
|
||||
changequote(<<, >>)dnl
|
||||
<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT],
|
||||
|
@ -195,16 +200,16 @@ enable_static=AC_ENABLE_STATIC_DEFAULT)dnl
|
|||
])
|
||||
|
||||
# AC_DISABLE_STATIC - set the default static flag to --disable-static
|
||||
AC_DEFUN(AC_DISABLE_STATIC, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
|
||||
AC_ENABLE_STATIC(no)])
|
||||
AC_DEFUN(AC_DISABLE_STATIC,
|
||||
[AC_ENABLE_STATIC(no)])
|
||||
|
||||
|
||||
# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag
|
||||
# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)]
|
||||
# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
|
||||
# `yes'.
|
||||
AC_DEFUN(AC_ENABLE_FAST_INSTALL, [dnl
|
||||
define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
|
||||
AC_DEFUN(AC_ENABLE_FAST_INSTALL,
|
||||
[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
|
||||
AC_ARG_ENABLE(fast-install,
|
||||
changequote(<<, >>)dnl
|
||||
<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT],
|
||||
|
@ -229,8 +234,9 @@ enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl
|
|||
])
|
||||
|
||||
# AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install
|
||||
AC_DEFUN(AC_DISABLE_FAST_INSTALL, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
|
||||
AC_ENABLE_FAST_INSTALL(no)])
|
||||
AC_DEFUN(AC_DISABLE_FAST_INSTALL,
|
||||
[AC_ENABLE_FAST_INSTALL(no)])
|
||||
|
||||
|
||||
# AC_PROG_LD - find the path to the GNU or non-GNU linker
|
||||
AC_DEFUN(AC_PROG_LD,
|
||||
|
@ -248,7 +254,7 @@ if test "$ac_cv_prog_gcc" = yes; then
|
|||
case "$ac_prog" in
|
||||
# Accept absolute paths.
|
||||
changequote(,)dnl
|
||||
[\\/]* | [A-Za-z]:[\\/]*)
|
||||
/* | [A-Za-z]:[\\/]*)
|
||||
re_direlt='/[^/][^/]*/\.\./'
|
||||
changequote([,])dnl
|
||||
# Canonicalize the path of ld
|
||||
|
@ -274,10 +280,10 @@ else
|
|||
fi
|
||||
AC_CACHE_VAL(ac_cv_path_LD,
|
||||
[if test -z "$LD"; then
|
||||
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
|
||||
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
|
||||
for ac_dir in $PATH; do
|
||||
test -z "$ac_dir" && ac_dir=.
|
||||
if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
|
||||
if test -f "$ac_dir/$ac_prog"; then
|
||||
ac_cv_path_LD="$ac_dir/$ac_prog"
|
||||
# Check to see if the program is GNU ld. I'd rather use --version,
|
||||
# but apparently some GNU ld's only accept -v.
|
||||
|
@ -322,10 +328,10 @@ AC_CACHE_VAL(ac_cv_path_NM,
|
|||
# Let the user override the test.
|
||||
ac_cv_path_NM="$NM"
|
||||
else
|
||||
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
|
||||
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
|
||||
for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
|
||||
test -z "$ac_dir" && ac_dir=.
|
||||
if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then
|
||||
if test -f $ac_dir/nm; then
|
||||
# Check to see if the nm accepts a BSD-compat flag.
|
||||
# Adding the `sed 1q' prevents false positives on HP-UX, which says:
|
||||
# nm: unknown option "B" ignored
|
||||
|
@ -349,22 +355,227 @@ AC_MSG_RESULT([$NM])
|
|||
AC_SUBST(NM)
|
||||
])
|
||||
|
||||
# AC_CHECK_LIBM - check for math library
|
||||
AC_DEFUN(AC_CHECK_LIBM,
|
||||
# AC_SYS_NM_PARSE - Check for command to grab the raw symbol name followed
|
||||
# by C symbol name from nm.
|
||||
AC_DEFUN(AC_SYS_NM_PARSE,
|
||||
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
|
||||
LIBM=
|
||||
case "$host" in
|
||||
*-*-beos* | *-*-cygwin*)
|
||||
# These system don't have libm
|
||||
AC_REQUIRE([AC_PROG_NM])dnl
|
||||
# Check for command to grab the raw symbol name followed by C symbol from nm.
|
||||
AC_MSG_CHECKING([command to parse $NM output])
|
||||
AC_CACHE_VAL(ac_cv_sys_global_symbol_pipe,
|
||||
[# These are sane defaults that work on at least a few old systems.
|
||||
# {They come from Ultrix. What could be older than Ultrix?!! ;)}
|
||||
|
||||
changequote(,)dnl
|
||||
# Character class describing NM global symbol codes.
|
||||
ac_symcode='[BCDEGRST]'
|
||||
|
||||
# Regexp to match symbols that can be accessed directly from C.
|
||||
ac_sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
|
||||
|
||||
# Transform the above into a raw symbol and a C symbol.
|
||||
ac_symxfrm='\1 \2\3 \3'
|
||||
|
||||
# Transform an extracted symbol line into a proper C declaration
|
||||
ac_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
|
||||
|
||||
# Define system-specific variables.
|
||||
case "$host_os" in
|
||||
aix*)
|
||||
ac_symcode='[BCDT]'
|
||||
;;
|
||||
*-ncr-sysv4.3*)
|
||||
AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
|
||||
AC_CHECK_LIB(m, main, LIBM="$LIBM -lm")
|
||||
cygwin* | mingw*)
|
||||
ac_symcode='[ABCDGISTW]'
|
||||
;;
|
||||
*)
|
||||
AC_CHECK_LIB(m, main, LIBM="-lm")
|
||||
hpux*)
|
||||
ac_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'"
|
||||
;;
|
||||
irix*)
|
||||
ac_symcode='[BCDEGRST]'
|
||||
;;
|
||||
solaris*)
|
||||
ac_symcode='[BDT]'
|
||||
;;
|
||||
esac
|
||||
|
||||
# If we're using GNU nm, then use its standard symbol codes.
|
||||
if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
|
||||
ac_symcode='[ABCDGISTW]'
|
||||
fi
|
||||
changequote([,])dnl
|
||||
|
||||
# Try without a prefix undercore, then with it.
|
||||
for ac_symprfx in "" "_"; do
|
||||
|
||||
ac_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($ac_symcode\)[ ][ ]*\($ac_symprfx\)$ac_sympat$/$ac_symxfrm/p'"
|
||||
|
||||
# Check to see that the pipe works correctly.
|
||||
ac_pipe_works=no
|
||||
rm -f conftest.$ac_ext
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
char nm_test_var;
|
||||
void nm_test_func(){}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
int main(){nm_test_var='a';nm_test_func;return 0;}
|
||||
EOF
|
||||
|
||||
if AC_TRY_EVAL(ac_compile); then
|
||||
# Now try to grab the symbols.
|
||||
ac_nlist=conftest.nm
|
||||
|
||||
if AC_TRY_EVAL(NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
|
||||
|
||||
# Try sorting and uniquifying the output.
|
||||
if sort "$ac_nlist" | uniq > "$ac_nlist"T; then
|
||||
mv -f "$ac_nlist"T "$ac_nlist"
|
||||
else
|
||||
rm -f "$ac_nlist"T
|
||||
fi
|
||||
|
||||
# Make sure that we snagged all the symbols we need.
|
||||
if egrep ' nm_test_var$' "$ac_nlist" >/dev/null; then
|
||||
if egrep ' nm_test_func$' "$ac_nlist" >/dev/null; then
|
||||
cat <<EOF > conftest.c
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
EOF
|
||||
# Now generate the symbol file.
|
||||
eval "$ac_global_symbol_to_cdecl"' < "$ac_nlist" >> conftest.c'
|
||||
|
||||
cat <<EOF >> conftest.c
|
||||
#if defined (__STDC__) && __STDC__
|
||||
# define lt_ptr_t void *
|
||||
#else
|
||||
# define lt_ptr_t char *
|
||||
# define const
|
||||
#endif
|
||||
|
||||
/* The mapping between symbol names and symbols. */
|
||||
const struct {
|
||||
const char *name;
|
||||
lt_ptr_t address;
|
||||
}
|
||||
changequote(,)dnl
|
||||
lt_preloaded_symbols[] =
|
||||
changequote([,])dnl
|
||||
{
|
||||
EOF
|
||||
sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$ac_nlist" >> conftest.c
|
||||
cat <<\EOF >> conftest.c
|
||||
{0, (lt_ptr_t) 0}
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
EOF
|
||||
# Now try linking the two files.
|
||||
mv conftest.$ac_objext conftestm.$ac_objext
|
||||
ac_save_LIBS="$LIBS"
|
||||
ac_save_CFLAGS="$CFLAGS"
|
||||
LIBS="conftestm.$ac_objext"
|
||||
CFLAGS="$CFLAGS$no_builtin_flag"
|
||||
if AC_TRY_EVAL(ac_link) && test -s conftest; then
|
||||
ac_pipe_works=yes
|
||||
else
|
||||
echo "configure: failed program was:" >&AC_FD_CC
|
||||
cat conftest.c >&AC_FD_CC
|
||||
fi
|
||||
LIBS="$ac_save_LIBS"
|
||||
CFLAGS="$ac_save_CFLAGS"
|
||||
else
|
||||
echo "cannot find nm_test_func in $ac_nlist" >&AC_FD_CC
|
||||
fi
|
||||
else
|
||||
echo "cannot find nm_test_var in $ac_nlist" >&AC_FD_CC
|
||||
fi
|
||||
else
|
||||
echo "cannot run $ac_cv_sys_global_symbol_pipe" >&AC_FD_CC
|
||||
fi
|
||||
else
|
||||
echo "$progname: failed program was:" >&AC_FD_CC
|
||||
cat conftest.c >&AC_FD_CC
|
||||
fi
|
||||
rm -rf conftest*
|
||||
|
||||
# Do not use the global_symbol_pipe unless it works.
|
||||
if test "$ac_pipe_works" = yes; then
|
||||
if test x"$ac_symprfx" = x"_"; then
|
||||
ac_cv_sys_symbol_underscore=yes
|
||||
else
|
||||
ac_cv_sys_symbol_underscore=no
|
||||
fi
|
||||
break
|
||||
else
|
||||
ac_cv_sys_global_symbol_pipe=
|
||||
fi
|
||||
done
|
||||
])
|
||||
|
||||
ac_result=yes
|
||||
if test -z "$ac_cv_sys_global_symbol_pipe"; then
|
||||
ac_result=no
|
||||
fi
|
||||
AC_MSG_RESULT($ac_result)
|
||||
])
|
||||
|
||||
# AC_SYS_LIBTOOL_CYGWIN - find tools needed on cygwin
|
||||
AC_DEFUN(AC_SYS_LIBTOOL_CYGWIN,
|
||||
[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
|
||||
AC_CHECK_TOOL(AS, as, false)
|
||||
])
|
||||
|
||||
# AC_SYS_SYMBOL_UNDERSCORE - does the compiler prefix global symbols
|
||||
# with an underscore?
|
||||
AC_DEFUN(AC_SYS_SYMBOL_UNDERSCORE,
|
||||
[AC_REQUIRE([AC_PROG_NM])dnl
|
||||
AC_REQUIRE([AC_SYS_NM_PARSE])dnl
|
||||
AC_MSG_CHECKING([for _ prefix in compiled symbols])
|
||||
AC_CACHE_VAL(ac_cv_sys_symbol_underscore,
|
||||
[ac_cv_sys_symbol_underscore=no
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
void nm_test_func(){}
|
||||
int main(){nm_test_func;return 0;}
|
||||
EOF
|
||||
if AC_TRY_EVAL(ac_compile); then
|
||||
# Now try to grab the symbols.
|
||||
ac_nlist=conftest.nm
|
||||
if AC_TRY_EVAL(NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
|
||||
# See whether the symbols have a leading underscore.
|
||||
if egrep '^. _nm_test_func' "$ac_nlist" >/dev/null; then
|
||||
ac_cv_sys_symbol_underscore=yes
|
||||
else
|
||||
if egrep '^. nm_test_func ' "$ac_nlist" >/dev/null; then
|
||||
:
|
||||
else
|
||||
echo "configure: cannot find nm_test_func in $ac_nlist" >&AC_FD_CC
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo "configure: cannot run $ac_cv_sys_global_symbol_pipe" >&AC_FD_CC
|
||||
fi
|
||||
else
|
||||
echo "configure: failed program was:" >&AC_FD_CC
|
||||
cat conftest.c >&AC_FD_CC
|
||||
fi
|
||||
rm -rf conftest*
|
||||
])
|
||||
AC_MSG_RESULT($ac_cv_sys_symbol_underscore)
|
||||
USE_SYMBOL_UNDERSCORE=${ac_cv_sys_symbol_underscore=no}
|
||||
AC_SUBST(USE_SYMBOL_UNDERSCORE)dnl
|
||||
])
|
||||
|
||||
# AC_CHECK_LIBM - check for math library
|
||||
AC_DEFUN(AC_CHECK_LIBM, [
|
||||
AC_CHECK_LIB(mw, _mwvalidcheckl)
|
||||
AC_CHECK_LIB(m, cos)
|
||||
])
|
||||
|
||||
# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for
|
||||
|
@ -375,14 +586,13 @@ esac
|
|||
# '${top_builddir}/' (note the single quotes!) if your package is not
|
||||
# flat, and, if you're not using automake, define top_builddir as
|
||||
# appropriate in the Makefiles.
|
||||
AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
|
||||
AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [
|
||||
case "$enable_ltdl_convenience" in
|
||||
no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
|
||||
"") enable_ltdl_convenience=yes
|
||||
ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
|
||||
esac
|
||||
LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdlc.la
|
||||
INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl'])
|
||||
])
|
||||
|
||||
# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for
|
||||
|
@ -394,23 +604,16 @@ AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
|
|||
# flat, and, if you're not using automake, define top_builddir as
|
||||
# appropriate in the Makefiles.
|
||||
# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
|
||||
AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
|
||||
AC_CHECK_LIB(ltdl, main,
|
||||
[test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
|
||||
[if test x"$enable_ltdl_install" = xno; then
|
||||
AC_MSG_WARN([libltdl not installed, but installation disabled])
|
||||
else
|
||||
enable_ltdl_install=yes
|
||||
fi
|
||||
AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [
|
||||
AC_CHECK_LIB(ltdl, main, LIBLTDL="-lltdl", [
|
||||
case "$enable_ltdl_install" in
|
||||
no) AC_MSG_WARN([libltdl not installed, but installation disabled]) ;;
|
||||
"") enable_ltdl_install=yes
|
||||
ac_configure_args="$ac_configure_args --enable-ltdl-install" ;;
|
||||
esac
|
||||
])
|
||||
if test x"$enable_ltdl_install" = x"yes"; then
|
||||
ac_configure_args="$ac_configure_args --enable-ltdl-install"
|
||||
if test x"$enable_ltdl_install" != x"no"; then
|
||||
LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdl.la
|
||||
INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl'])
|
||||
else
|
||||
ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
|
||||
LIBLTDL="-lltdl"
|
||||
INCLTDL=
|
||||
fi
|
||||
])
|
||||
|
||||
|
@ -422,6 +625,6 @@ AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl
|
|||
AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl
|
||||
AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl
|
||||
AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl
|
||||
|
||||
dnl This is just to silence aclocal about the macro not being used
|
||||
ifelse([AC_DISABLE_FAST_INSTALL])dnl
|
||||
AC_DEFUN(AM_SYS_NM_PARSE, [indir([AC_SYS_NM_PARSE])])dnl
|
||||
AC_DEFUN(AM_SYS_SYMBOL_UNDERSCORE, [indir([AC_SYS_SYMBOL_UNDERSCORE])])dnl
|
||||
AC_DEFUN(AM_SYS_LIBTOOL_CYGWIN, [indir([AC_SYS_LIBTOOL_CYGWIN])])dnl
|
||||
|
|
|
@ -11,7 +11,7 @@ dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|||
dnl PARTICULAR PURPOSE.
|
||||
|
||||
|
||||
# serial 40 AC_PROG_LIBTOOL
|
||||
# serial 35 AC_PROG_LIBTOOL
|
||||
AC_DEFUN(AC_PROG_LIBTOOL,
|
||||
[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
|
||||
|
||||
|
@ -20,9 +20,8 @@ AC_CACHE_SAVE
|
|||
|
||||
# Actually configure libtool. ac_aux_dir is where install-sh is found.
|
||||
CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
|
||||
LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \
|
||||
LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \
|
||||
DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \
|
||||
LD="$LD" NM="$NM" RANLIB="$RANLIB" LN_S="$LN_S" \
|
||||
DLLTOOL="$DLLTOOL" AS="$AS" \
|
||||
${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \
|
||||
$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \
|
||||
|| AC_MSG_ERROR([libtool configure failed])
|
||||
|
@ -53,6 +52,8 @@ AC_REQUIRE([AC_PROG_RANLIB])dnl
|
|||
AC_REQUIRE([AC_PROG_CC])dnl
|
||||
AC_REQUIRE([AC_PROG_LD])dnl
|
||||
AC_REQUIRE([AC_PROG_NM])dnl
|
||||
AC_REQUIRE([AC_SYS_NM_PARSE])dnl
|
||||
AC_REQUIRE([AC_SYS_SYMBOL_UNDERSCORE])dnl
|
||||
AC_REQUIRE([AC_PROG_LN_S])dnl
|
||||
dnl
|
||||
|
||||
|
@ -61,16 +62,10 @@ libtool_flags="--cache-file=$cache_file"
|
|||
test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
|
||||
test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
|
||||
test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install"
|
||||
test "$lt_dlopen" = yes && libtool_flags="$libtool_flags --enable-dlopen"
|
||||
test "$silent" = yes && libtool_flags="$libtool_flags --silent"
|
||||
test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
|
||||
test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
|
||||
ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN],
|
||||
[libtool_flags="$libtool_flags --enable-dlopen"])
|
||||
ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],
|
||||
[libtool_flags="$libtool_flags --enable-win32-dll"])
|
||||
AC_ARG_ENABLE(libtool-lock,
|
||||
[ --disable-libtool-lock avoid locking (might break parallel builds)])
|
||||
test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock"
|
||||
test x"$silent" = xyes && libtool_flags="$libtool_flags --silent"
|
||||
|
||||
# Some flags need to be propagated to the compiler or linker for good
|
||||
# libtool support.
|
||||
|
@ -106,28 +101,33 @@ case "$host" in
|
|||
fi
|
||||
;;
|
||||
|
||||
ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],
|
||||
[*-*-cygwin* | *-*-mingw*)
|
||||
AC_CHECK_TOOL(DLLTOOL, dlltool, false)
|
||||
AC_CHECK_TOOL(AS, as, false)
|
||||
AC_CHECK_TOOL(OBJDUMP, objdump, false)
|
||||
*-*-cygwin*)
|
||||
AC_SYS_LIBTOOL_CYGWIN
|
||||
;;
|
||||
])
|
||||
|
||||
esac
|
||||
|
||||
# enable the --disable-libtool-lock switch
|
||||
|
||||
AC_ARG_ENABLE(libtool-lock,
|
||||
[ --disable-libtool-lock force libtool not to do file locking],
|
||||
need_locks=$enableval,
|
||||
need_locks=yes)
|
||||
|
||||
if test x"$need_locks" = xno; then
|
||||
libtool_flags="$libtool_flags --disable-lock"
|
||||
fi
|
||||
])
|
||||
|
||||
# AC_LIBTOOL_DLOPEN - enable checks for dlopen support
|
||||
AC_DEFUN(AC_LIBTOOL_DLOPEN, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])])
|
||||
|
||||
# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's
|
||||
AC_DEFUN(AC_LIBTOOL_WIN32_DLL, [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])])
|
||||
# AC_LIBTOOL_DLOPEN - check for dlopen support
|
||||
AC_DEFUN(AC_LIBTOOL_DLOPEN, [lt_dlopen=yes])
|
||||
|
||||
# AC_ENABLE_SHARED - implement the --enable-shared flag
|
||||
# Usage: AC_ENABLE_SHARED[(DEFAULT)]
|
||||
# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
|
||||
# `yes'.
|
||||
AC_DEFUN(AC_ENABLE_SHARED, [dnl
|
||||
define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
|
||||
AC_DEFUN(AC_ENABLE_SHARED,
|
||||
[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
|
||||
AC_ARG_ENABLE(shared,
|
||||
changequote(<<, >>)dnl
|
||||
<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT],
|
||||
|
@ -152,15 +152,15 @@ enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl
|
|||
])
|
||||
|
||||
# AC_DISABLE_SHARED - set the default shared flag to --disable-shared
|
||||
AC_DEFUN(AC_DISABLE_SHARED, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
|
||||
AC_ENABLE_SHARED(no)])
|
||||
AC_DEFUN(AC_DISABLE_SHARED,
|
||||
[AC_ENABLE_SHARED(no)])
|
||||
|
||||
# AC_ENABLE_STATIC - implement the --enable-static flag
|
||||
# Usage: AC_ENABLE_STATIC[(DEFAULT)]
|
||||
# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
|
||||
# `yes'.
|
||||
AC_DEFUN(AC_ENABLE_STATIC, [dnl
|
||||
define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
|
||||
AC_DEFUN(AC_ENABLE_STATIC,
|
||||
[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
|
||||
AC_ARG_ENABLE(static,
|
||||
changequote(<<, >>)dnl
|
||||
<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT],
|
||||
|
@ -185,16 +185,16 @@ enable_static=AC_ENABLE_STATIC_DEFAULT)dnl
|
|||
])
|
||||
|
||||
# AC_DISABLE_STATIC - set the default static flag to --disable-static
|
||||
AC_DEFUN(AC_DISABLE_STATIC, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
|
||||
AC_ENABLE_STATIC(no)])
|
||||
AC_DEFUN(AC_DISABLE_STATIC,
|
||||
[AC_ENABLE_STATIC(no)])
|
||||
|
||||
|
||||
# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag
|
||||
# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)]
|
||||
# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
|
||||
# `yes'.
|
||||
AC_DEFUN(AC_ENABLE_FAST_INSTALL, [dnl
|
||||
define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
|
||||
AC_DEFUN(AC_ENABLE_FAST_INSTALL,
|
||||
[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
|
||||
AC_ARG_ENABLE(fast-install,
|
||||
changequote(<<, >>)dnl
|
||||
<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT],
|
||||
|
@ -219,8 +219,9 @@ enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl
|
|||
])
|
||||
|
||||
# AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install
|
||||
AC_DEFUN(AC_DISABLE_FAST_INSTALL, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
|
||||
AC_ENABLE_FAST_INSTALL(no)])
|
||||
AC_DEFUN(AC_DISABLE_FAST_INSTALL,
|
||||
[AC_ENABLE_FAST_INSTALL(no)])
|
||||
|
||||
|
||||
# AC_PROG_LD - find the path to the GNU or non-GNU linker
|
||||
AC_DEFUN(AC_PROG_LD,
|
||||
|
@ -238,7 +239,7 @@ if test "$ac_cv_prog_gcc" = yes; then
|
|||
case "$ac_prog" in
|
||||
# Accept absolute paths.
|
||||
changequote(,)dnl
|
||||
[\\/]* | [A-Za-z]:[\\/]*)
|
||||
/* | [A-Za-z]:[\\/]*)
|
||||
re_direlt='/[^/][^/]*/\.\./'
|
||||
changequote([,])dnl
|
||||
# Canonicalize the path of ld
|
||||
|
@ -264,10 +265,10 @@ else
|
|||
fi
|
||||
AC_CACHE_VAL(ac_cv_path_LD,
|
||||
[if test -z "$LD"; then
|
||||
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
|
||||
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
|
||||
for ac_dir in $PATH; do
|
||||
test -z "$ac_dir" && ac_dir=.
|
||||
if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
|
||||
if test -f "$ac_dir/$ac_prog"; then
|
||||
ac_cv_path_LD="$ac_dir/$ac_prog"
|
||||
# Check to see if the program is GNU ld. I'd rather use --version,
|
||||
# but apparently some GNU ld's only accept -v.
|
||||
|
@ -312,10 +313,10 @@ AC_CACHE_VAL(ac_cv_path_NM,
|
|||
# Let the user override the test.
|
||||
ac_cv_path_NM="$NM"
|
||||
else
|
||||
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
|
||||
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
|
||||
for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
|
||||
test -z "$ac_dir" && ac_dir=.
|
||||
if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then
|
||||
if test -f $ac_dir/nm; then
|
||||
# Check to see if the nm accepts a BSD-compat flag.
|
||||
# Adding the `sed 1q' prevents false positives on HP-UX, which says:
|
||||
# nm: unknown option "B" ignored
|
||||
|
@ -339,22 +340,227 @@ AC_MSG_RESULT([$NM])
|
|||
AC_SUBST(NM)
|
||||
])
|
||||
|
||||
# AC_CHECK_LIBM - check for math library
|
||||
AC_DEFUN(AC_CHECK_LIBM,
|
||||
# AC_SYS_NM_PARSE - Check for command to grab the raw symbol name followed
|
||||
# by C symbol name from nm.
|
||||
AC_DEFUN(AC_SYS_NM_PARSE,
|
||||
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
|
||||
LIBM=
|
||||
case "$host" in
|
||||
*-*-beos* | *-*-cygwin*)
|
||||
# These system don't have libm
|
||||
AC_REQUIRE([AC_PROG_NM])dnl
|
||||
# Check for command to grab the raw symbol name followed by C symbol from nm.
|
||||
AC_MSG_CHECKING([command to parse $NM output])
|
||||
AC_CACHE_VAL(ac_cv_sys_global_symbol_pipe,
|
||||
[# These are sane defaults that work on at least a few old systems.
|
||||
# {They come from Ultrix. What could be older than Ultrix?!! ;)}
|
||||
|
||||
changequote(,)dnl
|
||||
# Character class describing NM global symbol codes.
|
||||
ac_symcode='[BCDEGRST]'
|
||||
|
||||
# Regexp to match symbols that can be accessed directly from C.
|
||||
ac_sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
|
||||
|
||||
# Transform the above into a raw symbol and a C symbol.
|
||||
ac_symxfrm='\1 \2\3 \3'
|
||||
|
||||
# Transform an extracted symbol line into a proper C declaration
|
||||
ac_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
|
||||
|
||||
# Define system-specific variables.
|
||||
case "$host_os" in
|
||||
aix*)
|
||||
ac_symcode='[BCDT]'
|
||||
;;
|
||||
*-ncr-sysv4.3*)
|
||||
AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
|
||||
AC_CHECK_LIB(m, main, LIBM="$LIBM -lm")
|
||||
cygwin* | mingw*)
|
||||
ac_symcode='[ABCDGISTW]'
|
||||
;;
|
||||
*)
|
||||
AC_CHECK_LIB(m, main, LIBM="-lm")
|
||||
hpux*)
|
||||
ac_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'"
|
||||
;;
|
||||
irix*)
|
||||
ac_symcode='[BCDEGRST]'
|
||||
;;
|
||||
solaris*)
|
||||
ac_symcode='[BDT]'
|
||||
;;
|
||||
esac
|
||||
|
||||
# If we're using GNU nm, then use its standard symbol codes.
|
||||
if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
|
||||
ac_symcode='[ABCDGISTW]'
|
||||
fi
|
||||
changequote([,])dnl
|
||||
|
||||
# Try without a prefix undercore, then with it.
|
||||
for ac_symprfx in "" "_"; do
|
||||
|
||||
ac_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($ac_symcode\)[ ][ ]*\($ac_symprfx\)$ac_sympat$/$ac_symxfrm/p'"
|
||||
|
||||
# Check to see that the pipe works correctly.
|
||||
ac_pipe_works=no
|
||||
rm -f conftest.$ac_ext
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
char nm_test_var;
|
||||
void nm_test_func(){}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
int main(){nm_test_var='a';nm_test_func;return 0;}
|
||||
EOF
|
||||
|
||||
if AC_TRY_EVAL(ac_compile); then
|
||||
# Now try to grab the symbols.
|
||||
ac_nlist=conftest.nm
|
||||
|
||||
if AC_TRY_EVAL(NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
|
||||
|
||||
# Try sorting and uniquifying the output.
|
||||
if sort "$ac_nlist" | uniq > "$ac_nlist"T; then
|
||||
mv -f "$ac_nlist"T "$ac_nlist"
|
||||
else
|
||||
rm -f "$ac_nlist"T
|
||||
fi
|
||||
|
||||
# Make sure that we snagged all the symbols we need.
|
||||
if egrep ' nm_test_var$' "$ac_nlist" >/dev/null; then
|
||||
if egrep ' nm_test_func$' "$ac_nlist" >/dev/null; then
|
||||
cat <<EOF > conftest.c
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
EOF
|
||||
# Now generate the symbol file.
|
||||
eval "$ac_global_symbol_to_cdecl"' < "$ac_nlist" >> conftest.c'
|
||||
|
||||
cat <<EOF >> conftest.c
|
||||
#if defined (__STDC__) && __STDC__
|
||||
# define lt_ptr_t void *
|
||||
#else
|
||||
# define lt_ptr_t char *
|
||||
# define const
|
||||
#endif
|
||||
|
||||
/* The mapping between symbol names and symbols. */
|
||||
const struct {
|
||||
const char *name;
|
||||
lt_ptr_t address;
|
||||
}
|
||||
changequote(,)dnl
|
||||
lt_preloaded_symbols[] =
|
||||
changequote([,])dnl
|
||||
{
|
||||
EOF
|
||||
sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$ac_nlist" >> conftest.c
|
||||
cat <<\EOF >> conftest.c
|
||||
{0, (lt_ptr_t) 0}
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
EOF
|
||||
# Now try linking the two files.
|
||||
mv conftest.$ac_objext conftestm.$ac_objext
|
||||
ac_save_LIBS="$LIBS"
|
||||
ac_save_CFLAGS="$CFLAGS"
|
||||
LIBS="conftestm.$ac_objext"
|
||||
CFLAGS="$CFLAGS$no_builtin_flag"
|
||||
if AC_TRY_EVAL(ac_link) && test -s conftest; then
|
||||
ac_pipe_works=yes
|
||||
else
|
||||
echo "configure: failed program was:" >&AC_FD_CC
|
||||
cat conftest.c >&AC_FD_CC
|
||||
fi
|
||||
LIBS="$ac_save_LIBS"
|
||||
CFLAGS="$ac_save_CFLAGS"
|
||||
else
|
||||
echo "cannot find nm_test_func in $ac_nlist" >&AC_FD_CC
|
||||
fi
|
||||
else
|
||||
echo "cannot find nm_test_var in $ac_nlist" >&AC_FD_CC
|
||||
fi
|
||||
else
|
||||
echo "cannot run $ac_cv_sys_global_symbol_pipe" >&AC_FD_CC
|
||||
fi
|
||||
else
|
||||
echo "$progname: failed program was:" >&AC_FD_CC
|
||||
cat conftest.c >&AC_FD_CC
|
||||
fi
|
||||
rm -rf conftest*
|
||||
|
||||
# Do not use the global_symbol_pipe unless it works.
|
||||
if test "$ac_pipe_works" = yes; then
|
||||
if test x"$ac_symprfx" = x"_"; then
|
||||
ac_cv_sys_symbol_underscore=yes
|
||||
else
|
||||
ac_cv_sys_symbol_underscore=no
|
||||
fi
|
||||
break
|
||||
else
|
||||
ac_cv_sys_global_symbol_pipe=
|
||||
fi
|
||||
done
|
||||
])
|
||||
|
||||
ac_result=yes
|
||||
if test -z "$ac_cv_sys_global_symbol_pipe"; then
|
||||
ac_result=no
|
||||
fi
|
||||
AC_MSG_RESULT($ac_result)
|
||||
])
|
||||
|
||||
# AC_SYS_LIBTOOL_CYGWIN - find tools needed on cygwin
|
||||
AC_DEFUN(AC_SYS_LIBTOOL_CYGWIN,
|
||||
[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
|
||||
AC_CHECK_TOOL(AS, as, false)
|
||||
])
|
||||
|
||||
# AC_SYS_SYMBOL_UNDERSCORE - does the compiler prefix global symbols
|
||||
# with an underscore?
|
||||
AC_DEFUN(AC_SYS_SYMBOL_UNDERSCORE,
|
||||
[AC_REQUIRE([AC_PROG_NM])dnl
|
||||
AC_REQUIRE([AC_SYS_NM_PARSE])dnl
|
||||
AC_MSG_CHECKING([for _ prefix in compiled symbols])
|
||||
AC_CACHE_VAL(ac_cv_sys_symbol_underscore,
|
||||
[ac_cv_sys_symbol_underscore=no
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
void nm_test_func(){}
|
||||
int main(){nm_test_func;return 0;}
|
||||
EOF
|
||||
if AC_TRY_EVAL(ac_compile); then
|
||||
# Now try to grab the symbols.
|
||||
ac_nlist=conftest.nm
|
||||
if AC_TRY_EVAL(NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
|
||||
# See whether the symbols have a leading underscore.
|
||||
if egrep '^. _nm_test_func' "$ac_nlist" >/dev/null; then
|
||||
ac_cv_sys_symbol_underscore=yes
|
||||
else
|
||||
if egrep '^. nm_test_func ' "$ac_nlist" >/dev/null; then
|
||||
:
|
||||
else
|
||||
echo "configure: cannot find nm_test_func in $ac_nlist" >&AC_FD_CC
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo "configure: cannot run $ac_cv_sys_global_symbol_pipe" >&AC_FD_CC
|
||||
fi
|
||||
else
|
||||
echo "configure: failed program was:" >&AC_FD_CC
|
||||
cat conftest.c >&AC_FD_CC
|
||||
fi
|
||||
rm -rf conftest*
|
||||
])
|
||||
AC_MSG_RESULT($ac_cv_sys_symbol_underscore)
|
||||
USE_SYMBOL_UNDERSCORE=${ac_cv_sys_symbol_underscore=no}
|
||||
AC_SUBST(USE_SYMBOL_UNDERSCORE)dnl
|
||||
])
|
||||
|
||||
# AC_CHECK_LIBM - check for math library
|
||||
AC_DEFUN(AC_CHECK_LIBM, [
|
||||
AC_CHECK_LIB(mw, _mwvalidcheckl)
|
||||
AC_CHECK_LIB(m, cos)
|
||||
])
|
||||
|
||||
# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for
|
||||
|
@ -365,14 +571,13 @@ esac
|
|||
# '${top_builddir}/' (note the single quotes!) if your package is not
|
||||
# flat, and, if you're not using automake, define top_builddir as
|
||||
# appropriate in the Makefiles.
|
||||
AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
|
||||
AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [
|
||||
case "$enable_ltdl_convenience" in
|
||||
no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
|
||||
"") enable_ltdl_convenience=yes
|
||||
ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
|
||||
esac
|
||||
LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdlc.la
|
||||
INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl'])
|
||||
])
|
||||
|
||||
# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for
|
||||
|
@ -384,23 +589,16 @@ AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
|
|||
# flat, and, if you're not using automake, define top_builddir as
|
||||
# appropriate in the Makefiles.
|
||||
# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
|
||||
AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
|
||||
AC_CHECK_LIB(ltdl, main,
|
||||
[test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
|
||||
[if test x"$enable_ltdl_install" = xno; then
|
||||
AC_MSG_WARN([libltdl not installed, but installation disabled])
|
||||
else
|
||||
enable_ltdl_install=yes
|
||||
fi
|
||||
AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [
|
||||
AC_CHECK_LIB(ltdl, main, LIBLTDL="-lltdl", [
|
||||
case "$enable_ltdl_install" in
|
||||
no) AC_MSG_WARN([libltdl not installed, but installation disabled]) ;;
|
||||
"") enable_ltdl_install=yes
|
||||
ac_configure_args="$ac_configure_args --enable-ltdl-install" ;;
|
||||
esac
|
||||
])
|
||||
if test x"$enable_ltdl_install" = x"yes"; then
|
||||
ac_configure_args="$ac_configure_args --enable-ltdl-install"
|
||||
if test x"$enable_ltdl_install" != x"no"; then
|
||||
LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdl.la
|
||||
INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl'])
|
||||
else
|
||||
ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
|
||||
LIBLTDL="-lltdl"
|
||||
INCLTDL=
|
||||
fi
|
||||
])
|
||||
|
||||
|
@ -412,9 +610,9 @@ AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl
|
|||
AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl
|
||||
AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl
|
||||
AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl
|
||||
|
||||
dnl This is just to silence aclocal about the macro not being used
|
||||
ifelse([AC_DISABLE_FAST_INSTALL])dnl
|
||||
AC_DEFUN(AM_SYS_NM_PARSE, [indir([AC_SYS_NM_PARSE])])dnl
|
||||
AC_DEFUN(AM_SYS_SYMBOL_UNDERSCORE, [indir([AC_SYS_SYMBOL_UNDERSCORE])])dnl
|
||||
AC_DEFUN(AM_SYS_LIBTOOL_CYGWIN, [indir([AC_SYS_LIBTOOL_CYGWIN])])dnl
|
||||
|
||||
# Do all the work for Automake. This macro actually does too much --
|
||||
# some checks are only needed if your package does certain things.
|
||||
|
|
|
@ -9,27 +9,27 @@
|
|||
/* Define if you have the ANSI C header files. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* Define if you have the libdl library or equivalent. */
|
||||
#undef HAVE_LIBDL
|
||||
|
||||
/* Define if you have the GNU dld library. */
|
||||
#undef HAVE_DLD
|
||||
|
||||
/* Define if you have the shl_load function. */
|
||||
#undef HAVE_SHL_LOAD
|
||||
|
||||
/* Define if you have the dlerror function. */
|
||||
#undef HAVE_DLERROR
|
||||
|
||||
/* Define if you have the dlopen function. */
|
||||
#undef HAVE_DLOPEN
|
||||
|
||||
/* Define if you have the index function. */
|
||||
#undef HAVE_INDEX
|
||||
|
||||
/* Define if you have the rindex function. */
|
||||
#undef HAVE_RINDEX
|
||||
|
||||
/* Define if you have the shl_load function. */
|
||||
#undef HAVE_SHL_LOAD
|
||||
|
||||
/* Define if you have the strchr function. */
|
||||
#undef HAVE_STRCHR
|
||||
|
||||
/* Define if you have the strdup function. */
|
||||
#undef HAVE_STRDUP
|
||||
|
||||
/* Define if you have the strrchr function. */
|
||||
#undef HAVE_STRRCHR
|
||||
|
||||
|
@ -75,6 +75,18 @@
|
|||
/* Define if libtool can extract symbol lists from object files. */
|
||||
#undef HAVE_PRELOADED_SYMBOLS
|
||||
|
||||
/* Define if you have the libdl library or equivalent. */
|
||||
#undef HAVE_LIBDL
|
||||
|
||||
/* Define if you have the libdl library. */
|
||||
#undef HAVE_LIBDL
|
||||
|
||||
/* Define if you have the GNU dld library. */
|
||||
#undef HAVE_DLD
|
||||
|
||||
/* Define if you have the shl_load function. */
|
||||
#undef HAVE_SHL_LOAD
|
||||
|
||||
/* Define if dlsym() requires a leading underscode in symbol names. */
|
||||
#undef NEED_USCORE
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,5 +1,5 @@
|
|||
dnl Process this file with autoconf to create configure.
|
||||
|
||||
dnl Initialize the libltdl package.
|
||||
AC_INIT(ltdl.c)
|
||||
|
||||
if test -z "$enable_ltdl_install$enable_ltdl_convenience"; then
|
||||
|
@ -30,21 +30,19 @@ AC_ARG_ENABLE(ltdl-install,
|
|||
AM_CONDITIONAL(INSTALL_LTDL, test x"${enable_ltdl_install-no}" != xno)
|
||||
AM_CONDITIONAL(CONVENIENCE_LTDL, test x"${enable_ltdl_convenience-no}" != xno)
|
||||
|
||||
dnl Read the libtool configuration
|
||||
rm -f conftest
|
||||
./libtool --config > conftest
|
||||
. ./conftest
|
||||
rm -f conftest
|
||||
|
||||
AC_CACHE_CHECK([which extension is used for shared libraries],
|
||||
libltdl_cv_shlibext, [dnl
|
||||
(
|
||||
rm -f conftest
|
||||
./libtool --config > conftest
|
||||
. ./conftest
|
||||
last=
|
||||
for spec in $library_names_spec; do
|
||||
last="$spec"
|
||||
done
|
||||
rm -f conftest
|
||||
changequote(, )
|
||||
echo "$last" | sed 's/\[.*\]//;s/^[^.]*//;s/\$.*$//;s/\.$//' > conftest
|
||||
echo "$last" | sed 's/^[^.]*//;s/\$.*$//;s/\.$//' > conftest
|
||||
changequote([, ])
|
||||
)
|
||||
libltdl_cv_shlibext=`cat conftest`
|
||||
|
@ -56,14 +54,34 @@ if test -n "$libltdl_cv_shlibext"; then
|
|||
fi
|
||||
|
||||
AC_CACHE_CHECK([which variable specifies run-time library path],
|
||||
libltdl_cv_shlibpath_var, [libltdl_cv_shlibpath_var="$shlibpath_var"])
|
||||
libltdl_cv_shlibpath_var, [dnl
|
||||
(
|
||||
rm -f conftest
|
||||
./libtool --config > conftest
|
||||
. ./conftest
|
||||
rm -f conftest
|
||||
echo "$shlibpath_var" > conftest
|
||||
)
|
||||
libltdl_cv_shlibpath_var=`cat conftest`
|
||||
rm -f conftest
|
||||
])
|
||||
if test -n "$libltdl_cv_shlibpath_var"; then
|
||||
AC_DEFINE_UNQUOTED(LTDL_SHLIBPATH_VAR, "$libltdl_cv_shlibpath_var",
|
||||
[Define to the name of the environment variable that determines the dynamic library search path. ])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for objdir],
|
||||
libltdl_cv_objdir, [libltdl_cv_objdir="$objdir"])
|
||||
libltdl_cv_objdir, [dnl
|
||||
(
|
||||
rm -f conftest
|
||||
./libtool --config > conftest
|
||||
. ./conftest
|
||||
rm -f conftest
|
||||
echo "$objdir" > conftest
|
||||
)
|
||||
libltdl_cv_objdir=`cat conftest`
|
||||
rm -f conftest
|
||||
])
|
||||
test -z "$libltdl_cv_objdir" && libltdl_cv_objdir=".libs"
|
||||
AC_DEFINE_UNQUOTED(LTDL_OBJDIR, "$libltdl_cv_objdir/",
|
||||
[Define to the sub-directory in which libtool stores uninstalled libraries. ])
|
||||
|
@ -71,241 +89,55 @@ AC_DEFINE_UNQUOTED(LTDL_OBJDIR, "$libltdl_cv_objdir/",
|
|||
AC_HEADER_STDC
|
||||
AC_CHECK_HEADERS(malloc.h memory.h stdlib.h stdio.h ctype.h dlfcn.h dl.h dld.h)
|
||||
AC_CHECK_HEADERS(string.h strings.h, break)
|
||||
AC_CHECK_FUNCS(strchr index, break)
|
||||
AC_CHECK_FUNCS(strrchr rindex, break)
|
||||
AC_CHECK_FUNCS(strdup strchr strrchr index rindex)
|
||||
|
||||
AC_CACHE_CHECK([whether libtool supports -dlopen/-dlpreopen],
|
||||
libltdl_cv_preloaded_symbols, [dnl
|
||||
if test -n "$global_symbol_pipe"; then
|
||||
libltdl_cv_preloaded_symbols=yes
|
||||
else
|
||||
libltdl_cv_preloaded_symbols=no
|
||||
fi
|
||||
(
|
||||
rm -f conftest
|
||||
./libtool --config > conftest
|
||||
. ./conftest
|
||||
rm -f conftest
|
||||
if test -n "$global_symbol_pipe"; then
|
||||
echo yes > conftest
|
||||
else
|
||||
echo no > conftest
|
||||
fi
|
||||
)
|
||||
libltdl_cv_preloaded_symbols=`cat conftest`
|
||||
rm -f conftest
|
||||
])
|
||||
if test x"$libltdl_cv_preloaded_symbols" = x"yes"; then
|
||||
AC_DEFINE(HAVE_PRELOADED_SYMBOLS, 1,
|
||||
[Define if libtool can extract symbol lists from object files. ])
|
||||
fi
|
||||
|
||||
test_dlerror=no
|
||||
LIBADD_DL=
|
||||
AC_CHECK_LIB(dl, dlopen, [AC_DEFINE(HAVE_LIBDL, 1) LIBADD_DL="-ldl"],
|
||||
[AC_CHECK_FUNC(dlopen, [AC_DEFINE(HAVE_LIBDL, 1)])])
|
||||
AC_CHECK_FUNC(shl_load, [AC_DEFINE(HAVE_SHL_LOAD, 1)],
|
||||
[AC_CHECK_LIB(dld, shl_load, [AC_DEFINE(HAVE_SHL_LOAD, 1) LIBADD_DL="$LIBADD_DL -ldld"])])
|
||||
AC_CHECK_LIB(dld, dld_link, [AC_DEFINE(HAVE_DLD, 1)dnl
|
||||
test "x$ac_cv_lib_dld_shl_load" = yes || LIBADD_DL="$LIBADD_DL -ldld"])
|
||||
AC_CHECK_FUNCS(dlopen, [AC_DEFINE(HAVE_LIBDL, 1,
|
||||
[Define if you have the libdl library or equivalent. ]) test_dlerror=yes],
|
||||
[AC_CHECK_LIB(dl, dlopen, [AC_DEFINE(HAVE_LIBDL, 1,
|
||||
[Define if you have the libdl library. ]) dnl
|
||||
LIBADD_DL="-ldl" test_dlerror=yes],
|
||||
[AC_CHECK_LIB(dld, dld_link, [AC_DEFINE(HAVE_DLD, 1,
|
||||
[Define if you have the GNU dld library. ]) dnl
|
||||
LIBADD_DL="-ldld"],
|
||||
[AC_CHECK_FUNCS(shl_load, [AC_DEFINE(HAVE_SHL_LOAD, 1,
|
||||
[Define if you have the shl_load function. ])])]
|
||||
)]
|
||||
)]
|
||||
)
|
||||
AC_SUBST(LIBADD_DL)
|
||||
|
||||
if test "x$ac_cv_func_dlopen" = xyes || test "x$ac_cv_lib_dl_dlopen" = xyes; then
|
||||
if test "$test_dlerror" = yes; then
|
||||
LIBS_SAVE="$LIBS"
|
||||
LIBS="$LIBS $LIBADD_DL"
|
||||
AC_CHECK_FUNCS(dlerror)
|
||||
LIBS="$LIBS_SAVE"
|
||||
fi
|
||||
|
||||
dnl Check for command to grab the raw symbol name followed
|
||||
dnl by C symbol name from nm.
|
||||
AC_REQUIRE([AC_CANONICAL_HOST])dnl
|
||||
AC_REQUIRE([AC_PROG_NM])dnl
|
||||
# Check for command to grab the raw symbol name followed by C symbol from nm.
|
||||
AC_MSG_CHECKING([command to parse $NM output])
|
||||
AC_CACHE_VAL(ac_cv_sys_global_symbol_pipe,
|
||||
[# These are sane defaults that work on at least a few old systems.
|
||||
# {They come from Ultrix. What could be older than Ultrix?!! ;)}
|
||||
|
||||
changequote(,)dnl
|
||||
# Character class describing NM global symbol codes.
|
||||
ac_symcode='[BCDEGRST]'
|
||||
|
||||
# Regexp to match symbols that can be accessed directly from C.
|
||||
ac_sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
|
||||
|
||||
# Transform the above into a raw symbol and a C symbol.
|
||||
ac_symxfrm='\1 \2\3 \3'
|
||||
|
||||
# Transform an extracted symbol line into a proper C declaration
|
||||
ac_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
|
||||
|
||||
# Define system-specific variables.
|
||||
case "$host_os" in
|
||||
aix*)
|
||||
ac_symcode='[BCDT]'
|
||||
;;
|
||||
cygwin* | mingw*)
|
||||
ac_symcode='[ABCDGISTW]'
|
||||
;;
|
||||
hpux*)
|
||||
ac_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'"
|
||||
;;
|
||||
irix*)
|
||||
ac_symcode='[BCDEGRST]'
|
||||
;;
|
||||
solaris*)
|
||||
ac_symcode='[BDT]'
|
||||
;;
|
||||
esac
|
||||
|
||||
# If we're using GNU nm, then use its standard symbol codes.
|
||||
if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
|
||||
ac_symcode='[ABCDGISTW]'
|
||||
fi
|
||||
changequote([,])dnl
|
||||
|
||||
# Try without a prefix undercore, then with it.
|
||||
for ac_symprfx in "" "_"; do
|
||||
|
||||
ac_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($ac_symcode\)[ ][ ]*\($ac_symprfx\)$ac_sympat$/$ac_symxfrm/p'"
|
||||
|
||||
# Check to see that the pipe works correctly.
|
||||
ac_pipe_works=no
|
||||
rm -f conftest.$ac_ext
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
char nm_test_var;
|
||||
void nm_test_func(){}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
int main(){nm_test_var='a';nm_test_func;return 0;}
|
||||
EOF
|
||||
|
||||
if AC_TRY_EVAL(ac_compile); then
|
||||
# Now try to grab the symbols.
|
||||
ac_nlist=conftest.nm
|
||||
|
||||
if AC_TRY_EVAL(NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
|
||||
|
||||
# Try sorting and uniquifying the output.
|
||||
if sort "$ac_nlist" | uniq > "$ac_nlist"T; then
|
||||
mv -f "$ac_nlist"T "$ac_nlist"
|
||||
else
|
||||
rm -f "$ac_nlist"T
|
||||
fi
|
||||
|
||||
# Make sure that we snagged all the symbols we need.
|
||||
if egrep ' nm_test_var$' "$ac_nlist" >/dev/null; then
|
||||
if egrep ' nm_test_func$' "$ac_nlist" >/dev/null; then
|
||||
cat <<EOF > conftest.c
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
EOF
|
||||
# Now generate the symbol file.
|
||||
eval "$ac_global_symbol_to_cdecl"' < "$ac_nlist" >> conftest.c'
|
||||
|
||||
cat <<EOF >> conftest.c
|
||||
#if defined (__STDC__) && __STDC__
|
||||
# define lt_ptr_t void *
|
||||
#else
|
||||
# define lt_ptr_t char *
|
||||
# define const
|
||||
#endif
|
||||
|
||||
/* The mapping between symbol names and symbols. */
|
||||
const struct {
|
||||
const char *name;
|
||||
lt_ptr_t address;
|
||||
}
|
||||
changequote(,)dnl
|
||||
lt_preloaded_symbols[] =
|
||||
changequote([,])dnl
|
||||
{
|
||||
EOF
|
||||
sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$ac_nlist" >> conftest.c
|
||||
cat <<\EOF >> conftest.c
|
||||
{0, (lt_ptr_t) 0}
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
EOF
|
||||
# Now try linking the two files.
|
||||
mv conftest.$ac_objext conftstm.$ac_objext
|
||||
ac_save_LIBS="$LIBS"
|
||||
ac_save_CFLAGS="$CFLAGS"
|
||||
LIBS="conftstm.$ac_objext"
|
||||
CFLAGS="$CFLAGS$no_builtin_flag"
|
||||
if AC_TRY_EVAL(ac_link) && test -s conftest; then
|
||||
ac_pipe_works=yes
|
||||
else
|
||||
echo "configure: failed program was:" >&AC_FD_CC
|
||||
cat conftest.c >&AC_FD_CC
|
||||
fi
|
||||
LIBS="$ac_save_LIBS"
|
||||
CFLAGS="$ac_save_CFLAGS"
|
||||
else
|
||||
echo "cannot find nm_test_func in $ac_nlist" >&AC_FD_CC
|
||||
fi
|
||||
else
|
||||
echo "cannot find nm_test_var in $ac_nlist" >&AC_FD_CC
|
||||
fi
|
||||
else
|
||||
echo "cannot run $ac_cv_sys_global_symbol_pipe" >&AC_FD_CC
|
||||
fi
|
||||
else
|
||||
echo "$progname: failed program was:" >&AC_FD_CC
|
||||
cat conftest.c >&AC_FD_CC
|
||||
fi
|
||||
rm -rf conftest* conftst*
|
||||
|
||||
# Do not use the global_symbol_pipe unless it works.
|
||||
if test "$ac_pipe_works" = yes; then
|
||||
if test x"$ac_symprfx" = x"_"; then
|
||||
ac_cv_sys_symbol_underscore=yes
|
||||
else
|
||||
ac_cv_sys_symbol_underscore=no
|
||||
fi
|
||||
break
|
||||
else
|
||||
ac_cv_sys_global_symbol_pipe=
|
||||
fi
|
||||
done
|
||||
])
|
||||
|
||||
ac_result=yes
|
||||
if test -z "$ac_cv_sys_global_symbol_pipe"; then
|
||||
ac_result=no
|
||||
fi
|
||||
AC_MSG_RESULT($ac_result)
|
||||
|
||||
dnl does the compiler prefix global symbols with an underscore?
|
||||
AC_MSG_CHECKING([for _ prefix in compiled symbols])
|
||||
AC_CACHE_VAL(ac_cv_sys_symbol_underscore,
|
||||
[ac_cv_sys_symbol_underscore=no
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
void nm_test_func(){}
|
||||
int main(){nm_test_func;return 0;}
|
||||
EOF
|
||||
if AC_TRY_EVAL(ac_compile); then
|
||||
# Now try to grab the symbols.
|
||||
ac_nlist=conftest.nm
|
||||
if AC_TRY_EVAL(NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
|
||||
# See whether the symbols have a leading underscore.
|
||||
if egrep '^. _nm_test_func' "$ac_nlist" >/dev/null; then
|
||||
ac_cv_sys_symbol_underscore=yes
|
||||
else
|
||||
if egrep '^. nm_test_func ' "$ac_nlist" >/dev/null; then
|
||||
:
|
||||
else
|
||||
echo "configure: cannot find nm_test_func in $ac_nlist" >&AC_FD_CC
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo "configure: cannot run $ac_cv_sys_global_symbol_pipe" >&AC_FD_CC
|
||||
fi
|
||||
else
|
||||
echo "configure: failed program was:" >&AC_FD_CC
|
||||
cat conftest.c >&AC_FD_CC
|
||||
fi
|
||||
rm -rf conftest*
|
||||
])
|
||||
AC_MSG_RESULT($ac_cv_sys_symbol_underscore)
|
||||
|
||||
if test x"$ac_cv_sys_symbol_underscore" = xyes; then
|
||||
AC_SYS_SYMBOL_UNDERSCORE
|
||||
if test x"$USE_SYMBOL_UNDERSCORE" = xyes; then
|
||||
if test x"$ac_cv_func_dlopen" = xyes ||
|
||||
test x"$ac_cv_lib_dl_dlopen" = xyes ; then
|
||||
AC_CACHE_CHECK([whether we have to add an underscore for dlsym],
|
||||
|
@ -352,7 +184,7 @@ if test x"$ac_cv_sys_symbol_underscore" = xyes; then
|
|||
fnord() { int i=42;}
|
||||
main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW);
|
||||
if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord");
|
||||
if(ptr1 && !ptr2) { dlclose(self); exit(0); } } exit(1); }
|
||||
if(ptr1 && !ptr2) exit(0); } exit(1); }
|
||||
], libltdl_cv_need_uscore=no, libltdl_cv_need_uscore=yes,
|
||||
libltdl_cv_need_uscore=cross
|
||||
)])
|
||||
|
|
294
libltdl/ltdl.c
294
libltdl/ltdl.c
|
@ -1,6 +1,6 @@
|
|||
/* ltdl.c -- system independent dlopen wrapper
|
||||
Copyright (C) 1998-1999 Free Software Foundation, Inc.
|
||||
Originally by Thomas Tanner <tanner@ffii.org>
|
||||
Originally by Thomas Tanner <tanner@gmx.de>
|
||||
This file is part of GNU Libtool.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
|
@ -8,11 +8,6 @@ modify it under the terms of the GNU Library General Public
|
|||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
As a special exception to the GNU Library General Public License,
|
||||
if you distribute this file as part of a program that uses GNU libtool
|
||||
to create libraries and programs, you may include it under the same
|
||||
distribution terms that you use for the rest of that program.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
|
@ -81,16 +76,12 @@ Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|||
#define LTDL_SYMBOL_OVERHEAD 5
|
||||
|
||||
static const char objdir[] = LTDL_OBJDIR;
|
||||
#ifdef LTDL_SHLIB_EXT
|
||||
static const char shlib_ext[] = LTDL_SHLIB_EXT;
|
||||
#endif
|
||||
|
||||
static const char unknown_error[] = "unknown error";
|
||||
static const char dlopen_not_supported_error[] = "dlopen support not available";
|
||||
static const char file_not_found_error[] = "file not found";
|
||||
static const char no_symbols_error[] = "no symbols defined";
|
||||
static const char cannot_open_error[] = "can't open the module";
|
||||
static const char cannot_close_error[] = "can't close the module";
|
||||
static const char symbol_error[] = "symbol not found";
|
||||
static const char memory_error[] = "not enough memory";
|
||||
static const char invalid_handle_error[] = "invalid handle";
|
||||
|
@ -104,17 +95,17 @@ const lt_dlsymlist lt_preloaded_symbols[1] = { { 0, 0 } };
|
|||
|
||||
static const char *last_error = 0;
|
||||
|
||||
lt_ptr_t (*lt_dlmalloc) LTDL_PARAMS((size_t size)) = (lt_ptr_t(*)LTDL_PARAMS((size_t)))malloc;
|
||||
void (*lt_dlfree) LTDL_PARAMS((lt_ptr_t ptr)) = (void(*)LTDL_PARAMS((lt_ptr_t)))free;
|
||||
lt_ptr_t (*lt_dlmalloc) __P((size_t size)) = malloc;
|
||||
void (*lt_dlfree) __P((lt_ptr_t ptr)) = free;
|
||||
|
||||
typedef struct lt_dltype_t {
|
||||
struct lt_dltype_t *next;
|
||||
const char *sym_prefix; /* prefix for symbols */
|
||||
int (*mod_init) LTDL_PARAMS((void));
|
||||
int (*mod_exit) LTDL_PARAMS((void));
|
||||
int (*lib_open) LTDL_PARAMS((lt_dlhandle handle, const char *filename));
|
||||
int (*lib_close) LTDL_PARAMS((lt_dlhandle handle));
|
||||
lt_ptr_t (*find_sym) LTDL_PARAMS((lt_dlhandle handle, const char *symbol));
|
||||
int (*mod_init) __P((void));
|
||||
int (*mod_exit) __P((void));
|
||||
int (*lib_open) __P((lt_dlhandle handle, const char *filename));
|
||||
int (*lib_close) __P((lt_dlhandle handle));
|
||||
lt_ptr_t (*find_sym) __P((lt_dlhandle handle, const char *symbol));
|
||||
} lt_dltype_t;
|
||||
|
||||
#define LTDL_TYPE_TOP 0
|
||||
|
@ -165,7 +156,7 @@ strchr(str, ch)
|
|||
{
|
||||
const char *p;
|
||||
|
||||
for (p = str; *p != (char)ch && *p != '\0'; p++)
|
||||
for (p = str; *p != (char)ch && p != '\0'; p++)
|
||||
/*NOWORK*/;
|
||||
|
||||
return (*p == (char)ch) ? p : 0;
|
||||
|
@ -192,7 +183,7 @@ strrchr(str, ch)
|
|||
{
|
||||
const char *p;
|
||||
|
||||
for (p = str; *p != '\0'; p++)
|
||||
for (p = str; p != '\0'; p++)
|
||||
/*NOWORK*/;
|
||||
|
||||
while (*p != (char)ch && p >= str)
|
||||
|
@ -213,6 +204,10 @@ strrchr(str, ch)
|
|||
# include <dlfcn.h>
|
||||
#endif
|
||||
|
||||
#if ! HAVE_DLERROR /* not all platforms have dlerror() */
|
||||
#define dlerror() unknown_error
|
||||
#endif
|
||||
|
||||
#ifdef RTLD_GLOBAL
|
||||
# define LTDL_GLOBAL RTLD_GLOBAL
|
||||
#else
|
||||
|
@ -246,77 +241,65 @@ strrchr(str, ch)
|
|||
#endif
|
||||
|
||||
static int
|
||||
sys_dl_init LTDL_PARAMS((void))
|
||||
dl_init ()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
sys_dl_exit LTDL_PARAMS((void))
|
||||
dl_exit ()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
sys_dl_open (handle, filename)
|
||||
dl_open (handle, filename)
|
||||
lt_dlhandle handle;
|
||||
const char *filename;
|
||||
{
|
||||
handle->handle = dlopen(filename, LTDL_GLOBAL | LTDL_LAZY_OR_NOW);
|
||||
if (!handle->handle) {
|
||||
#if HAVE_DLERROR
|
||||
last_error = dlerror();
|
||||
#else
|
||||
last_error = cannot_open_error;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
sys_dl_close (handle)
|
||||
dl_close (handle)
|
||||
lt_dlhandle handle;
|
||||
{
|
||||
if (dlclose(handle->handle) != 0) {
|
||||
#if HAVE_DLERROR
|
||||
last_error = dlerror();
|
||||
#else
|
||||
last_error = cannot_close_error;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static lt_ptr_t
|
||||
sys_dl_sym (handle, symbol)
|
||||
dl_sym (handle, symbol)
|
||||
lt_dlhandle handle;
|
||||
const char *symbol;
|
||||
{
|
||||
lt_ptr_t address = dlsym(handle->handle, symbol);
|
||||
|
||||
if (!address)
|
||||
#if HAVE_DLERROR
|
||||
last_error = dlerror();
|
||||
#else
|
||||
last_error = symbol_error;
|
||||
#endif
|
||||
return address;
|
||||
}
|
||||
|
||||
static
|
||||
lt_dltype_t
|
||||
#ifdef NEED_USCORE
|
||||
sys_dl = { LTDL_TYPE_TOP, "_", sys_dl_init, sys_dl_exit,
|
||||
sys_dl_open, sys_dl_close, sys_dl_sym };
|
||||
dl = { LTDL_TYPE_TOP, "_", dl_init, dl_exit,
|
||||
dl_open, dl_close, dl_sym };
|
||||
#else
|
||||
sys_dl = { LTDL_TYPE_TOP, 0, sys_dl_init, sys_dl_exit,
|
||||
sys_dl_open, sys_dl_close, sys_dl_sym };
|
||||
dl = { LTDL_TYPE_TOP, 0, dl_init, dl_exit,
|
||||
dl_open, dl_close, dl_sym };
|
||||
#endif
|
||||
|
||||
#undef LTDL_TYPE_TOP
|
||||
#define LTDL_TYPE_TOP &sys_dl
|
||||
#define LTDL_TYPE_TOP &dl
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -361,66 +344,66 @@ sys_dl = { LTDL_TYPE_TOP, 0, sys_dl_init, sys_dl_exit,
|
|||
#define BIND_RESTRICTED 0
|
||||
#endif /* BIND_RESTRICTED */
|
||||
|
||||
#define LTDL_BIND_FLAGS (BIND_IMMEDIATE | BIND_NONFATAL | DYNAMIC_PATH)
|
||||
#define LTDL_BIND_FLAGS (BIND_IMMEDIATE | BIND_NONFATAL | BIND_VERBOSE | DYNAMIC_PATH)
|
||||
|
||||
static int
|
||||
sys_shl_init LTDL_PARAMS((void))
|
||||
shl_init ()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
sys_shl_exit LTDL_PARAMS((void))
|
||||
shl_exit ()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
sys_shl_open (handle, filename)
|
||||
shl_open (handle, filename)
|
||||
lt_dlhandle handle;
|
||||
const char *filename;
|
||||
{
|
||||
handle->handle = shl_load(filename, LTDL_BIND_FLAGS, 0L);
|
||||
if (!handle->handle) {
|
||||
last_error = cannot_open_error;
|
||||
last_error = unknown_error;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
sys_shl_close (handle)
|
||||
shl_close (handle)
|
||||
lt_dlhandle handle;
|
||||
{
|
||||
if (shl_unload((shl_t) (handle->handle)) != 0) {
|
||||
last_error = cannot_close_error;
|
||||
last_error = unknown_error;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static lt_ptr_t
|
||||
sys_shl_sym (handle, symbol)
|
||||
shl_sym (handle, symbol)
|
||||
lt_dlhandle handle;
|
||||
const char *symbol;
|
||||
{
|
||||
lt_ptr_t address;
|
||||
|
||||
if (handle->handle && shl_findsym((shl_t*) &(handle->handle),
|
||||
symbol, TYPE_UNDEFINED, &address) == 0)
|
||||
if (address)
|
||||
return address;
|
||||
last_error = symbol_error;
|
||||
return 0;
|
||||
if (shl_findsym((shl_t) (handle->handle), symbol, TYPE_UNDEFINED,
|
||||
&address) != 0 || !(handle->handle) || !address) {
|
||||
last_error = unknown_error;
|
||||
return 0;
|
||||
}
|
||||
return address;
|
||||
}
|
||||
|
||||
static
|
||||
lt_dltype_t
|
||||
sys_shl = { LTDL_TYPE_TOP, 0, sys_shl_init, sys_shl_exit,
|
||||
sys_shl_open, sys_shl_close, sys_shl_sym };
|
||||
shl = { LTDL_TYPE_TOP, 0, shl_init, shl_exit,
|
||||
shl_open, shl_close, shl_sym };
|
||||
|
||||
#undef LTDL_TYPE_TOP
|
||||
#define LTDL_TYPE_TOP &sys_shl
|
||||
#define LTDL_TYPE_TOP &shl
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -433,19 +416,19 @@ sys_shl = { LTDL_TYPE_TOP, 0, sys_shl_init, sys_shl_exit,
|
|||
#endif
|
||||
|
||||
static int
|
||||
sys_dld_init LTDL_PARAMS((void))
|
||||
dld_init ()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
sys_dld_exit LTDL_PARAMS((void))
|
||||
dld_exit ()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
sys_dld_open (handle, filename)
|
||||
dld_open (handle, filename)
|
||||
lt_dlhandle handle;
|
||||
const char *filename;
|
||||
{
|
||||
|
@ -455,7 +438,7 @@ sys_dld_open (handle, filename)
|
|||
return 1;
|
||||
}
|
||||
if (dld_link(filename) != 0) {
|
||||
last_error = cannot_open_error;
|
||||
last_error = unknown_error;
|
||||
lt_dlfree(handle->handle);
|
||||
return 1;
|
||||
}
|
||||
|
@ -463,11 +446,11 @@ sys_dld_open (handle, filename)
|
|||
}
|
||||
|
||||
static int
|
||||
sys_dld_close (handle)
|
||||
dld_close (handle)
|
||||
lt_dlhandle handle;
|
||||
{
|
||||
if (dld_unlink_by_file((char*)(handle->handle), 1) != 0) {
|
||||
last_error = cannot_close_error;
|
||||
last_error = unknown_error;
|
||||
return 1;
|
||||
}
|
||||
lt_dlfree(handle->filename);
|
||||
|
@ -475,24 +458,24 @@ sys_dld_close (handle)
|
|||
}
|
||||
|
||||
static lt_ptr_t
|
||||
sys_dld_sym (handle, symbol)
|
||||
dld_sym (handle, symbol)
|
||||
lt_dlhandle handle;
|
||||
const char *symbol;
|
||||
{
|
||||
lt_ptr_t address = dld_get_func(symbol);
|
||||
|
||||
if (!address)
|
||||
last_error = symbol_error;
|
||||
last_error = unknown_error;
|
||||
return address;
|
||||
}
|
||||
|
||||
static
|
||||
lt_dltype_t
|
||||
sys_dld = { LTDL_TYPE_TOP, 0, sys_dld_init, sys_dld_exit,
|
||||
sys_dld_open, sys_dld_close, sys_dld_sym };
|
||||
dld = { LTDL_TYPE_TOP, 0, dld_init, dld_exit,
|
||||
dld_open, dld_close, dld_sym };
|
||||
|
||||
#undef LTDL_TYPE_TOP
|
||||
#define LTDL_TYPE_TOP &sys_dld
|
||||
#define LTDL_TYPE_TOP &dld
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -503,178 +486,60 @@ sys_dld = { LTDL_TYPE_TOP, 0, sys_dld_init, sys_dld_exit,
|
|||
#include <windows.h>
|
||||
|
||||
static int
|
||||
sys_wll_init LTDL_PARAMS((void))
|
||||
wll_init ()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
sys_wll_exit LTDL_PARAMS((void))
|
||||
wll_exit ()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Forward declaration; required to implement handle search below. */
|
||||
static lt_dlhandle handles;
|
||||
|
||||
static int
|
||||
sys_wll_open (handle, filename)
|
||||
wll_open (handle, filename)
|
||||
lt_dlhandle handle;
|
||||
const char *filename;
|
||||
{
|
||||
lt_dlhandle cur;
|
||||
char *searchname = NULL;
|
||||
char *ext = strrchr(filename, '.');
|
||||
|
||||
if (ext) {
|
||||
/* FILENAME already has an extension. */
|
||||
searchname = strdup(filename);
|
||||
} else {
|
||||
/* Append a `.' to stop Windows from adding an
|
||||
implicit `.dll' extension. */
|
||||
searchname = (char*)lt_dlmalloc(2+ strlen(filename));
|
||||
strcpy(searchname, filename);
|
||||
strcat(searchname, ".");
|
||||
}
|
||||
|
||||
handle->handle = LoadLibrary(searchname);
|
||||
lt_dlfree(searchname);
|
||||
|
||||
/* libltdl expects this function to fail if it is unable
|
||||
to physically load the library. Sadly, LoadLibrary
|
||||
will search the loaded libraries for a match and return
|
||||
one of them if the path search load fails.
|
||||
|
||||
We check whether LoadLibrary is returning a handle to
|
||||
an already loaded module, and simulate failure if we
|
||||
find one. */
|
||||
cur = handles;
|
||||
while (cur) {
|
||||
if (!cur->handle) {
|
||||
cur = 0;
|
||||
break;
|
||||
}
|
||||
if (cur->handle == handle->handle)
|
||||
break;
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
if (cur || !handle->handle) {
|
||||
last_error = cannot_open_error;
|
||||
handle->handle = LoadLibrary(filename);
|
||||
if (!handle->handle) {
|
||||
last_error = unknown_error;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
sys_wll_close (handle)
|
||||
wll_close (handle)
|
||||
lt_dlhandle handle;
|
||||
{
|
||||
if (FreeLibrary(handle->handle) == 0) {
|
||||
last_error = cannot_close_error;
|
||||
if (FreeLibrary(handle->handle) != 0) {
|
||||
last_error = unknown_error;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static lt_ptr_t
|
||||
sys_wll_sym (handle, symbol)
|
||||
wll_sym (handle, symbol)
|
||||
lt_dlhandle handle;
|
||||
const char *symbol;
|
||||
{
|
||||
lt_ptr_t address = GetProcAddress(handle->handle, symbol);
|
||||
|
||||
if (!address)
|
||||
last_error = symbol_error;
|
||||
last_error = unknown_error;
|
||||
return address;
|
||||
}
|
||||
|
||||
static
|
||||
lt_dltype_t
|
||||
sys_wll = { LTDL_TYPE_TOP, 0, sys_wll_init, sys_wll_exit,
|
||||
sys_wll_open, sys_wll_close, sys_wll_sym };
|
||||
wll = { LTDL_TYPE_TOP, 0, wll_init, wll_exit,
|
||||
wll_open, wll_close, wll_sym };
|
||||
|
||||
#undef LTDL_TYPE_TOP
|
||||
#define LTDL_TYPE_TOP &sys_wll
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __BEOS__
|
||||
|
||||
/* dynamic linking for BeOS */
|
||||
|
||||
#include <kernel/image.h>
|
||||
|
||||
static int
|
||||
sys_bedl_init LTDL_PARAMS((void))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
sys_bedl_exit LTDL_PARAMS((void))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
sys_bedl_open (handle, filename)
|
||||
lt_dlhandle handle;
|
||||
const char *filename;
|
||||
{
|
||||
image_id image = 0;
|
||||
|
||||
if (filename) {
|
||||
image = load_add_on(filename);
|
||||
} else {
|
||||
image_info info;
|
||||
int32 cookie = 0;
|
||||
if (get_next_image_info(0, &cookie, &info) == B_OK)
|
||||
image = load_add_on(info.name);
|
||||
}
|
||||
if (image <= 0) {
|
||||
last_error = cannot_open_error;
|
||||
return 1;
|
||||
}
|
||||
handle->handle = (void*) image;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
sys_bedl_close (handle)
|
||||
lt_dlhandle handle;
|
||||
{
|
||||
if (unload_add_on((image_id)handle->handle) != B_OK) {
|
||||
last_error = cannot_close_error;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static lt_ptr_t
|
||||
sys_bedl_sym (handle, symbol)
|
||||
lt_dlhandle handle;
|
||||
const char *symbol;
|
||||
{
|
||||
lt_ptr_t address = 0;
|
||||
image_id image = (image_id)handle->handle;
|
||||
|
||||
if (get_image_symbol(image, symbol, B_SYMBOL_TYPE_ANY,
|
||||
&address) != B_OK) {
|
||||
last_error = symbol_error;
|
||||
return 0;
|
||||
}
|
||||
return address;
|
||||
}
|
||||
|
||||
static
|
||||
lt_dltype_t
|
||||
sys_bedl = { LTDL_TYPE_TOP, 0, sys_bedl_init, sys_bedl_exit,
|
||||
sys_bedl_open, sys_bedl_close, sys_bedl_sym };
|
||||
|
||||
#undef LTDL_TYPE_TOP
|
||||
#define LTDL_TYPE_TOP &sys_bedl
|
||||
#define LTDL_TYPE_TOP &wll
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -689,7 +554,7 @@ static const lt_dlsymlist *default_preloaded_symbols = 0;
|
|||
static lt_dlsymlists_t *preloaded_symbols = 0;
|
||||
|
||||
static int
|
||||
presym_init LTDL_PARAMS((void))
|
||||
presym_init ()
|
||||
{
|
||||
preloaded_symbols = 0;
|
||||
if (default_preloaded_symbols)
|
||||
|
@ -698,7 +563,7 @@ presym_init LTDL_PARAMS((void))
|
|||
}
|
||||
|
||||
static int
|
||||
presym_free_symlists LTDL_PARAMS((void))
|
||||
presym_free_symlists ()
|
||||
{
|
||||
lt_dlsymlists_t *lists = preloaded_symbols;
|
||||
|
||||
|
@ -713,7 +578,7 @@ presym_free_symlists LTDL_PARAMS((void))
|
|||
}
|
||||
|
||||
static int
|
||||
presym_exit LTDL_PARAMS((void))
|
||||
presym_exit ()
|
||||
{
|
||||
presym_free_symlists();
|
||||
return 0;
|
||||
|
@ -785,8 +650,6 @@ static int
|
|||
presym_close (handle)
|
||||
lt_dlhandle handle;
|
||||
{
|
||||
/* Just to silence gcc -Wall */
|
||||
handle = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -823,7 +686,7 @@ static lt_dltype_t *types = LTDL_TYPE_TOP;
|
|||
#undef LTDL_TYPE_TOP
|
||||
|
||||
int
|
||||
lt_dlinit LTDL_PARAMS((void))
|
||||
lt_dlinit ()
|
||||
{
|
||||
/* initialize libltdl */
|
||||
lt_dltype_t **type = &types;
|
||||
|
@ -874,7 +737,7 @@ lt_dlpreload_default (preloaded)
|
|||
}
|
||||
|
||||
int
|
||||
lt_dlexit LTDL_PARAMS((void))
|
||||
lt_dlexit ()
|
||||
{
|
||||
/* shut down libltdl */
|
||||
lt_dltype_t *type = types;
|
||||
|
@ -1112,8 +975,6 @@ load_deplibs(handle, deplibs)
|
|||
/* FIXME: load deplibs */
|
||||
handle->depcount = 0;
|
||||
handle->deplibs = 0;
|
||||
/* Just to silence gcc -Wall */
|
||||
deplibs = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1122,8 +983,6 @@ unload_deplibs(handle)
|
|||
lt_dlhandle handle;
|
||||
{
|
||||
/* FIXME: unload deplibs */
|
||||
/* Just to silence gcc -Wall */
|
||||
handle = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1135,7 +994,7 @@ trim (dest, str)
|
|||
/* remove the leading and trailing "'" from str
|
||||
and store the result in dest */
|
||||
char *tmp;
|
||||
const char *end = strrchr(str, '\'');
|
||||
char *end = strrchr(str, '\'');
|
||||
int len = strlen(str);
|
||||
|
||||
if (*dest)
|
||||
|
@ -1240,7 +1099,7 @@ lt_dlopen (filename)
|
|||
}
|
||||
/* canonicalize the module name */
|
||||
for (i = 0; i < ext - basename; i++)
|
||||
if (isalnum((int)(basename[i])))
|
||||
if (isalnum(basename[i]))
|
||||
name[i] = basename[i];
|
||||
else
|
||||
name[i] = '_';
|
||||
|
@ -1558,7 +1417,7 @@ lt_dlsym (handle, symbol)
|
|||
}
|
||||
|
||||
const char *
|
||||
lt_dlerror LTDL_PARAMS((void))
|
||||
lt_dlerror ()
|
||||
{
|
||||
const char *error = last_error;
|
||||
|
||||
|
@ -1581,12 +1440,11 @@ lt_dladdsearchdir (search_dir)
|
|||
} else {
|
||||
char *new_search_path = (char*)
|
||||
lt_dlmalloc(strlen(user_search_path) +
|
||||
strlen(search_dir) + 2); /* ':' + '\0' == 2 */
|
||||
strlen(search_dir) + 1);
|
||||
if (!new_search_path) {
|
||||
last_error = memory_error;
|
||||
return 1;
|
||||
}
|
||||
strcpy(new_search_path, user_search_path);
|
||||
strcat(new_search_path, ":");
|
||||
strcat(new_search_path, search_dir);
|
||||
lt_dlfree(user_search_path);
|
||||
|
@ -1611,7 +1469,7 @@ lt_dlsetsearchpath (search_path)
|
|||
}
|
||||
|
||||
const char *
|
||||
lt_dlgetsearchpath LTDL_PARAMS((void))
|
||||
lt_dlgetsearchpath ()
|
||||
{
|
||||
return user_search_path;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* ltdl.h -- generic dlopen functions
|
||||
Copyright (C) 1998-1999 Free Software Foundation, Inc.
|
||||
Originally by Thomas Tanner <tanner@ffii.org>
|
||||
Originally by Thomas Tanner <tanner@gmx.de>
|
||||
This file is part of GNU Libtool.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
|
@ -8,11 +8,6 @@ modify it under the terms of the GNU Library General Public
|
|||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
As a special exception to the GNU Library General Public License,
|
||||
if you distribute this file as part of a program that uses GNU libtool
|
||||
to create libraries and programs, you may include it under the same
|
||||
distribution terms that you use for the rest of that program.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
|
@ -40,16 +35,16 @@ Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|||
# define __END_DECLS /* empty */
|
||||
#endif
|
||||
|
||||
/* LTDL_PARAMS is a macro used to wrap function prototypes, so that compilers
|
||||
/* __P is a macro used to wrap function prototypes, so that compilers
|
||||
that don't understand ANSI C prototypes still work, and ANSI C
|
||||
compilers can issue warnings about type mismatches. */
|
||||
#undef LTDL_PARAMS
|
||||
#undef __P
|
||||
#undef lt_ptr_t
|
||||
#if defined (__STDC__) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(WIN32) || defined(__cplusplus)
|
||||
# define LTDL_PARAMS(protos) protos
|
||||
# define __P(protos) protos
|
||||
# define lt_ptr_t void*
|
||||
#else
|
||||
# define LTDL_PARAMS(protos) ()
|
||||
# define __P(protos) ()
|
||||
# define lt_ptr_t char*
|
||||
#endif
|
||||
|
||||
|
@ -67,24 +62,24 @@ typedef struct {
|
|||
} lt_dlsymlist;
|
||||
|
||||
__BEGIN_DECLS
|
||||
extern int lt_dlinit LTDL_PARAMS((void));
|
||||
extern int lt_dlpreload LTDL_PARAMS((const lt_dlsymlist *preloaded));
|
||||
extern int lt_dlpreload_default LTDL_PARAMS((const lt_dlsymlist *preloaded));
|
||||
extern int lt_dlexit LTDL_PARAMS((void));
|
||||
extern lt_dlhandle lt_dlopen LTDL_PARAMS((const char *filename));
|
||||
extern lt_dlhandle lt_dlopenext LTDL_PARAMS((const char *filename));
|
||||
extern int lt_dlclose LTDL_PARAMS((lt_dlhandle handle));
|
||||
extern lt_ptr_t lt_dlsym LTDL_PARAMS((lt_dlhandle handle, const char *name));
|
||||
extern const char *lt_dlerror LTDL_PARAMS((void));
|
||||
extern int lt_dladdsearchdir LTDL_PARAMS((const char *search_dir));
|
||||
extern int lt_dlsetsearchpath LTDL_PARAMS((const char *search_path));
|
||||
extern const char *lt_dlgetsearchpath LTDL_PARAMS((void));
|
||||
extern int lt_dlinit __P((void));
|
||||
extern int lt_dlpreload __P((const lt_dlsymlist *preloaded));
|
||||
extern int lt_dlpreload_default __P((const lt_dlsymlist *preloaded));
|
||||
extern int lt_dlexit __P((void));
|
||||
extern lt_dlhandle lt_dlopen __P((const char *filename));
|
||||
extern lt_dlhandle lt_dlopenext __P((const char *filename));
|
||||
extern int lt_dlclose __P((lt_dlhandle handle));
|
||||
extern lt_ptr_t lt_dlsym __P((lt_dlhandle handle, const char *name));
|
||||
extern const char *lt_dlerror __P((void));
|
||||
extern int lt_dladdsearchdir __P((const char *search_dir));
|
||||
extern int lt_dlsetsearchpath __P((const char *search_path));
|
||||
extern const char *lt_dlgetsearchpath __P((void));
|
||||
|
||||
extern const lt_dlsymlist lt_preloaded_symbols[];
|
||||
#define LTDL_SET_PRELOADED_SYMBOLS() lt_dlpreload_default(lt_preloaded_symbols)
|
||||
|
||||
extern lt_ptr_t (*lt_dlmalloc)LTDL_PARAMS((size_t size));
|
||||
extern void (*lt_dlfree)LTDL_PARAMS((lt_ptr_t ptr));
|
||||
extern lt_ptr_t (*lt_dlmalloc)__P((size_t size));
|
||||
extern void (*lt_dlfree)__P((lt_ptr_t ptr));
|
||||
|
||||
__END_DECLS
|
||||
|
||||
|
|
5
main.c
5
main.c
|
@ -68,7 +68,6 @@ int main (int argc, char **argv)
|
|||
file = argv[i];
|
||||
}
|
||||
printf("init\n");
|
||||
__imlib_RGBA_init();
|
||||
disp = XOpenDisplay(NULL);
|
||||
printf("load\n");
|
||||
im = __imlib_LoadImage(file, NULL, 0, 0, 0);
|
||||
|
@ -95,8 +94,6 @@ int main (int argc, char **argv)
|
|||
}
|
||||
vis = DefaultVisual(disp, DefaultScreen(disp));
|
||||
depth = DefaultDepth(disp, DefaultScreen(disp));
|
||||
if (depth == 8)
|
||||
__imlib_AllocColorTable(disp, DefaultColormap(disp, DefaultScreen(disp)));
|
||||
XSync(disp, False);
|
||||
printf("rend\n");
|
||||
gettimeofday(&timev,NULL);
|
||||
|
@ -209,8 +206,6 @@ int main (int argc, char **argv)
|
|||
vis = DefaultVisual(disp, DefaultScreen(disp));
|
||||
depth = DefaultDepth(disp, DefaultScreen(disp));
|
||||
cm = DefaultColormap(disp, DefaultScreen(disp));
|
||||
if (depth == 8)
|
||||
__imlib_AllocColorTable(disp, cm);
|
||||
__imlib_SetMaxXImageCount(disp, 0);
|
||||
XSync(disp, False);
|
||||
printf("init\n");
|
||||
|
|
782
rend.c
782
rend.c
|
@ -4,6 +4,7 @@
|
|||
#include "scale.h"
|
||||
#include "image.h"
|
||||
#include "ximage.h"
|
||||
#include "context.h"
|
||||
#include "rend.h"
|
||||
#include "rgba.h"
|
||||
#include "color.h"
|
||||
|
@ -28,396 +29,397 @@ __imlib_RenderImage(Display *d, ImlibImage *im,
|
|||
int dx, int dy, int dw, int dh,
|
||||
char anitalias, char hiq, char blend, char dither_mask)
|
||||
{
|
||||
XImage *xim, *mxim;
|
||||
DATA32 *buf = NULL, *pointer, *back = NULL;
|
||||
int y, h, hh, jump;
|
||||
static GC gc = 0;
|
||||
static GC gcm = 0;
|
||||
XGCValues gcv;
|
||||
DATA32 **ypoints = NULL;
|
||||
int *xpoints = NULL;
|
||||
int *yapoints = NULL;
|
||||
int *xapoints = NULL;
|
||||
int scw, sch;
|
||||
int psx, psy, psw, psh;
|
||||
char xup = 0, yup = 0;
|
||||
char shm = 0;
|
||||
|
||||
/* dont do anything if we have a 0 widht or height image to render */
|
||||
if ((dw <= 0) || (dh <= 0))
|
||||
return;
|
||||
/* if the input rect size < 0 dont render either */
|
||||
if ((sw <= 0) || (sh <= 0))
|
||||
return;
|
||||
/* if the output is too big (8k arbitary limit here) dont bother */
|
||||
if ((dw > 8192) || (dh > 8192))
|
||||
return;
|
||||
/* clip the source rect to be within the actual image */
|
||||
psx = sx;
|
||||
psy = sy;
|
||||
psw = sw;
|
||||
psh = sh;
|
||||
CLIP(sx, sy, sw, sh, 0, 0, im->w, im->h);
|
||||
/* clip output coords to clipped input coords */
|
||||
if (psx != sx)
|
||||
dx = (dx * sx) / psx;
|
||||
if (psy != sy)
|
||||
dy = (dy * sy) / psy;
|
||||
if (psw != sw)
|
||||
dw = (dw * sw) / psw;
|
||||
if (psh != sh)
|
||||
dh = (dh * sh) / psh;
|
||||
/* do a second check to see if we now have invalid coords */
|
||||
/* dont do anything if we have a 0 widht or height image to render */
|
||||
if ((dw <= 0) || (dh <= 0))
|
||||
return;
|
||||
/* if the input rect size < 0 dont render either */
|
||||
if ((sw <= 0) || (sh <= 0))
|
||||
return;
|
||||
/* if the output is too big (8k arbitary limit here) dont bother */
|
||||
if ((dw > 8192) || (dh > 8192))
|
||||
return;
|
||||
/* calculate the scaling factors of width and height for a whole image */
|
||||
scw = dw * im->w / sw;
|
||||
sch = dh * im->h / sh;
|
||||
/* if we are scaling the image at all make a scaling buffer */
|
||||
if (!((sw == dw) && (sh == dh)))
|
||||
{
|
||||
/* need to calculate ypoitns and xpoints array */
|
||||
ypoints = __imlib_CalcYPoints(im->data, im->w, im->h, sch, im->border.top, im->border.bottom);
|
||||
if (!ypoints)
|
||||
return;
|
||||
xpoints = __imlib_CalcXPoints(im->w, scw, im->border.left, im->border.right);
|
||||
if (!xpoints)
|
||||
{
|
||||
free(ypoints);
|
||||
return;
|
||||
}
|
||||
/* calculate aliasing counts */
|
||||
if (anitalias)
|
||||
{
|
||||
yapoints = __imlib_CalcApoints(im->h, sch, im->border.top, im->border.bottom);
|
||||
if (!yapoints)
|
||||
{
|
||||
free(ypoints);
|
||||
free(xpoints);
|
||||
return;
|
||||
}
|
||||
xapoints = __imlib_CalcApoints(im->w, scw, im->border.left, im->border.right);
|
||||
if (!xapoints)
|
||||
{
|
||||
free(yapoints);
|
||||
free(ypoints);
|
||||
free(xpoints);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((blend) && (IMAGE_HAS_ALPHA(im)))
|
||||
back = __imlib_GrabDrawableToRGBA(d, w, 0, v, cm, depth, dx, dy, dw, dh, 0);
|
||||
/* get a new XImage - or get one from the cached list */
|
||||
xim = __imlib_ProduceXImage(d, v, depth, dw, dh, &shm);
|
||||
if (!xim)
|
||||
{
|
||||
if (anitalias)
|
||||
{
|
||||
free(xapoints);
|
||||
free(yapoints);
|
||||
}
|
||||
free(ypoints);
|
||||
free(xpoints);
|
||||
if (back)
|
||||
free(back);
|
||||
XImage *xim, *mxim;
|
||||
Context *ct;
|
||||
DATA32 *buf = NULL, *pointer, *back = NULL;
|
||||
int y, h, hh, jump;
|
||||
static GC gc = 0;
|
||||
static GC gcm = 0;
|
||||
XGCValues gcv;
|
||||
DATA32 **ypoints = NULL;
|
||||
int *xpoints = NULL;
|
||||
int *yapoints = NULL;
|
||||
int *xapoints = NULL;
|
||||
int scw, sch;
|
||||
int psx, psy, psw, psh;
|
||||
char xup = 0, yup = 0;
|
||||
char shm = 0;
|
||||
|
||||
/* dont do anything if we have a 0 widht or height image to render */
|
||||
if ((dw <= 0) || (dh <= 0))
|
||||
return;
|
||||
}
|
||||
/* do a double check in 24/32bpp */
|
||||
if ((xim->bits_per_pixel == 32) && (depth == 24))
|
||||
depth = 32;
|
||||
if (m)
|
||||
{
|
||||
mxim = __imlib_ProduceXImage(d, v, 1, dw, dh, &shm);
|
||||
if (!mxim)
|
||||
{
|
||||
__imlib_ConsumeXImage(d, xim);
|
||||
if (anitalias)
|
||||
{
|
||||
free(xapoints);
|
||||
free(yapoints);
|
||||
}
|
||||
free(ypoints);
|
||||
free(xpoints);
|
||||
if (back)
|
||||
free(back);
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* if we are scaling the image at all make a scaling buffer */
|
||||
if (!((sw == dw) && (sh == dh)))
|
||||
{
|
||||
/* allocate a buffer to render scaled RGBA data into */
|
||||
buf = malloc(dw * LINESIZE * sizeof(int));
|
||||
if (!buf)
|
||||
{
|
||||
__imlib_ConsumeXImage(d, xim);
|
||||
if (m)
|
||||
__imlib_ConsumeXImage(d, mxim);
|
||||
if (anitalias)
|
||||
{
|
||||
free(xapoints);
|
||||
free(yapoints);
|
||||
}
|
||||
free(ypoints);
|
||||
free(xpoints);
|
||||
if (back)
|
||||
free(back);
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* setup h */
|
||||
h = dh;
|
||||
/* set our scaling up in x / y dir flags */
|
||||
if (dw > sw)
|
||||
xup = 1;
|
||||
if (dh > sh)
|
||||
yup = 1;
|
||||
/* scale in LINESIZE Y chunks and convert to depth*/
|
||||
for (y = 0; y < dh; y += LINESIZE)
|
||||
{
|
||||
hh = LINESIZE;
|
||||
if (h < LINESIZE)
|
||||
hh = h;
|
||||
/* if we're scaling it */
|
||||
if (buf)
|
||||
{
|
||||
/* scale the imagedata for this LINESIZE lines chunk of image data */
|
||||
if (anitalias)
|
||||
{
|
||||
if (IMAGE_HAS_ALPHA(im))
|
||||
__imlib_ScaleAARGBA(ypoints, xpoints, buf, xapoints, yapoints, xup, yup, dx, dy + y, 0, 0, dw, hh, dw, im->w);
|
||||
else
|
||||
__imlib_ScaleAARGB(ypoints, xpoints, buf, xapoints, yapoints, xup, yup, dx, dy + y, 0, 0, dw, hh, dw, im->w);
|
||||
}
|
||||
else
|
||||
__imlib_ScaleSampleRGBA(ypoints, xpoints, buf, dx, dy + y, 0, 0, dw, hh, dw);
|
||||
jump = 0;
|
||||
pointer = buf;
|
||||
}
|
||||
else
|
||||
{
|
||||
jump = im->w - sw;
|
||||
pointer = im->data + ((y + sy) * im->w) + sx;
|
||||
}
|
||||
/* if we have a back buffer - we're blending to the bg */
|
||||
if (back)
|
||||
{
|
||||
__imlib_BlendRGBAToRGBA(pointer, jump, back + (y * dw), 0, dw, hh);
|
||||
pointer = back + (y * dw);
|
||||
jump = 0;
|
||||
}
|
||||
/* once scaled... convert chunk to bit depth into XImage bufer */
|
||||
/* NB - the order here may be random - but I chose it to select most */
|
||||
/* common depths first */
|
||||
if (depth == 16)
|
||||
{
|
||||
if (hiq)
|
||||
__imlib_RGBA_to_RGB565_dither(pointer, jump,
|
||||
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
|
||||
(xim->bytes_per_line / sizeof(DATA16)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_RGB565_fast(pointer, jump,
|
||||
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
|
||||
(xim->bytes_per_line / sizeof(DATA16)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
}
|
||||
/* FIXME: need to handle different RGB ordering */
|
||||
else if (depth == 24)
|
||||
{
|
||||
__imlib_RGBA_to_RGB888_fast(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * xim->bytes_per_line),
|
||||
xim->bytes_per_line - (dw * 3),
|
||||
dw, hh, dx, dy + y);
|
||||
}
|
||||
else if (depth == 32)
|
||||
{
|
||||
__imlib_RGBA_to_RGB8888_fast(pointer, jump,
|
||||
((DATA32 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA32))),
|
||||
(xim->bytes_per_line / sizeof(DATA32)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
}
|
||||
else if (depth == 8)
|
||||
{
|
||||
if (_pal_type == 0)
|
||||
{
|
||||
if (hiq)
|
||||
__imlib_RGBA_to_RGB332_dither(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_RGB332_fast(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
}
|
||||
else if (_pal_type == 1)
|
||||
{
|
||||
if (hiq)
|
||||
__imlib_RGBA_to_RGB232_dither(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_RGB232_fast(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
}
|
||||
else if (_pal_type == 2)
|
||||
{
|
||||
if (hiq)
|
||||
__imlib_RGBA_to_RGB222_dither(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_RGB222_fast(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
}
|
||||
else if (_pal_type == 3)
|
||||
{
|
||||
if (hiq)
|
||||
__imlib_RGBA_to_RGB221_dither(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_RGB221_fast(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
}
|
||||
else if (_pal_type == 4)
|
||||
{
|
||||
if (hiq)
|
||||
__imlib_RGBA_to_RGB121_dither(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_RGB121_fast(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
}
|
||||
else if (_pal_type == 5)
|
||||
{
|
||||
if (hiq)
|
||||
__imlib_RGBA_to_RGB111_dither(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_RGB111_fast(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
}
|
||||
else if (_pal_type == 6)
|
||||
{
|
||||
if (hiq)
|
||||
__imlib_RGBA_to_RGB1_dither(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_RGB1_fast(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
}
|
||||
}
|
||||
else if (depth == 15)
|
||||
{
|
||||
if (hiq)
|
||||
__imlib_RGBA_to_RGB555_dither(pointer, jump,
|
||||
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
|
||||
(xim->bytes_per_line / sizeof(DATA16)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_RGB555_fast(pointer, jump,
|
||||
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
|
||||
(xim->bytes_per_line / sizeof(DATA16)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
}
|
||||
if (m)
|
||||
{
|
||||
memset(((DATA8 *)mxim->data) + (y * (mxim->bytes_per_line)),
|
||||
0x0, mxim->bytes_per_line * hh);
|
||||
if (dither_mask)
|
||||
__imlib_RGBA_to_A1_dither(pointer, jump,
|
||||
((DATA8 *)mxim->data) + (y * (mxim->bytes_per_line)),
|
||||
(mxim->bytes_per_line) - (dw >> 3),
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_A1_fast(pointer, jump,
|
||||
((DATA8 *)mxim->data) + (y * (mxim->bytes_per_line)),
|
||||
(mxim->bytes_per_line) - (dw >> 3),
|
||||
dw, hh, dx, dy + y);
|
||||
}
|
||||
/* FIXME: have to add code to generate mask if asked for */
|
||||
h -= LINESIZE;
|
||||
}
|
||||
/* free up our buffers and poit tables */
|
||||
if (buf)
|
||||
{
|
||||
free(buf);
|
||||
free(ypoints);
|
||||
free(xpoints);
|
||||
}
|
||||
if (anitalias)
|
||||
{
|
||||
free(yapoints);
|
||||
free(xapoints);
|
||||
}
|
||||
if (back)
|
||||
free(back);
|
||||
/* if we didnt have a gc... create it */
|
||||
if (!gc)
|
||||
{
|
||||
gcv.graphics_exposures = False;
|
||||
gc = XCreateGC(d, w, GCGraphicsExposures, &gcv);
|
||||
}
|
||||
if (m)
|
||||
{
|
||||
if (!gcm)
|
||||
{
|
||||
gcv.graphics_exposures = False;
|
||||
gcm = XCreateGC(d, m, GCGraphicsExposures, &gcv);
|
||||
}
|
||||
/* write the mask */
|
||||
if (shm)
|
||||
/* write shm XImage */
|
||||
XShmPutImage(d, m, gcm, mxim, 0, 0, dx, dy, dw, dh, False);
|
||||
/* write regular XImage */
|
||||
else
|
||||
XPutImage(d, m, gcm, mxim, 0, 0, dx, dy, dw, dh);
|
||||
}
|
||||
/* write the image */
|
||||
if (shm)
|
||||
/* write shm XImage */
|
||||
XShmPutImage(d, w, gc, xim, 0, 0, dx, dy, dw, dh, False);
|
||||
/* write regular XImage */
|
||||
else
|
||||
XPutImage(d, w, gc, xim, 0, 0, dx, dy, dw, dh);
|
||||
/* free the XImage and put onto our free list */
|
||||
/* wait for the write to be done */
|
||||
if (shm)
|
||||
XSync(d, False);
|
||||
__imlib_ConsumeXImage(d, xim);
|
||||
if (m)
|
||||
__imlib_ConsumeXImage(d, mxim);
|
||||
/* if the input rect size < 0 dont render either */
|
||||
if ((sw <= 0) || (sh <= 0))
|
||||
return;
|
||||
/* if the output is too big (8k arbitary limit here) dont bother */
|
||||
if ((dw > 8192) || (dh > 8192))
|
||||
return;
|
||||
/* clip the source rect to be within the actual image */
|
||||
psx = sx;
|
||||
psy = sy;
|
||||
psw = sw;
|
||||
psh = sh;
|
||||
CLIP(sx, sy, sw, sh, 0, 0, im->w, im->h);
|
||||
/* clip output coords to clipped input coords */
|
||||
if (psx != sx)
|
||||
dx = (dx * sx) / psx;
|
||||
if (psy != sy)
|
||||
dy = (dy * sy) / psy;
|
||||
if (psw != sw)
|
||||
dw = (dw * sw) / psw;
|
||||
if (psh != sh)
|
||||
dh = (dh * sh) / psh;
|
||||
/* do a second check to see if we now have invalid coords */
|
||||
/* dont do anything if we have a 0 widht or height image to render */
|
||||
if ((dw <= 0) || (dh <= 0))
|
||||
return;
|
||||
/* if the input rect size < 0 dont render either */
|
||||
if ((sw <= 0) || (sh <= 0))
|
||||
return;
|
||||
/* if the output is too big (8k arbitary limit here) dont bother */
|
||||
if ((dw > 8192) || (dh > 8192))
|
||||
return;
|
||||
/* calculate the scaling factors of width and height for a whole image */
|
||||
scw = dw * im->w / sw;
|
||||
sch = dh * im->h / sh;
|
||||
/* if we are scaling the image at all make a scaling buffer */
|
||||
if (!((sw == dw) && (sh == dh)))
|
||||
{
|
||||
/* need to calculate ypoitns and xpoints array */
|
||||
ypoints = __imlib_CalcYPoints(im->data, im->w, im->h, sch, im->border.top, im->border.bottom);
|
||||
if (!ypoints)
|
||||
return;
|
||||
xpoints = __imlib_CalcXPoints(im->w, scw, im->border.left, im->border.right);
|
||||
if (!xpoints)
|
||||
{
|
||||
free(ypoints);
|
||||
return;
|
||||
}
|
||||
/* calculate aliasing counts */
|
||||
if (anitalias)
|
||||
{
|
||||
yapoints = __imlib_CalcApoints(im->h, sch, im->border.top, im->border.bottom);
|
||||
if (!yapoints)
|
||||
{
|
||||
free(ypoints);
|
||||
free(xpoints);
|
||||
return;
|
||||
}
|
||||
xapoints = __imlib_CalcApoints(im->w, scw, im->border.left, im->border.right);
|
||||
if (!xapoints)
|
||||
{
|
||||
free(yapoints);
|
||||
free(ypoints);
|
||||
free(xpoints);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
ct = __imlib_GetContext(d, v, cm, depth);
|
||||
__imlib_RGBASetupContext(ct);
|
||||
if ((blend) && (IMAGE_HAS_ALPHA(im)))
|
||||
back = __imlib_GrabDrawableToRGBA(d, w, 0, v, cm, depth, dx, dy, dw, dh, 0);
|
||||
/* get a new XImage - or get one from the cached list */
|
||||
xim = __imlib_ProduceXImage(d, v, depth, dw, dh, &shm);
|
||||
if (!xim)
|
||||
{
|
||||
if (anitalias)
|
||||
{
|
||||
free(xapoints);
|
||||
free(yapoints);
|
||||
}
|
||||
free(ypoints);
|
||||
free(xpoints);
|
||||
if (back)
|
||||
free(back);
|
||||
return;
|
||||
}
|
||||
/* do a double check in 24/32bpp */
|
||||
if ((xim->bits_per_pixel == 32) && (depth == 24))
|
||||
depth = 32;
|
||||
if (m)
|
||||
{
|
||||
mxim = __imlib_ProduceXImage(d, v, 1, dw, dh, &shm);
|
||||
if (!mxim)
|
||||
{
|
||||
__imlib_ConsumeXImage(d, xim);
|
||||
if (anitalias)
|
||||
{
|
||||
free(xapoints);
|
||||
free(yapoints);
|
||||
}
|
||||
free(ypoints);
|
||||
free(xpoints);
|
||||
if (back)
|
||||
free(back);
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* if we are scaling the image at all make a scaling buffer */
|
||||
if (!((sw == dw) && (sh == dh)))
|
||||
{
|
||||
/* allocate a buffer to render scaled RGBA data into */
|
||||
buf = malloc(dw * LINESIZE * sizeof(int));
|
||||
if (!buf)
|
||||
{
|
||||
__imlib_ConsumeXImage(d, xim);
|
||||
if (m)
|
||||
__imlib_ConsumeXImage(d, mxim);
|
||||
if (anitalias)
|
||||
{
|
||||
free(xapoints);
|
||||
free(yapoints);
|
||||
}
|
||||
free(ypoints);
|
||||
free(xpoints);
|
||||
if (back)
|
||||
free(back);
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* setup h */
|
||||
h = dh;
|
||||
/* set our scaling up in x / y dir flags */
|
||||
if (dw > sw)
|
||||
xup = 1;
|
||||
if (dh > sh)
|
||||
yup = 1;
|
||||
/* scale in LINESIZE Y chunks and convert to depth*/
|
||||
for (y = 0; y < dh; y += LINESIZE)
|
||||
{
|
||||
hh = LINESIZE;
|
||||
if (h < LINESIZE)
|
||||
hh = h;
|
||||
/* if we're scaling it */
|
||||
if (buf)
|
||||
{
|
||||
/* scale the imagedata for this LINESIZE lines chunk of image data */
|
||||
if (anitalias)
|
||||
{
|
||||
if (IMAGE_HAS_ALPHA(im))
|
||||
__imlib_ScaleAARGBA(ypoints, xpoints, buf, xapoints, yapoints, xup, yup, dx, dy + y, 0, 0, dw, hh, dw, im->w);
|
||||
else
|
||||
__imlib_ScaleAARGB(ypoints, xpoints, buf, xapoints, yapoints, xup, yup, dx, dy + y, 0, 0, dw, hh, dw, im->w);
|
||||
}
|
||||
else
|
||||
__imlib_ScaleSampleRGBA(ypoints, xpoints, buf, dx, dy + y, 0, 0, dw, hh, dw);
|
||||
jump = 0;
|
||||
pointer = buf;
|
||||
}
|
||||
else
|
||||
{
|
||||
jump = im->w - sw;
|
||||
pointer = im->data + ((y + sy) * im->w) + sx;
|
||||
}
|
||||
/* if we have a back buffer - we're blending to the bg */
|
||||
if (back)
|
||||
{
|
||||
__imlib_BlendRGBAToRGBA(pointer, jump, back + (y * dw), 0, dw, hh);
|
||||
pointer = back + (y * dw);
|
||||
jump = 0;
|
||||
}
|
||||
/* once scaled... convert chunk to bit depth into XImage bufer */
|
||||
/* NB - the order here may be random - but I chose it to select most */
|
||||
/* common depths first */
|
||||
if (depth == 16)
|
||||
{
|
||||
if (hiq)
|
||||
__imlib_RGBA_to_RGB565_dither(pointer, jump,
|
||||
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
|
||||
(xim->bytes_per_line / sizeof(DATA16)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_RGB565_fast(pointer, jump,
|
||||
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
|
||||
(xim->bytes_per_line / sizeof(DATA16)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
}
|
||||
/* FIXME: need to handle different RGB ordering */
|
||||
else if (depth == 24)
|
||||
{
|
||||
__imlib_RGBA_to_RGB888_fast(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * xim->bytes_per_line),
|
||||
xim->bytes_per_line - (dw * 3),
|
||||
dw, hh, dx, dy + y);
|
||||
}
|
||||
else if (depth == 32)
|
||||
{
|
||||
__imlib_RGBA_to_RGB8888_fast(pointer, jump,
|
||||
((DATA32 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA32))),
|
||||
(xim->bytes_per_line / sizeof(DATA32)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
}
|
||||
else if (depth == 8)
|
||||
{
|
||||
switch (ct->palette_type)
|
||||
{
|
||||
case 0:
|
||||
if (hiq)
|
||||
__imlib_RGBA_to_RGB332_dither(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_RGB332_fast(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
break;
|
||||
case 1:
|
||||
if (hiq)
|
||||
__imlib_RGBA_to_RGB232_dither(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_RGB232_fast(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
break;
|
||||
case 2:
|
||||
if (hiq)
|
||||
__imlib_RGBA_to_RGB222_dither(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_RGB222_fast(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
break;
|
||||
case 3:
|
||||
if (hiq)
|
||||
__imlib_RGBA_to_RGB221_dither(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_RGB221_fast(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
break;
|
||||
case 4:
|
||||
if (hiq)
|
||||
__imlib_RGBA_to_RGB121_dither(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_RGB121_fast(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
break;
|
||||
case 5:
|
||||
if (hiq)
|
||||
__imlib_RGBA_to_RGB111_dither(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_RGB111_fast(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
break;
|
||||
case 6:
|
||||
if (hiq)
|
||||
__imlib_RGBA_to_RGB1_dither(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_RGB1_fast(pointer, jump,
|
||||
((DATA8 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA8))),
|
||||
(xim->bytes_per_line / sizeof(DATA8)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (depth == 15)
|
||||
{
|
||||
if (hiq)
|
||||
__imlib_RGBA_to_RGB555_dither(pointer, jump,
|
||||
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
|
||||
(xim->bytes_per_line / sizeof(DATA16)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_RGB555_fast(pointer, jump,
|
||||
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
|
||||
(xim->bytes_per_line / sizeof(DATA16)) - dw,
|
||||
dw, hh, dx, dy + y);
|
||||
}
|
||||
if (m)
|
||||
{
|
||||
memset(((DATA8 *)mxim->data) + (y * (mxim->bytes_per_line)),
|
||||
0x0, mxim->bytes_per_line * hh);
|
||||
if (dither_mask)
|
||||
__imlib_RGBA_to_A1_dither(pointer, jump,
|
||||
((DATA8 *)mxim->data) + (y * (mxim->bytes_per_line)),
|
||||
(mxim->bytes_per_line) - (dw >> 3),
|
||||
dw, hh, dx, dy + y);
|
||||
else
|
||||
__imlib_RGBA_to_A1_fast(pointer, jump,
|
||||
((DATA8 *)mxim->data) + (y * (mxim->bytes_per_line)),
|
||||
(mxim->bytes_per_line) - (dw >> 3),
|
||||
dw, hh, dx, dy + y);
|
||||
}
|
||||
/* FIXME: have to add code to generate mask if asked for */
|
||||
h -= LINESIZE;
|
||||
}
|
||||
/* free up our buffers and poit tables */
|
||||
if (buf)
|
||||
{
|
||||
free(buf);
|
||||
free(ypoints);
|
||||
free(xpoints);
|
||||
}
|
||||
if (anitalias)
|
||||
{
|
||||
free(yapoints);
|
||||
free(xapoints);
|
||||
}
|
||||
if (back)
|
||||
free(back);
|
||||
/* if we didnt have a gc... create it */
|
||||
if (!gc)
|
||||
{
|
||||
gcv.graphics_exposures = False;
|
||||
gc = XCreateGC(d, w, GCGraphicsExposures, &gcv);
|
||||
}
|
||||
if (m)
|
||||
{
|
||||
if (!gcm)
|
||||
{
|
||||
gcv.graphics_exposures = False;
|
||||
gcm = XCreateGC(d, m, GCGraphicsExposures, &gcv);
|
||||
}
|
||||
/* write the mask */
|
||||
if (shm)
|
||||
/* write shm XImage */
|
||||
XShmPutImage(d, m, gcm, mxim, 0, 0, dx, dy, dw, dh, False);
|
||||
/* write regular XImage */
|
||||
else
|
||||
XPutImage(d, m, gcm, mxim, 0, 0, dx, dy, dw, dh);
|
||||
}
|
||||
/* write the image */
|
||||
if (shm)
|
||||
/* write shm XImage */
|
||||
XShmPutImage(d, w, gc, xim, 0, 0, dx, dy, dw, dh, False);
|
||||
/* write regular XImage */
|
||||
else
|
||||
XPutImage(d, w, gc, xim, 0, 0, dx, dy, dw, dh);
|
||||
/* free the XImage and put onto our free list */
|
||||
/* wait for the write to be done */
|
||||
if (shm)
|
||||
XSync(d, False);
|
||||
__imlib_ConsumeXImage(d, xim);
|
||||
if (m)
|
||||
__imlib_ConsumeXImage(d, mxim);
|
||||
}
|
||||
|
||||
|
|
621
rgba.c
621
rgba.c
|
@ -1,4 +1,6 @@
|
|||
#include "common.h"
|
||||
#include <X11/Xlib.h>
|
||||
#include "context.h"
|
||||
#include "rgba.h"
|
||||
|
||||
#define IS_ALIGNED_64(val) (!((val) & 0x7))
|
||||
|
@ -15,48 +17,19 @@
|
|||
/* NOTES: */
|
||||
/* x86: RGBA in byte order = ABGR when read as an int (in register/int) */
|
||||
|
||||
/* internal static functions */
|
||||
static void *_load_PNG (int *ww, int *hh, FILE *f);
|
||||
|
||||
/* lookup table to see what color index to use */
|
||||
extern DATA8 _dither_color_lut[256];
|
||||
static DATA8 *_dither_color_lut;
|
||||
static DATA8 _pal_type;
|
||||
|
||||
/* using DATA32 - major speedup for aligned memory reads */
|
||||
|
||||
/* 48Kb of static data (lookup tabel for dithering) */
|
||||
static DATA16 _dither_r565_44[4][4][256];
|
||||
static DATA16 _dither_g565_44[4][4][256];
|
||||
static DATA16 _dither_b565_44[4][4][256];
|
||||
/* another 48Kb of static data (lookup table for dithering) */
|
||||
static DATA16 _dither_r555_44[4][4][256];
|
||||
static DATA16 _dither_g555_44[4][4][256];
|
||||
static DATA16 _dither_b555_44[4][4][256];
|
||||
/* another 24Kb of static data (lookup table for dithering) */
|
||||
static DATA8 _dither_r332_88[8][8][256];
|
||||
static DATA8 _dither_g332_88[8][8][256];
|
||||
static DATA8 _dither_b332_88[8][8][256];
|
||||
/* another 24Kb of static data (lookup table for dithering) */
|
||||
static DATA8 _dither_r232_88[8][8][256];
|
||||
static DATA8 _dither_g232_88[8][8][256];
|
||||
static DATA8 _dither_b232_88[8][8][256];
|
||||
/* another 24Kb of static data (lookup table for dithering) */
|
||||
static DATA8 _dither_r222_88[8][8][256];
|
||||
static DATA8 _dither_g222_88[8][8][256];
|
||||
static DATA8 _dither_b222_88[8][8][256];
|
||||
/* another 24Kb of static data (lookup table for dithering) */
|
||||
static DATA8 _dither_r221_88[8][8][256];
|
||||
static DATA8 _dither_g221_88[8][8][256];
|
||||
static DATA8 _dither_b221_88[8][8][256];
|
||||
/* another 24Kb of static data (lookup table for dithering) */
|
||||
static DATA8 _dither_r121_88[8][8][256];
|
||||
static DATA8 _dither_g121_88[8][8][256];
|
||||
static DATA8 _dither_b121_88[8][8][256];
|
||||
/* another 24Kb of static data (lookup table for dithering) */
|
||||
static DATA8 _dither_r111_88[8][8][256];
|
||||
static DATA8 _dither_g111_88[8][8][256];
|
||||
static DATA8 _dither_b111_88[8][8][256];
|
||||
/* another 8Kb of static data (lookup table for dithering) */
|
||||
static DATA8 _dither_1_88[8][8][256];
|
||||
/* these data structs global rather than context-based for speed */
|
||||
static DATA16 *_dither_r16;
|
||||
static DATA16 *_dither_g16;
|
||||
static DATA16 *_dither_b16;
|
||||
static DATA8 *_dither_r8;
|
||||
static DATA8 *_dither_g8;
|
||||
static DATA8 *_dither_b8;
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Actual rendering routines */
|
||||
|
@ -95,11 +68,11 @@ static DATA8 _dither_1_88[8][8][256];
|
|||
/*****************************************************************************/
|
||||
/* MACROS for dithered RGBA -> RGB565 conversion */
|
||||
#define DITHER_RGBA_565_LUT_R(num) \
|
||||
(_dither_r565_44[(x + num) & 0x3][y & 0x3][(src[num] >> 0 ) & 0xff])
|
||||
(_dither_r16[(((x + num) & 0x3) << 10) | ((y & 0x3) << 8) | ((src[num] >> 0 ) & 0xff)])
|
||||
#define DITHER_RGBA_565_LUT_G(num) \
|
||||
(_dither_g565_44[(x + num) & 0x3][y & 0x3][(src[num] >> 8) & 0xff])
|
||||
(_dither_g16[(((x + num) & 0x3) << 10) | ((y & 0x3) << 8) | ((src[num] >> 8 ) & 0xff)])
|
||||
#define DITHER_RGBA_565_LUT_B(num) \
|
||||
(_dither_b565_44[(x + num) & 0x3][y & 0x3][(src[num] >> 16) & 0xff])
|
||||
(_dither_b16[(((x + num) & 0x3) << 10) | ((y & 0x3) << 8) | ((src[num] >> 16 ) & 0xff)])
|
||||
|
||||
#define WRITE1_RGBA_RGB565_DITHER(src, dest) \
|
||||
*dest = (DITHER_RGBA_565_LUT_R(0)) | \
|
||||
|
@ -166,11 +139,11 @@ static DATA8 _dither_1_88[8][8][256];
|
|||
/*****************************************************************************/
|
||||
/* MACROS for dithered RGBA -> RGB555 conversion */
|
||||
#define DITHER_RGBA_555_LUT_R(num) \
|
||||
(_dither_r555_44[(x + num) & 0x3][y & 0x3][(src[num] >> 0 ) & 0xff])
|
||||
(_dither_r16[(((x + num) & 0x3) << 10) | ((y & 0x3) << 8) | ((src[num] >> 0 ) & 0xff)])
|
||||
#define DITHER_RGBA_555_LUT_G(num) \
|
||||
(_dither_g555_44[(x + num) & 0x3][y & 0x3][(src[num] >> 8) & 0xff])
|
||||
(_dither_g16[(((x + num) & 0x3) << 10) | ((y & 0x3) << 8) | ((src[num] >> 8 ) & 0xff)])
|
||||
#define DITHER_RGBA_555_LUT_B(num) \
|
||||
(_dither_b555_44[(x + num) & 0x3][y & 0x3][(src[num] >> 16) & 0xff])
|
||||
(_dither_b16[(((x + num) & 0x3) << 10) | ((y & 0x3) << 8) | ((src[num] >> 16 ) & 0xff)])
|
||||
|
||||
#define WRITE1_RGBA_RGB555_DITHER(src, dest) \
|
||||
*dest = (DITHER_RGBA_555_LUT_R(0)) | \
|
||||
|
@ -269,11 +242,11 @@ static DATA8 _dither_1_88[8][8][256];
|
|||
/*****************************************************************************/
|
||||
/* MACROS for dithered RGBA -> RGB332 conversion */
|
||||
#define DITHER_RGBA_332_LUT_R(num) \
|
||||
(_dither_r332_88[(x + num) & 0x7][y & 0x7][(src[num] >> 0 ) & 0xff])
|
||||
(_dither_r8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 0 ) & 0xff)])
|
||||
#define DITHER_RGBA_332_LUT_G(num) \
|
||||
(_dither_g332_88[(x + num) & 0x7][y & 0x7][(src[num] >> 8) & 0xff])
|
||||
(_dither_g8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 8) & 0xff)])
|
||||
#define DITHER_RGBA_332_LUT_B(num) \
|
||||
(_dither_b332_88[(x + num) & 0x7][y & 0x7][(src[num] >> 16) & 0xff])
|
||||
(_dither_b8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 16) & 0xff)])
|
||||
|
||||
#define WRITE1_RGBA_RGB332_DITHER(src, dest) \
|
||||
*dest = _dither_color_lut[(DITHER_RGBA_332_LUT_R(0)) | \
|
||||
|
@ -411,11 +384,11 @@ static DATA8 _dither_1_88[8][8][256];
|
|||
/*****************************************************************************/
|
||||
/* MACROS for dithered RGBA -> RGB232 conversion */
|
||||
#define DITHER_RGBA_232_LUT_R(num) \
|
||||
(_dither_r232_88[(x + num) & 0x7][y & 0x7][(src[num] >> 0 ) & 0xff])
|
||||
(_dither_r8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 0 ) & 0xff)])
|
||||
#define DITHER_RGBA_232_LUT_G(num) \
|
||||
(_dither_g232_88[(x + num) & 0x7][y & 0x7][(src[num] >> 8) & 0xff])
|
||||
(_dither_g8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 8) & 0xff)])
|
||||
#define DITHER_RGBA_232_LUT_B(num) \
|
||||
(_dither_b232_88[(x + num) & 0x7][y & 0x7][(src[num] >> 16) & 0xff])
|
||||
(_dither_b8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 16) & 0xff)])
|
||||
|
||||
#define WRITE1_RGBA_RGB232_DITHER(src, dest) \
|
||||
*dest = _dither_color_lut[(DITHER_RGBA_232_LUT_R(0)) | \
|
||||
|
@ -553,11 +526,11 @@ static DATA8 _dither_1_88[8][8][256];
|
|||
/*****************************************************************************/
|
||||
/* MACROS for dithered RGBA -> RGB222 conversion */
|
||||
#define DITHER_RGBA_222_LUT_R(num) \
|
||||
(_dither_r222_88[(x + num) & 0x7][y & 0x7][(src[num] >> 0 ) & 0xff])
|
||||
(_dither_r8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 0 ) & 0xff)])
|
||||
#define DITHER_RGBA_222_LUT_G(num) \
|
||||
(_dither_g222_88[(x + num) & 0x7][y & 0x7][(src[num] >> 8) & 0xff])
|
||||
(_dither_g8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 8) & 0xff)])
|
||||
#define DITHER_RGBA_222_LUT_B(num) \
|
||||
(_dither_b222_88[(x + num) & 0x7][y & 0x7][(src[num] >> 16) & 0xff])
|
||||
(_dither_b8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 16) & 0xff)])
|
||||
|
||||
#define WRITE1_RGBA_RGB222_DITHER(src, dest) \
|
||||
*dest = _dither_color_lut[(DITHER_RGBA_222_LUT_R(0)) | \
|
||||
|
@ -695,11 +668,11 @@ static DATA8 _dither_1_88[8][8][256];
|
|||
/*****************************************************************************/
|
||||
/* MACROS for dithered RGBA -> RGB221 conversion */
|
||||
#define DITHER_RGBA_221_LUT_R(num) \
|
||||
(_dither_r221_88[(x + num) & 0x7][y & 0x7][(src[num] >> 0 ) & 0xff])
|
||||
(_dither_r8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 0 ) & 0xff)])
|
||||
#define DITHER_RGBA_221_LUT_G(num) \
|
||||
(_dither_g221_88[(x + num) & 0x7][y & 0x7][(src[num] >> 8) & 0xff])
|
||||
(_dither_g8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 8) & 0xff)])
|
||||
#define DITHER_RGBA_221_LUT_B(num) \
|
||||
(_dither_b221_88[(x + num) & 0x7][y & 0x7][(src[num] >> 16) & 0xff])
|
||||
(_dither_b8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 16) & 0xff)])
|
||||
|
||||
#define WRITE1_RGBA_RGB221_DITHER(src, dest) \
|
||||
*dest = _dither_color_lut[(DITHER_RGBA_221_LUT_R(0)) | \
|
||||
|
@ -837,11 +810,11 @@ static DATA8 _dither_1_88[8][8][256];
|
|||
/*****************************************************************************/
|
||||
/* MACROS for dithered RGBA -> RGB121 conversion */
|
||||
#define DITHER_RGBA_121_LUT_R(num) \
|
||||
(_dither_r121_88[(x + num) & 0x7][y & 0x7][(src[num] >> 0 ) & 0xff])
|
||||
(_dither_r8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 0 ) & 0xff)])
|
||||
#define DITHER_RGBA_121_LUT_G(num) \
|
||||
(_dither_g121_88[(x + num) & 0x7][y & 0x7][(src[num] >> 8) & 0xff])
|
||||
(_dither_g8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 8) & 0xff)])
|
||||
#define DITHER_RGBA_121_LUT_B(num) \
|
||||
(_dither_b121_88[(x + num) & 0x7][y & 0x7][(src[num] >> 16) & 0xff])
|
||||
(_dither_b8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 16) & 0xff)])
|
||||
|
||||
#define WRITE1_RGBA_RGB121_DITHER(src, dest) \
|
||||
*dest = _dither_color_lut[(DITHER_RGBA_121_LUT_R(0)) | \
|
||||
|
@ -979,11 +952,11 @@ static DATA8 _dither_1_88[8][8][256];
|
|||
/*****************************************************************************/
|
||||
/* MACROS for dithered RGBA -> RGB111 conversion */
|
||||
#define DITHER_RGBA_111_LUT_R(num) \
|
||||
(_dither_r111_88[(x + num) & 0x7][y & 0x7][(src[num] >> 0 ) & 0xff])
|
||||
(_dither_r8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 0 ) & 0xff)])
|
||||
#define DITHER_RGBA_111_LUT_G(num) \
|
||||
(_dither_g111_88[(x + num) & 0x7][y & 0x7][(src[num] >> 8) & 0xff])
|
||||
(_dither_g8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 8) & 0xff)])
|
||||
#define DITHER_RGBA_111_LUT_B(num) \
|
||||
(_dither_b111_88[(x + num) & 0x7][y & 0x7][(src[num] >> 16) & 0xff])
|
||||
(_dither_b8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 16) & 0xff)])
|
||||
|
||||
#define WRITE1_RGBA_RGB111_DITHER(src, dest) \
|
||||
*dest = _dither_color_lut[(DITHER_RGBA_111_LUT_R(0)) | \
|
||||
|
@ -1060,9 +1033,11 @@ static DATA8 _dither_1_88[8][8][256];
|
|||
/*****************************************************************************/
|
||||
/* MACROS for dithered RGBA -> RGB1 conversion */
|
||||
#define DITHER_RGBA_1_LUT(num) \
|
||||
(_dither_1_88[(x + num) & 0x7][y & 0x7][((((*src >> 0) & 0xff) + \
|
||||
((*src >> 8) & 0xff) + \
|
||||
((*src >> 16) & 0xff)) / 3)])
|
||||
(_dither_r8[(((x + num) & 0x7) << 11) | \
|
||||
((y & 0x7) << 8) | \
|
||||
((((*src >> 0) & 0xff) + \
|
||||
((*src >> 8) & 0xff) + \
|
||||
((*src >> 16) & 0xff)) / 3)])
|
||||
|
||||
#define WRITE1_RGBA_RGB1_DITHER(src, dest) \
|
||||
*dest = _dither_color_lut[(DITHER_RGBA_1_LUT(0))]; dest++; src++
|
||||
|
@ -1083,7 +1058,7 @@ src++
|
|||
/*****************************************************************************/
|
||||
/* MACROS for dithered RGBA -> A1 conversion */
|
||||
#define DITHER_RGBA_A1_LUT(num) \
|
||||
(_dither_1_88[(x + num) & 0x7][y & 0x7][(src[num] >> 24)])
|
||||
(_dither_r8[(((x + num) & 0x7) << 11) | ((y & 0x7) << 8) | ((src[num] >> 24))])
|
||||
|
||||
#define WRITE1_RGBA_A1_DITHER(src, dest) \
|
||||
*dest |= (DITHER_RGBA_A1_LUT(0)) << (x & 0x7); \
|
||||
|
@ -1114,224 +1089,308 @@ src++;
|
|||
*dest = ((*src >> 8) & 0xff); dest++; \
|
||||
*dest = ((*src >> 0) & 0xff); dest++; src++;
|
||||
|
||||
void
|
||||
__imlib_RGBASetupContext(Context *ct)
|
||||
{
|
||||
_dither_color_lut = ct->palette;
|
||||
_pal_type = ct->palette_type;
|
||||
|
||||
if ((ct->depth == 16) || (ct->depth == 15))
|
||||
{
|
||||
_dither_r16 = (DATA16 *)ct->r_dither;
|
||||
_dither_g16 = (DATA16 *)ct->g_dither;
|
||||
_dither_b16 = (DATA16 *)ct->b_dither;
|
||||
}
|
||||
else if (ct->depth <= 8)
|
||||
{
|
||||
switch (_pal_type)
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
_dither_r8 = (DATA8 *)ct->r_dither;
|
||||
_dither_g8 = (DATA8 *)ct->g_dither;
|
||||
_dither_b8 = (DATA8 *)ct->b_dither;
|
||||
break;
|
||||
case 6:
|
||||
_dither_r8 = (DATA8 *)ct->r_dither;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Palette mode stuff */
|
||||
|
||||
void
|
||||
__imlib_RGBA_init(void)
|
||||
{
|
||||
/* the famous dither matrix */
|
||||
DATA8 _dither_44[4][4] =
|
||||
{
|
||||
{0, 4, 1, 5},
|
||||
{6, 2, 7, 3},
|
||||
{1, 5, 0, 4},
|
||||
{7, 3, 6, 2}
|
||||
};
|
||||
DATA8 _dither_88[8][8] =
|
||||
{
|
||||
{ 0, 32, 8, 40, 2, 34, 10, 42 },
|
||||
{ 48, 16, 56, 24, 50, 18, 58, 26 },
|
||||
{ 12, 44, 4, 36, 14, 46, 6, 38 },
|
||||
{ 60, 28, 52, 20, 62, 30, 54, 22 },
|
||||
{ 3, 35, 11, 43, 1, 33, 9, 41 },
|
||||
{ 51, 19, 59, 27, 49, 17, 57, 25 },
|
||||
{ 15, 47, 7, 39, 13, 45, 5, 37 },
|
||||
{ 63, 31, 55, 23, 61, 29, 53, 21 }
|
||||
};
|
||||
int i, x, y;
|
||||
|
||||
for (y = 0; y < 4; y++)
|
||||
{
|
||||
for (x = 0; x < 4; x++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if ((_dither_44[x][y] < (i & 0x7)) && (i < (256 - 8)))
|
||||
_dither_r565_44[x][y][i] = ((i + 8) & 0xf8) << 8;
|
||||
else
|
||||
_dither_r565_44[x][y][i] = (i & 0xf8) << 8;
|
||||
|
||||
if ((_dither_44[x][y] < ((i & 0x3) << 1)) && (i < (256 - 4)))
|
||||
_dither_g565_44[x][y][i] = (((i + 4) & 0xfc) << 8) >> 5;
|
||||
else
|
||||
_dither_g565_44[x][y][i] = ((i & 0xfc) << 8) >> 5;
|
||||
|
||||
if ((_dither_44[x][y] < (i & 0x7)) && (i < (256 - 8)))
|
||||
_dither_b565_44[x][y][i] = (((i + 8) & 0xf8) << 16) >> 19;
|
||||
else
|
||||
_dither_b565_44[x][y][i] = ((i & 0xf8) << 16) >> 19;
|
||||
|
||||
if ((_dither_44[x][y] < (i & 0x7)) && (i < (256 - 8)))
|
||||
_dither_r555_44[x][y][i] = (((i + 8) & 0xf8) << 8) >> 1;
|
||||
else
|
||||
_dither_r555_44[x][y][i] = ((i & 0xf8) << 8) >> 1;
|
||||
|
||||
if ((_dither_44[x][y] < (i & 0x7)) && (i < (256 - 8)))
|
||||
_dither_g555_44[x][y][i] = (((i + 8) & 0xf8) << 8) >> 6;
|
||||
else
|
||||
_dither_g555_44[x][y][i] = ((i & 0xf8) << 8) >> 6;
|
||||
|
||||
if ((_dither_44[x][y] < (i & 0x7)) && (i < (256 - 8)))
|
||||
_dither_b555_44[x][y][i] = (((i + 8) & 0xf8) << 16) >> 19;
|
||||
else
|
||||
_dither_b555_44[x][y][i] = ((i & 0xf8) << 16) >> 19;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (y = 0; y < 8; y++)
|
||||
{
|
||||
for (x = 0; x < 8; x++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if ((_dither_88[x][y] < ((i & 0x1f) << 1)) && (i < (256 - 32)))
|
||||
_dither_r332_88[x][y][i] = ((i + 32) & 0xe0);
|
||||
else
|
||||
_dither_r332_88[x][y][i] = (i & 0xe0);
|
||||
|
||||
if ((_dither_88[x][y] < ((i & 0x1f) << 1)) && (i < (256 - 32)))
|
||||
_dither_g332_88[x][y][i] = (((i + 32) >> 3)& 0x1c);
|
||||
else
|
||||
_dither_g332_88[x][y][i] = ((i >> 3) & 0x1c);
|
||||
|
||||
if ((_dither_88[x][y] < (i & 0x3f)) && (i < (256 - 64)))
|
||||
_dither_b332_88[x][y][i] = (((i + 64) >> 6)& 0x03);
|
||||
else
|
||||
_dither_b332_88[x][y][i] = ((i >> 6) & 0x03);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (y = 0; y < 8; y++)
|
||||
{
|
||||
for (x = 0; x < 8; x++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if ((_dither_88[x][y] < (i & 0x3f)) && (i < (256 - 64)))
|
||||
_dither_r232_88[x][y][i] = (((i + 64) >> 1) & 0x60);
|
||||
else
|
||||
_dither_r232_88[x][y][i] = ((i >> 1) & 0x60);
|
||||
|
||||
if ((_dither_88[x][y] < ((i & 0x1f) << 1)) && (i < (256 - 32)))
|
||||
_dither_g232_88[x][y][i] = (((i + 32) >> 3)& 0x1c);
|
||||
else
|
||||
_dither_g232_88[x][y][i] = ((i >> 3) & 0x1c);
|
||||
|
||||
if ((_dither_88[x][y] < (i & 0x3f)) && (i < (256 - 64)))
|
||||
_dither_b232_88[x][y][i] = (((i + 64) >> 6)& 0x03);
|
||||
else
|
||||
_dither_b232_88[x][y][i] = ((i >> 6) & 0x03);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (y = 0; y < 8; y++)
|
||||
{
|
||||
for (x = 0; x < 8; x++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if ((_dither_88[x][y] < (i & 0x3f)) && (i < (256 - 64)))
|
||||
_dither_r222_88[x][y][i] = (((i + 64) >> 2) & 0x30);
|
||||
else
|
||||
_dither_r222_88[x][y][i] = ((i >> 2) & 0x30);
|
||||
|
||||
if ((_dither_88[x][y] < (i & 0x3f)) && (i < (256 - 64)))
|
||||
_dither_g222_88[x][y][i] = (((i + 64) >> 4)& 0x0c);
|
||||
else
|
||||
_dither_g222_88[x][y][i] = ((i >> 4) & 0x0c);
|
||||
|
||||
if ((_dither_88[x][y] < (i & 0x3f)) && (i < (256 - 64)))
|
||||
_dither_b222_88[x][y][i] = (((i + 64) >> 6)& 0x03);
|
||||
else
|
||||
_dither_b222_88[x][y][i] = ((i >> 6) & 0x03);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (y = 0; y < 8; y++)
|
||||
{
|
||||
for (x = 0; x < 8; x++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if ((_dither_88[x][y] < (i & 0x3f)) && (i < (256 - 64)))
|
||||
_dither_r221_88[x][y][i] = (((i + 64) >> 3) & 0x18);
|
||||
else
|
||||
_dither_r221_88[x][y][i] = ((i >> 3) & 0x18);
|
||||
|
||||
if ((_dither_88[x][y] < (i & 0x3f)) && (i < (256 - 64)))
|
||||
_dither_g221_88[x][y][i] = (((i + 64) >> 5) & 0x06);
|
||||
else
|
||||
_dither_g221_88[x][y][i] = ((i >> 5) & 0x06);
|
||||
|
||||
if ((_dither_88[x][y] < ((i & 0x7f) >> 1)) && (i < (256 - 128)))
|
||||
_dither_b221_88[x][y][i] = (((i + 128) >> 7) & 0x01);
|
||||
else
|
||||
_dither_b221_88[x][y][i] = ((i >> 7) & 0x01);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (y = 0; y < 8; y++)
|
||||
{
|
||||
for (x = 0; x < 8; x++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if ((_dither_88[x][y] < ((i & 0x7f) >> 1)) && (i < (256 - 128)))
|
||||
_dither_r121_88[x][y][i] = (((i + 128) >> 4) & 0x08);
|
||||
else
|
||||
_dither_r121_88[x][y][i] = ((i >> 4) & 0x08);
|
||||
|
||||
if ((_dither_88[x][y] < (i & 0x3f)) && (i < (256 - 64)))
|
||||
_dither_g121_88[x][y][i] = (((i + 64) >> 5) & 0x06);
|
||||
else
|
||||
_dither_g121_88[x][y][i] = ((i >> 5) & 0x06);
|
||||
|
||||
if ((_dither_88[x][y] < ((i & 0x7f) >> 1)) && (i < (256 - 128)))
|
||||
_dither_b121_88[x][y][i] = (((i + 128) >> 7) & 0x01);
|
||||
else
|
||||
_dither_b121_88[x][y][i] = ((i >> 7) & 0x01);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (y = 0; y < 8; y++)
|
||||
{
|
||||
for (x = 0; x < 8; x++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if ((_dither_88[x][y] < ((i & 0x7f) >> 1)) && (i < (256 - 128)))
|
||||
_dither_r111_88[x][y][i] = (((i + 128) >> 5) & 0x04);
|
||||
else
|
||||
_dither_r111_88[x][y][i] = ((i >> 5) & 0x04);
|
||||
|
||||
if ((_dither_88[x][y] < ((i & 0x7f) >> 1)) && (i < (256 - 128)))
|
||||
_dither_g111_88[x][y][i] = (((i + 128) >> 6) & 0x02);
|
||||
else
|
||||
_dither_g111_88[x][y][i] = ((i >> 6) & 0x02);
|
||||
|
||||
if ((_dither_88[x][y] < ((i & 0x7f) >> 1)) && (i < (256 - 128)))
|
||||
_dither_b111_88[x][y][i] = (((i + 128) >> 7) & 0x01);
|
||||
else
|
||||
_dither_b111_88[x][y][i] = ((i >> 7) & 0x01);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (y = 0; y < 8; y++)
|
||||
{
|
||||
for (x = 0; x < 8; x++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if ((_dither_88[x][y] < ((i & 0x7f) >> 1)) && (i < (256 - 128)))
|
||||
_dither_1_88[x][y][i] = (((i + 128) >> 7) & 0x01);
|
||||
else
|
||||
_dither_1_88[x][y][i] = ((i >> 7) & 0x01);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
__imlib_RGBA_init(void *rd, void *gd, void *bd, int depth, DATA8 palette_type)
|
||||
{
|
||||
DATA16 *rd16, *gd16, *bd16;
|
||||
DATA8 *rd8, *gd8, *bd8;
|
||||
/* the famous dither matrix */
|
||||
const DATA8 _dither_44[4][4] =
|
||||
{
|
||||
{0, 4, 1, 5},
|
||||
{6, 2, 7, 3},
|
||||
{1, 5, 0, 4},
|
||||
{7, 3, 6, 2}
|
||||
};
|
||||
const DATA8 _dither_88[8][8] =
|
||||
{
|
||||
{ 0, 32, 8, 40, 2, 34, 10, 42 },
|
||||
{ 48, 16, 56, 24, 50, 18, 58, 26 },
|
||||
{ 12, 44, 4, 36, 14, 46, 6, 38 },
|
||||
{ 60, 28, 52, 20, 62, 30, 54, 22 },
|
||||
{ 3, 35, 11, 43, 1, 33, 9, 41 },
|
||||
{ 51, 19, 59, 27, 49, 17, 57, 25 },
|
||||
{ 15, 47, 7, 39, 13, 45, 5, 37 },
|
||||
{ 63, 31, 55, 23, 61, 29, 53, 21 }
|
||||
};
|
||||
int i, x, y;
|
||||
|
||||
switch (depth)
|
||||
{
|
||||
case 16:
|
||||
rd16 = (DATA16 *)rd;
|
||||
gd16 = (DATA16 *)gd;
|
||||
bd16 = (DATA16 *)bd;
|
||||
for (y = 0; y < 4; y++)
|
||||
{
|
||||
for (x = 0; x < 4; x++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if ((_dither_44[x][y] < (i & 0x7)) && (i < (256 - 8)))
|
||||
rd16[(x << 10) | (y << 8) | i] = ((i + 8) & 0xf8) << 8;
|
||||
else
|
||||
rd16[(x << 10) | (y << 8) | i] = (i & 0xf8) << 8;
|
||||
|
||||
if ((_dither_44[x][y] < ((i & 0x3) << 1)) && (i < (256 - 4)))
|
||||
gd16[(x << 10) | (y << 8) | i] = (((i + 4) & 0xfc) << 8) >> 5;
|
||||
else
|
||||
gd16[(x << 10) | (y << 8) | i] = ((i & 0xfc) << 8) >> 5;
|
||||
|
||||
if ((_dither_44[x][y] < (i & 0x7)) && (i < (256 - 8)))
|
||||
bd16[(x << 10) | (y << 8) | i] = (((i + 8) & 0xf8) << 16) >> 19;
|
||||
else
|
||||
bd16[(x << 10) | (y << 8) | i] = ((i & 0xf8) << 16) >> 19;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 15:
|
||||
rd16 = (DATA16 *)rd;
|
||||
gd16 = (DATA16 *)gd;
|
||||
bd16 = (DATA16 *)bd;
|
||||
for (y = 0; y < 4; y++)
|
||||
{
|
||||
for (x = 0; x < 4; x++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if ((_dither_44[x][y] < (i & 0x7)) && (i < (256 - 8)))
|
||||
rd16[(x << 10) | (y << 8) | i] = (((i + 8) & 0xf8) << 8) >> 1;
|
||||
else
|
||||
rd16[(x << 10) | (y << 8) | i] = ((i & 0xf8) << 8) >> 1;
|
||||
|
||||
if ((_dither_44[x][y] < (i & 0x7)) && (i < (256 - 8)))
|
||||
gd16[(x << 10) | (y << 8) | i] = (((i + 8) & 0xf8) << 8) >> 6;
|
||||
else
|
||||
gd16[(x << 10) | (y << 8) | i] = ((i & 0xf8) << 8) >> 6;
|
||||
|
||||
if ((_dither_44[x][y] < (i & 0x7)) && (i < (256 - 8)))
|
||||
bd16[(x << 10) | (y << 8) | i] = (((i + 8) & 0xf8) << 16) >> 19;
|
||||
else
|
||||
bd16[(x << 10) | (y << 8) | i] = ((i & 0xf8) << 16) >> 19;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 8:
|
||||
rd8 = (DATA8 *)rd;
|
||||
gd8 = (DATA8 *)gd;
|
||||
bd8 = (DATA8 *)bd;
|
||||
switch (palette_type)
|
||||
{
|
||||
case 0:
|
||||
for (y = 0; y < 8; y++)
|
||||
{
|
||||
for (x = 0; x < 8; x++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if ((_dither_88[x][y] < ((i & 0x1f) << 1)) && (i < (256 - 32)))
|
||||
rd8[(x << 11) | (y << 8) | i] = ((i + 32) & 0xe0);
|
||||
else
|
||||
rd8[(x << 11) | (y << 8) | i] = (i & 0xe0);
|
||||
|
||||
if ((_dither_88[x][y] < ((i & 0x1f) << 1)) && (i < (256 - 32)))
|
||||
gd8[(x << 11) | (y << 8) | i] = (((i + 32) >> 3)& 0x1c);
|
||||
else
|
||||
gd8[(x << 11) | (y << 8) | i] = ((i >> 3) & 0x1c);
|
||||
|
||||
if ((_dither_88[x][y] < (i & 0x3f)) && (i < (256 - 64)))
|
||||
bd8[(x << 11) | (y << 8) | i] = (((i + 64) >> 6)& 0x03);
|
||||
else
|
||||
bd8[(x << 11) | (y << 8) | i] = ((i >> 6) & 0x03);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
for (y = 0; y < 8; y++)
|
||||
{
|
||||
for (x = 0; x < 8; x++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if ((_dither_88[x][y] < (i & 0x3f)) && (i < (256 - 64)))
|
||||
rd8[(x << 11) | (y << 8) | i] = (((i + 64) >> 1) & 0x60);
|
||||
else
|
||||
rd8[(x << 11) | (y << 8) | i] = ((i >> 1) & 0x60);
|
||||
|
||||
if ((_dither_88[x][y] < ((i & 0x1f) << 1)) && (i < (256 - 32)))
|
||||
gd8[(x << 11) | (y << 8) | i] = (((i + 32) >> 3)& 0x1c);
|
||||
else
|
||||
gd8[(x << 11) | (y << 8) | i] = ((i >> 3) & 0x1c);
|
||||
|
||||
if ((_dither_88[x][y] < (i & 0x3f)) && (i < (256 - 64)))
|
||||
bd8[(x << 11) | (y << 8) | i] = (((i + 64) >> 6)& 0x03);
|
||||
else
|
||||
bd8[(x << 11) | (y << 8) | i] = ((i >> 6) & 0x03);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
for (y = 0; y < 8; y++)
|
||||
{
|
||||
for (x = 0; x < 8; x++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if ((_dither_88[x][y] < (i & 0x3f)) && (i < (256 - 64)))
|
||||
rd8[(x << 11) | (y << 8) | i] = (((i + 64) >> 2) & 0x30);
|
||||
else
|
||||
rd8[(x << 11) | (y << 8) | i] = ((i >> 2) & 0x30);
|
||||
|
||||
if ((_dither_88[x][y] < (i & 0x3f)) && (i < (256 - 64)))
|
||||
gd8[(x << 11) | (y << 8) | i] = (((i + 64) >> 4)& 0x0c);
|
||||
else
|
||||
gd8[(x << 11) | (y << 8) | i] = ((i >> 4) & 0x0c);
|
||||
|
||||
if ((_dither_88[x][y] < (i & 0x3f)) && (i < (256 - 64)))
|
||||
bd8[(x << 11) | (y << 8) | i] = (((i + 64) >> 6)& 0x03);
|
||||
else
|
||||
bd8[(x << 11) | (y << 8) | i] = ((i >> 6) & 0x03);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
for (y = 0; y < 8; y++)
|
||||
{
|
||||
for (x = 0; x < 8; x++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if ((_dither_88[x][y] < (i & 0x3f)) && (i < (256 - 64)))
|
||||
rd8[(x << 11) | (y << 8) | i] = (((i + 64) >> 3) & 0x18);
|
||||
else
|
||||
rd8[(x << 11) | (y << 8) | i] = ((i >> 3) & 0x18);
|
||||
|
||||
if ((_dither_88[x][y] < (i & 0x3f)) && (i < (256 - 64)))
|
||||
gd8[(x << 11) | (y << 8) | i] = (((i + 64) >> 5) & 0x06);
|
||||
else
|
||||
gd8[(x << 11) | (y << 8) | i] = ((i >> 5) & 0x06);
|
||||
|
||||
if ((_dither_88[x][y] < ((i & 0x7f) >> 1)) && (i < (256 - 128)))
|
||||
bd8[(x << 11) | (y << 8) | i] = (((i + 128) >> 7) & 0x01);
|
||||
else
|
||||
bd8[(x << 11) | (y << 8) | i] = ((i >> 7) & 0x01);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
for (y = 0; y < 8; y++)
|
||||
{
|
||||
for (x = 0; x < 8; x++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if ((_dither_88[x][y] < ((i & 0x7f) >> 1)) && (i < (256 - 128)))
|
||||
rd8[(x << 11) | (y << 8) | i] = (((i + 128) >> 4) & 0x08);
|
||||
else
|
||||
rd8[(x << 11) | (y << 8) | i] = ((i >> 4) & 0x08);
|
||||
|
||||
if ((_dither_88[x][y] < (i & 0x3f)) && (i < (256 - 64)))
|
||||
gd8[(x << 11) | (y << 8) | i] = (((i + 64) >> 5) & 0x06);
|
||||
else
|
||||
gd8[(x << 11) | (y << 8) | i] = ((i >> 5) & 0x06);
|
||||
|
||||
if ((_dither_88[x][y] < ((i & 0x7f) >> 1)) && (i < (256 - 128)))
|
||||
bd8[(x << 11) | (y << 8) | i] = (((i + 128) >> 7) & 0x01);
|
||||
else
|
||||
bd8[(x << 11) | (y << 8) | i] = ((i >> 7) & 0x01);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
for (y = 0; y < 8; y++)
|
||||
{
|
||||
for (x = 0; x < 8; x++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if ((_dither_88[x][y] < ((i & 0x7f) >> 1)) && (i < (256 - 128)))
|
||||
rd8[(x << 11) | (y << 8) | i] = (((i + 128) >> 5) & 0x04);
|
||||
else
|
||||
rd8[(x << 11) | (y << 8) | i] = ((i >> 5) & 0x04);
|
||||
|
||||
if ((_dither_88[x][y] < ((i & 0x7f) >> 1)) && (i < (256 - 128)))
|
||||
gd8[(x << 11) | (y << 8) | i] = (((i + 128) >> 6) & 0x02);
|
||||
else
|
||||
gd8[(x << 11) | (y << 8) | i] = ((i >> 6) & 0x02);
|
||||
|
||||
if ((_dither_88[x][y] < ((i & 0x7f) >> 1)) && (i < (256 - 128)))
|
||||
bd8[(x << 11) | (y << 8) | i] = (((i + 128) >> 7) & 0x01);
|
||||
else
|
||||
bd8[(x << 11) | (y << 8) | i] = ((i >> 7) & 0x01);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
for (y = 0; y < 8; y++)
|
||||
{
|
||||
for (x = 0; x < 8; x++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if ((_dither_88[x][y] < ((i & 0x7f) >> 1)) && (i < (256 - 128)))
|
||||
rd8[(x << 11) | (y << 8) | i] = (((i + 128) >> 7) & 0x01);
|
||||
else
|
||||
rd8[(x << 11) | (y << 8) | i] = ((i >> 7) & 0x01);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
__imlib_RGBA_to_RGB565_fast(DATA32 *src , int src_jump,
|
||||
DATA16 *dest, int dest_jump,
|
||||
int width, int height, int dx, int dy)
|
||||
|
|
4
rgba.h
4
rgba.h
|
@ -1,7 +1,9 @@
|
|||
#ifndef __RGBA
|
||||
#define __RGBA 1
|
||||
|
||||
void __imlib_RGBA_init(void);
|
||||
void __imlib_RGBASetupContext(Context *ct);
|
||||
void __imlib_RGBA_init(void *rd, void *gd, void *bd, int depth,
|
||||
DATA8 palette_type);
|
||||
void __imlib_RGBA_to_RGB565_fast(DATA32 *src , int src_jump,
|
||||
DATA16 *dest, int dest_jump,
|
||||
int width, int height, int dx, int dy);
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#include "common.h"
|
||||
#include "scale.h"
|
||||
#include "image.h"
|
||||
#include "context.h"
|
||||
#include "rgba.h"
|
||||
#include "blend.h"
|
||||
|
||||
|
|
Loading…
Reference in New Issue