ooh now imlib2 has a sexy demo for you people :) mmmmm watch the alpha

blending... mmmmmmmmm


SVN revision: 249
This commit is contained in:
Carsten Haitzler 1999-09-13 01:56:57 +00:00
parent e26b528b9b
commit c3b68c5550
26 changed files with 2352 additions and 1948 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
@ -125,7 +125,7 @@ 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 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
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 -pg -pg
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)

30
README
View File

@ -1,5 +1,25 @@
Imlib 2.0 pre pre pre pre alpha toy code...
the wuick way:
./configure
mkdir ~/.loaders
mkdir ~/.loaders/image
make install
(ignore the make failed error - thats fine)
./imlib2
you'll get a window up with a big bg and little igns in an array - they
follow your mouse around..
notice....
alpha-blended shadow on top & leftof window
notice soft shadows under icons
notice the speed :)
notice that imlib si actually re-loadng ALL of these images continuously
from disk (just alook at the code) (well ok not the bg one) - the image
caching works and is taken full advantage of .. its also delayed loading -
it'll only decode the data to images you need :)
WARNING!
this isn't even a library yet - it's a single program thats modularised to
@ -28,9 +48,12 @@ simple to get this going:
mkdir ~/.loaders
mkdir ~/.loaders/image
cp png.so ~/.loaders/image
cp jepg.so ~/.loaders/image
you just installed the png loader - it's theonly one i've written and it
isnt very good (comments in code - load.c) but it works.
you also installed the jpage loader :)
the laoder system automagically updates yhe loaders were you to dump new
files there or overwrite the old ones to any program RUNTIME will pick up
the new code.. :) you dont even have to restart the program.. OOH what joy :)
@ -45,13 +68,8 @@ properly).
* border scaling - you know - like E does now for buttons etc.
* saving functions
* image manipulation funcitons (flip, rotate, scale etc of original data)
* nice api for the actual library with context-like system (the api you see
here is actually going to be the internal api for imlib - a level down from
what api the user actually gets to see & use - all access to image data will
be goverend by going thru the api too rather than just snarfing structure
memebrs)
* a new name for imlib2.0 - 2.0 just sounds boring :)
* more loader / saver modules for jpeg, ppm, pgm, pgm, xpm, tiff etc...
* more loader / saver modules for ppm, pgm, pgm, xpm, tiff etc...
* RGBA drawing area - basically a RGBA buffer with RGBA buffer ops written
(copyarea, poasteimage, fillrect, drawline, drawtext etc. so you can have a
little virtual RGBA framebuffer - also will include rectangle os ineterst

260
api.c
View File

@ -363,17 +363,10 @@ void imlib_render_image_part_on_drawable_at_size(Imlib_Image image, Display *dis
cm);
}
#define LINESIZE 16
/* useful macro */
#define CLIP(x, y, w, h, xx, yy, ww, hh) \
if (x < xx) {w += x; x = xx;} \
if (y < yy) {h += y; y = xx;} \
if ((x + w) > ww) {w = ww - x;} \
if ((y + h) > hh) {h = hh - y;}
void
imlib_blend_image_onto_image(Imlib_Image source_image,
Imlib_Image destination_image,
char antialias, char blend, char merge_alpha,
int source_x, int source_y,
int source_width, int source_height,
int destination_x, int destination_y,
@ -384,213 +377,12 @@ imlib_blend_image_onto_image(Imlib_Image source_image,
CAST_IMAGE(im_src, source_image);
CAST_IMAGE(im_dst, destination_image);
/* FIXME: doesnt do clipping in any way or form - must fix */
if ((!(im_src->data)) && (im_src->loader))
im_src->loader->load(im_src, NULL, 0, 1);
if ((!(im_dst->data)) && (im_dst->loader))
im_dst->loader->load(im_src, NULL, 0, 1);
if ((source_width == destination_width) &&
(source_height == destination_height))
{
if (IMAGE_HAS_ALPHA(im_dst))
__imlib_BlendRGBAToData(im_src->data, im_src->w, im_src->h,
im_dst->data, im_dst->w, im_dst->h,
source_x, source_y,
destination_x, destination_y,
source_width, source_height, 1);
else
__imlib_BlendRGBAToData(im_src->data, im_src->w, im_src->h,
im_dst->data, im_dst->w, im_dst->h,
source_x, source_y,
destination_x, destination_y,
source_width, source_height, 0);
}
else
{
DATA32 **ypoints = NULL;
int *xpoints = NULL;
int *yapoints = NULL;
int *xapoints = NULL;
DATA32 *buf = NULL;
int sx, sy, sw, sh, dx, dy, dw, dh, dxx, dyy, scw, sch, y2, x2;
int psx, psy, psw, psh;
char xup = 0, yup = 0;
int y, h, hh;
sx = source_x;
sy = source_y;
sw = source_width;
sh = source_height;
dx = destination_x;
dy = destination_y;
dw = destination_width;
dh = destination_height;
/* dont do anything if we have a 0 widht or height image to render */
/* if the input rect size < 0 dont render either */
if ((dw <= 0) || (dh <= 0) || (sw <= 0) || (sh <= 0))
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_src->w, im_src->h);
/* clip output coords to clipped input coords */
if (psx != sx)
dx += ((sx - psx) * destination_width) / source_width;
if (psy != sy)
dy += ((sy - psy) * destination_height) / source_height;
if (psw != sw)
dw = (dw * sw) / psw;
if (psh != sh)
dh = (dh * sh) / psh;
if ((dw <= 0) || (dh <= 0) || (sw <= 0) || (sh <= 0))
return;
psx = dx;
psy = dy;
psw = dw;
psh = dh;
x2 = sx;
y2 = sy;
CLIP(dx, dy, dw, dh, 0, 0, im_dst->w, im_dst->h);
if ((dw <= 0) || (dh <= 0) || (sw <= 0) || (sh <= 0))
return;
if (psx != dx)
sx += ((dx - psx) * source_width) / destination_width;
if (psy != dy)
sy += ((dy - psy) * source_height) / destination_height;
if (psw != dw)
sw = (sw * dw) / psw;
if (psh != dh)
sh = (sh * dh) / psh;
dxx = dx - psx;
dyy = dy - psy;
dxx += (x2 * destination_width) / source_width;
dyy += (y2 * destination_height) / source_height;
/* 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 the input rect size < 0 dont render either */
if ((dw <= 0) || (dh <= 0) || (sw <= 0) || (sh <= 0))
return;
/* calculate the scaling factors of width and height for a whole image */
scw = (destination_width * im_src->w) / source_width;
sch = (destination_height * im_src->h) / source_height;
/* 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_src->data, im_src->w, im_src->h,
sch, im_src->border.top,
im_src->border.bottom);
if (!ypoints)
return;
xpoints = __imlib_CalcXPoints(im_src->w, scw,
im_src->border.left,
im_src->border.right);
if (!xpoints)
{
free(ypoints);
return;
}
/* calculate aliasing counts */
if (anitalias)
{
yapoints = __imlib_CalcApoints(im_src->h, sch,
im_src->border.top,
im_src->border.bottom);
if (!yapoints)
{
free(ypoints);
free(xpoints);
return;
}
xapoints = __imlib_CalcApoints(im_src->w, scw,
im_src->border.left,
im_src->border.right);
if (!xapoints)
{
free(yapoints);
free(ypoints);
free(xpoints);
return;
}
}
}
/* if we are scaling the image at all make a scaling buffer */
/* allocate a buffer to render scaled RGBA data into */
buf = malloc(dw * LINESIZE * sizeof(DATA32));
if (!buf)
{
if (anitalias)
{
free(xapoints);
free(yapoints);
}
free(ypoints);
free(xpoints);
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;
/* scale the imagedata for this LINESIZE lines chunk of image data */
if (anitalias)
{
if (IMAGE_HAS_ALPHA(im_src))
__imlib_ScaleAARGBA(ypoints, xpoints, buf, xapoints,
yapoints, xup, yup, dxx, dyy + y,
0, 0, dw, hh, dw, im_src->w);
else
__imlib_ScaleAARGB(ypoints, xpoints, buf, xapoints,
yapoints, xup, yup, dxx, dyy + y,
0, 0, dw, hh, dw, im_src->w);
}
else
__imlib_ScaleSampleRGBA(ypoints, xpoints, buf, dxx, dyy + y,
0, 0, dw, hh, dw);
if (IMAGE_HAS_ALPHA(im_src))
{
if (IMAGE_HAS_ALPHA(im_dst))
__imlib_BlendRGBAToData(buf, dw, hh,
im_dst->data, im_dst->w, im_dst->h,
0, 0, dx, dy + y, dw, dh, 1);
else
__imlib_BlendRGBAToData(buf, dw, hh,
im_dst->data, im_dst->w, im_dst->h,
0, 0, dx, dy + y, dw, dh, 0);
}
else
__imlib_BlendRGBAToData(buf, dw, hh,
im_dst->data, im_dst->w, im_dst->h,
0, 0, dx, dy + y, dw, dh, 2);
/* 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);
}
}
__imlib_DirtyImage(im_dst);
__imlib_DirtyPixmapsForImage(im_dst);
__imlib_BlendImageToImage(im_src, im_dst, antialias, blend, merge_alpha,
source_x, source_y, source_width, source_height,
destination_x, destination_y,
destination_width, destination_height);
}
Imlib_Image
@ -710,6 +502,8 @@ imlib_copy_drawable_to_image(Imlib_Image image, Display *display,
if ((width <= 0) || (height <= 0))
return 0;
__imlib_DirtyImage(im);
__imlib_DirtyPixmapsForImage(im);
return __imlib_GrabDrawableToRGBA(im->data, destination_x, destination_y,
im->w, im->h, display, drawable,
mask, visual, colormap, depth,
@ -731,3 +525,39 @@ imlib_clone_image(Imlib_Image image)
return (Imlib_Image)im;
}
Imlib_Image
imlib_create_cropped_image(Imlib_Image image, int x, int y, int width,
int height)
{
ImlibImage *im, *im_old;
CAST_IMAGE(im_old, image);
if ((!(im_old->data)) && (im_old->loader))
im_old->loader->load(im_old, NULL, 0, 1);
im = __imlib_CreateImage(width, height, NULL);
im->data = malloc(width * height *sizeof(DATA32));
__imlib_BlendImageToImage(im_old, im, 0, 0, 0,
x, y, width, height,
0, 0, width, height);
return (Imlib_Image)im;
}
Imlib_Image
imlib_create_cropped_scaled_image(Imlib_Image image, char antialias,
int source_x, int source_y, int source_width,
int source_height, int destination_width,
int destination_height)
{
ImlibImage *im, *im_old;
CAST_IMAGE(im_old, image);
if ((!(im_old->data)) && (im_old->loader))
im_old->loader->load(im_old, NULL, 0, 1);
im = __imlib_CreateImage(destination_width, destination_height, NULL);
im->data = malloc(destination_width * destination_height *sizeof(DATA32));
__imlib_BlendImageToImage(im_old, im, antialias, 0, 0,
source_x, source_y, source_width, source_height,
0, 0, destination_width, destination_height);
return (Imlib_Image)im;
}

23
api.h
View File

@ -105,6 +105,7 @@ void imlib_render_image_part_on_drawable_at_size(Imlib_Image image, Display *dis
/* rgba space ops */
void imlib_blend_image_onto_image(Imlib_Image source_image,
Imlib_Image destination_image,
char antialias, char blend, char merge_alpha,
int source_x, int source_y,
int source_width, int source_height,
int destination_x, int destination_y,
@ -151,27 +152,27 @@ char imlib_copy_drawable_to_image(Imlib_Image image, Display *display,
int width, int height,
int destination_x, int destination_y,
char need_to_grab_x);
#if 0
Imlib_image imlib_create_cropped_image(Imlib_Image image,
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,
Imlib_Image imlib_create_cropped_scaled_image(Imlib_Image image,
char antialias,
int source_x, int source_y,
int source_width,
int source_height,
int destination_width,
int destination_height);
Imlib_image imlib_create_image_from_xpm_data(unsigned char *data);
#if 0
/* I'm not even sure i want to deal with xpm's as inlined data at all */
/* i much prefer theidea of GIMP's "save as C source" saver - i get 24bit */
/* plus alpha channel saving and its trivial to use - except they stor it in */
/* RGBA rather than ARGB - hmm - migh have to hack the sevr in GIMP to do */
/* this right */
/* Imlib_image imlib_create_image_from_xpm_data(unsigned char *data);*/
/* color stuff */
int imlib_match_color(int red, int green, int blue);
/* 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 */
Imlib_Color_Modifier imlib_create_color_modifier(void);
void imlib_free_color_modifier(Imlib_Color_Modifier color_modifier);

301
blend.c
View File

@ -1,5 +1,8 @@
#include "common.h"
#include <X11/Xlib.h>
#include "image.h"
#include "blend.h"
#include "scale.h"
void
__imlib_BlendRGBAToData(DATA32 *src, int src_w, int src_h, DATA32 *dst,
@ -42,13 +45,16 @@ __imlib_BlendRGBAToData(DATA32 *src, int src_w, int src_h, DATA32 *dst,
h = dst_h - dy;
if ((w <= 0) || (h <= 0))
return;
if (dalpha == 1)
__imlib_BlendRGBAToRGBA(src + (sy * src_w) + sx, src_w - w,
dst + (dy * dst_w) + dx, dst_w - w, w, h);
else if (dalpha == 0)
if (dalpha == 0)
__imlib_BlendRGBAToRGB(src + (sy * src_w) + sx, src_w - w,
dst + (dy * dst_w) + dx, dst_w - w, w, h);
else if (dalpha == 1)
__imlib_BlendRGBAToRGBA(src + (sy * src_w) + sx, src_w - w,
dst + (dy * dst_w) + dx, dst_w - w, w, h);
else if (dalpha == 2)
__imlib_CopyRGBAToRGB(src + (sy * src_w) + sx, src_w - w,
dst + (dy * dst_w) + dx, dst_w - w, w, h);
else if (dalpha == 3)
__imlib_CopyRGBAToRGBA(src + (sy * src_w) + sx, src_w - w,
dst + (dy * dst_w) + dx, dst_w - w, w, h);
}
@ -155,6 +161,26 @@ __imlib_BlendRGBAToRGBA(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump,
}
}
void
__imlib_CopyRGBAToRGB(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump,
int w, int h)
{
int x, y;
DATA32 *p1, *p2;
for (y = 0; y < h; y++)
{
p1 = src + (y * (w + src_jump));
p2 = dst + (y * (w + dst_jump));
for (x = 0; x < w; x++)
{
*p2 = (*p2 & 0xff000000) | (*p1 & 0x00ffffff);
p2++;
p1++;
}
}
}
void
__imlib_CopyRGBAToRGBA(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump,
int w, int h)
@ -164,12 +190,273 @@ __imlib_CopyRGBAToRGBA(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump,
for (y = 0; y < h; y++)
{
DATA8 a, nr, ng, nb, r, g, b, rr, gg, bb, aa, na;
int tmp;
p1 = src + (y * (w + src_jump));
p2 = dst + (y * (w + dst_jump));
for (x = 0; x < w; x++)
*p2++ = *p1++;
}
}
#define LINESIZE 16
#define CLIP(x, y, w, h, xx, yy, ww, hh) \
if (x < xx) {w += x; x = xx;} \
if (y < yy) {h += y; y = xx;} \
if ((x + w) > ww) {w = ww - x;} \
if ((y + h) > hh) {h = hh - y;}
void
__imlib_BlendImageToImage(ImlibImage *im_src, ImlibImage *im_dst,
char aa, char blend, char merge_alpha,
int ssx, int ssy, int ssw, int ssh,
int ddx, int ddy, int ddw, int ddh)
{
if ((!(im_src->data)) && (im_src->loader))
im_src->loader->load(im_src, NULL, 0, 1);
if ((!(im_dst->data)) && (im_dst->loader))
im_dst->loader->load(im_src, NULL, 0, 1);
if ((ssw == ddw) &&
(ssh == ddh))
{
if (!IMAGE_HAS_ALPHA(im_src))
blend = 0;
if (!IMAGE_HAS_ALPHA(im_dst))
merge_alpha = 0;
/* 0 - blend RGB - leave dst A as-is */
/* 1 - blend RGB - add src A to dst A */
/* 2 - copy RGB - leave dst A as-is */
/* 3 - copy RGB - set dst A to src A */
if (merge_alpha)
{
if (blend)
__imlib_BlendRGBAToData(im_src->data, im_src->w, im_src->h,
im_dst->data, im_dst->w, im_dst->h,
ssx, ssy,
ddx, ddy,
ssw, ssh, 1);
else
__imlib_BlendRGBAToData(im_src->data, im_src->w, im_src->h,
im_dst->data, im_dst->w, im_dst->h,
ssx, ssy,
ddx, ddy,
ssw, ssh, 3);
}
else
{
if (blend)
__imlib_BlendRGBAToData(im_src->data, im_src->w, im_src->h,
im_dst->data, im_dst->w, im_dst->h,
ssx, ssy,
ddx, ddy,
ssw, ssh, 0);
else
__imlib_BlendRGBAToData(im_src->data, im_src->w, im_src->h,
im_dst->data, im_dst->w, im_dst->h,
ssx, ssy,
ddx, ddy,
ssw, ssh, 2);
}
}
else
{
DATA32 **ypoints = NULL;
int *xpoints = NULL;
int *yapoints = NULL;
int *xapoints = NULL;
DATA32 *buf = NULL;
int sx, sy, sw, sh, dx, dy, dw, dh, dxx, dyy, scw, sch, y2, x2;
int psx, psy, psw, psh;
char xup = 0, yup = 0;
int y, h, hh;
sx = ssx;
sy = ssy;
sw = ssw;
sh = ssh;
dx = ddx;
dy = ddy;
dw = ddw;
dh = ddh;
/* dont do anything if we have a 0 widht or height image to render */
/* if the input rect size < 0 dont render either */
if ((dw <= 0) || (dh <= 0) || (sw <= 0) || (sh <= 0))
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_src->w, im_src->h);
/* clip output coords to clipped input coords */
if (psx != sx)
dx += ((sx - psx) * ddw) / ssw;
if (psy != sy)
dy += ((sy - psy) * ddh) / ssh;
if (psw != sw)
dw = (dw * sw) / psw;
if (psh != sh)
dh = (dh * sh) / psh;
if ((dw <= 0) || (dh <= 0) || (sw <= 0) || (sh <= 0))
return;
psx = dx;
psy = dy;
psw = dw;
psh = dh;
x2 = sx;
y2 = sy;
CLIP(dx, dy, dw, dh, 0, 0, im_dst->w, im_dst->h);
if ((dw <= 0) || (dh <= 0) || (sw <= 0) || (sh <= 0))
return;
if (psx != dx)
sx += ((dx - psx) * ssw) / ddw;
if (psy != dy)
sy += ((dy - psy) * ssh) / ddh;
if (psw != dw)
sw = (sw * dw) / psw;
if (psh != dh)
sh = (sh * dh) / psh;
dxx = dx - psx;
dyy = dy - psy;
dxx += (x2 * ddw) / ssw;
dyy += (y2 * ddh) / ssh;
/* 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 the input rect size < 0 dont render either */
if ((dw <= 0) || (dh <= 0) || (sw <= 0) || (sh <= 0))
return;
/* calculate the scaling factors of width and height for a whole image */
scw = (ddw * im_src->w) / ssw;
sch = (ddh * im_src->h) / ssh;
/* 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_src->data, im_src->w, im_src->h,
sch, im_src->border.top,
im_src->border.bottom);
if (!ypoints)
return;
xpoints = __imlib_CalcXPoints(im_src->w, scw,
im_src->border.left,
im_src->border.right);
if (!xpoints)
{
free(ypoints);
return;
}
/* calculate aliasing counts */
if (aa)
{
yapoints = __imlib_CalcApoints(im_src->h, sch,
im_src->border.top,
im_src->border.bottom);
if (!yapoints)
{
free(ypoints);
free(xpoints);
return;
}
xapoints = __imlib_CalcApoints(im_src->w, scw,
im_src->border.left,
im_src->border.right);
if (!xapoints)
{
free(yapoints);
free(ypoints);
free(xpoints);
return;
}
}
}
/* if we are scaling the image at all make a scaling buffer */
/* allocate a buffer to render scaled RGBA data into */
buf = malloc(dw * LINESIZE * sizeof(DATA32));
if (!buf)
{
if (aa)
{
free(xapoints);
free(yapoints);
}
free(ypoints);
free(xpoints);
return;
}
/* setup h */
h = dh;
/* set our scaling up in x / y dir flags */
if (dw > sw)
xup = 1;
if (dh > sh)
yup = 1;
if (!IMAGE_HAS_ALPHA(im_src))
blend = 0;
if (!IMAGE_HAS_ALPHA(im_dst))
merge_alpha = 0;
/* scale in LINESIZE Y chunks and convert to depth*/
for (y = 0; y < dh; y += LINESIZE)
{
hh = LINESIZE;
if (h < LINESIZE)
hh = h;
/* scale the imagedata for this LINESIZE lines chunk of image */
if (aa)
{
if (IMAGE_HAS_ALPHA(im_src))
__imlib_ScaleAARGBA(ypoints, xpoints, buf, xapoints,
yapoints, xup, yup, dxx, dyy + y,
0, 0, dw, hh, dw, im_src->w);
else
__imlib_ScaleAARGB(ypoints, xpoints, buf, xapoints,
yapoints, xup, yup, dxx, dyy + y,
0, 0, dw, hh, dw, im_src->w);
}
else
__imlib_ScaleSampleRGBA(ypoints, xpoints, buf, dxx, dyy + y,
0, 0, dw, hh, dw);
/* 0 - blend RGB - leave dst A as-is */
/* 1 - blend RGB - add src A to dst A */
/* 2 - copy RGB - leave dst A as-is */
/* 3 - copy RGB - set dst A to src A */
if (merge_alpha)
{
if (blend)
__imlib_BlendRGBAToData(buf, dw, hh,
im_dst->data, im_dst->w,
im_dst->h,
0, 0, dx, dy + y, dw, dh, 1);
else
__imlib_BlendRGBAToData(buf, dw, hh,
im_dst->data, im_dst->w,
im_dst->h,
0, 0, dx, dy + y, dw, dh, 3);
}
else
{
if (blend)
__imlib_BlendRGBAToData(buf, dw, hh,
im_dst->data, im_dst->w,
im_dst->h,
0, 0, dx, dy + y, dw, dh, 0);
else
__imlib_BlendRGBAToData(buf, dw, hh,
im_dst->data, im_dst->w,
im_dst->h,
0, 0, dx, dy + y, dw, dh, 2);
}
h -= LINESIZE;
}
/* free up our buffers and poit tables */
if (buf)
{
free(buf);
free(ypoints);
free(xpoints);
}
if (aa)
{
free(yapoints);
free(xapoints);
}
}
}

View File

@ -10,8 +10,15 @@ __imlib_BlendRGBAToRGB(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump,
void
__imlib_BlendRGBAToRGBA(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump,
int w, int h);
void
__imlib_CopyRGBAToRGB(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump,
int w, int h);
void
__imlib_CopyRGBAToRGBA(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump,
int w, int h);
void
__imlib_BlendImageToImage(ImlibImage *im_src, ImlibImage *im_dst,
char aa, char blend, char merge_alpha,
int ssx, int ssy, int ssw, int ssh,
int ddx, int ddy, int ddw, int ddh);
#endif

43
image.c
View File

@ -169,7 +169,7 @@ __imlib_CleanupImageCache(void)
{
ImlibImage *im, *im_last;
int current_cache;
char operation = 1;
char operation = 0;
current_cache = __imlib_CurrentCacheSize();
im_last = NULL;
@ -179,7 +179,7 @@ __imlib_CleanupImageCache(void)
im_last = im;
im = im->next;
if ((im_last->references <= 0) &&
(IMAGE_IS_VALID(im_last)))
(!(IMAGE_IS_VALID(im_last))))
{
__imlib_RemoveImageFromCache(im_last);
__imlib_ConsumeImage(im_last);
@ -307,7 +307,7 @@ __imlib_CleanupImagePixmapCache(void)
{
ImlibImagePixmap *ip, *ip_last;
int current_cache;
char operation = 1;
char operation = 0;
current_cache = __imlib_CurrentCacheSize();
ip_last = NULL;
@ -634,24 +634,32 @@ __imlib_LoadImage(char *file,
/* if we found a cached image and we shoudl always check that it is */
/* accurate to the disk conents if they changed since we last loaded */
/* and that it is still a valid image */
if ((im) && (IMAGE_IS_VALID(im)) && (IMAGE_ALWAYS_CHECK_DISK(im)))
if ((im) && (IMAGE_IS_VALID(im)))
{
time_t current_modified_time;
current_modified_time = __imlib_FileModDate(file);
/* if the file on disk is newer than the cached one */
if (current_modified_time > im->moddate)
if (IMAGE_ALWAYS_CHECK_DISK(im))
{
/* invalidate image */
SET_FLAG(im->flags, F_INVALID);
time_t current_modified_time;
current_modified_time = __imlib_FileModDate(file);
/* if the file on disk is newer than the cached one */
if (current_modified_time > im->moddate)
{
/* invalidate image */
SET_FLAG(im->flags, F_INVALID);
}
else
{
/* image is ok to re-use - program is just being stupid loading */
/* the same data twice */
im->references++;
return im;
}
}
else
{
/* image is ok to re-use - program is just being stupid loading */
/* the same data twice */
im->references++;
return im;
}
}
}
/* either image in cache is invalid or we dont even have it in cache */
/* so produce a new one and load an image into that */
@ -733,17 +741,18 @@ __imlib_FindImlibImagePixmapByID(Display *d, Pixmap p)
void
__imlib_FreeImage(ImlibImage *im)
{
if (im->references > 0)
if (im->references >= 0)
{
im->references--;
if (IMAGE_IS_UNCACHEABLE(im))
{
printf("unchangeable\n");
if (im->references == 0)
__imlib_ConsumeImage(im);
}
else
__imlib_CleanupImageCache();
}
__imlib_CleanupImageCache();
}
}
void

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