SVN revision: 74
This commit is contained in:
Carsten Haitzler 1999-08-23 16:55:16 +00:00
parent 8a957fb01b
commit 8898389aba
24 changed files with 2982 additions and 2408 deletions

View File

@ -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)

View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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

196
context.c Normal file
View File

@ -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;
}

32
context.h Normal file
View File

@ -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

View File

@ -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 *

View File

@ -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);

View File

@ -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

View File

@ -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:

View File

@ -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

340
libltdl/aclocal.m4 vendored
View File

@ -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.

View File

@ -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

2102
libltdl/configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -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
)])

View File

@ -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;
}

View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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);

View File

@ -2,6 +2,7 @@
#include "common.h"
#include "scale.h"
#include "image.h"
#include "context.h"
#include "rgba.h"
#include "blend.h"