added ability to attach integert vlue and data poitner tags to images by

string keys (with destructors optional) - wil be used for saving of images
(savers will look for these keys to gleen parameters for saaving)


SVN revision: 1092
This commit is contained in:
Carsten Haitzler 1999-11-01 10:00:06 +00:00
parent da9869d97d
commit 73b408fc3d
5 changed files with 441 additions and 241 deletions

60
api.c
View File

@ -47,8 +47,9 @@ if (!(param)) \
return; \
}
typedef void (*Imlib_Internal_Progress_Function)(ImlibImage*, char,
typedef void (*Imlib_Internal_Progress_Function)(void *, char,
int, int, int, int);
typedef void (*Imlib_Internal_Data_Destructor_Function)(void *, void *);
int
imlib_get_cache_size(void)
@ -1798,3 +1799,60 @@ imlib_image_query_pixel(Imlib_Image image, int x, int y,
color_return->blue = (*p) & 0xff;
color_return->alpha = ((*p) >> 24) & 0xff;
}
void
imlib_image_attach_data_value(Imlib_Image image, char *key,
void *data, int value,
Imlib_Internal_Data_Destructor_Function destructor_function)
{
ImlibImage *im;
CAST_IMAGE(im, image);
__imlib_AttachTag(im, key, value, data, destructor_function);
}
void *
imlib_image_get_attached_data(Imlib_Image image, char *key)
{
ImlibImageTag *t;
ImlibImage *im;
CAST_IMAGE(im, image);
t = __imlib_GetTag(im, key);
if (t)
return t->data;
return NULL;
}
int
imlib_image_get_attached_value(Imlib_Image image, char *key)
{
ImlibImageTag *t;
ImlibImage *im;
CAST_IMAGE(im, image);
t = __imlib_GetTag(im, key);
if (t)
return t->val;
return 0;
}
void
imlib_image_remove_attached_data_value(Imlib_Image image, char *key)
{
ImlibImage *im;
CAST_IMAGE(im, image);
__imlib_RemoveTag(im, key);
}
void
imlib_image_remove_and_free_attached_data_value(Imlib_Image image, char *key)
{
ImlibImageTag *t;
ImlibImage *im;
CAST_IMAGE(im, image);
t = __imlib_RemoveTag(im, key);
__imlib_FreeTag(im, t);
}

12
api.h
View File

@ -70,9 +70,10 @@ struct _imlib_rectangle
int x, y, width, height;
};
typedef void (*Imlib_Progress_Function)(Imlib_Image *im, char percent,
typedef void (*Imlib_Progress_Function)(Imlib_Image im, char percent,
int update_x, int update_y,
int update_w, int update_h);
typedef void (*Imlib_Data_Destructor_Function)(Imlib_Image im, void *data);
/* init and setup functions */
int imlib_get_cache_size(void);
@ -363,6 +364,15 @@ void imlib_image_fill_color_range_rectangle(Imlib_Image image, int x, int y,
void imlib_image_query_pixel(Imlib_Image image, int x, int y,
Imlib_Color *color_return);
void imlib_image_attach_data_value(Imlib_Image image, char *key,
void *data, int value,
Imlib_Data_Destructor_Function destructor_function);
void *imlib_image_get_attached_data(Imlib_Image image, char *key);
int imlib_image_get_attached_value(Imlib_Image image, char *key);
void imlib_image_remove_attached_data_value(Imlib_Image image, char *key);
void imlib_image_remove_and_free_attached_data_value(Imlib_Image image, char *key);
# if 0
/* image saving functions */
void imlib_save_image(Imlib_Image image, char *filename);

510
blend.c
View File

@ -302,21 +302,24 @@ __imlib_AddBlendRGBAToRGB(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump,
for (x = 0; x < w; x++)
{
a = (*p1 >> 24) & 0xff;
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
tmp = rr + ((r * a) >> 8);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
tmp = gg + ((g * a) >> 8);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
tmp = bb + ((b * a) >> 8);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
*p2 = (nr << 16) | (ng << 8) | nb;
if (a > 0)
{
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
tmp = rr + ((r * a) >> 8);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
tmp = gg + ((g * a) >> 8);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
tmp = bb + ((b * a) >> 8);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
*p2 = (nr << 16) | (ng << 8) | nb;
}
p1++;
p2++;
}
@ -340,25 +343,28 @@ __imlib_AddBlendRGBAToRGBA(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump,
for (x = 0; x < w; x++)
{
a = (*p1 >> 24) & 0xff;
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
aa = (*p2 >> 24) & 0xff;
tmp = rr + ((r * a) >> 8);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
tmp = gg + ((g * a) >> 8);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
tmp = bb + ((b * a) >> 8);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
tmp = a + aa;
na = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
*p2 = (na << 24) | (nr << 16) |
(ng << 8) | nb;
if (a > 0)
{
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
aa = (*p2 >> 24) & 0xff;
tmp = rr + ((r * a) >> 8);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
tmp = gg + ((g * a) >> 8);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
tmp = bb + ((b * a) >> 8);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
tmp = a + aa;
na = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
*p2 = (na << 24) | (nr << 16) |
(ng << 8) | nb;
}
p1++;
p2++;
}
@ -390,11 +396,11 @@ __imlib_AddCopyRGBAToRGB(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump,
rr = (*p2 >> 16) & 0xff;
tmp = rr + r;
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
tmp = gg + g;
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
tmp = bb + b;
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
*p2 = (*p2 & 0xff000000) | (nr << 16) | (ng << 8) | nb;
p1++;
p2++;
@ -427,11 +433,11 @@ __imlib_AddCopyRGBAToRGBA(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump,
rr = (*p2 >> 16) & 0xff;
tmp = rr + r;
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
tmp = gg + g;
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
tmp = bb + b;
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
*p2 = (nr << 16) | (ng << 8) | nb;
p1++;
p2++;
@ -458,21 +464,24 @@ __imlib_SubBlendRGBAToRGB(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump,
for (x = 0; x < w; x++)
{
a = (*p1 >> 24) & 0xff;
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
tmp = rr - ((r * a) >> 8);
nr = tmp & (~(tmp >> 8));
tmp = gg - ((g * a) >> 8);
ng = tmp & (~(tmp >> 8));
tmp = bb - ((b * a) >> 8);
nb = tmp & (~(tmp >> 8));
*p2 = (nr << 16) | (ng << 8) | nb;
if (a > 0)
{
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
tmp = rr - ((r * a) >> 8);
nr = tmp & (~(tmp >> 8));
tmp = gg - ((g * a) >> 8);
ng = tmp & (~(tmp >> 8));
tmp = bb - ((b * a) >> 8);
nb = tmp & (~(tmp >> 8));
*p2 = (nr << 16) | (ng << 8) | nb;
}
p1++;
p2++;
}
@ -496,25 +505,28 @@ __imlib_SubBlendRGBAToRGBA(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump,
for (x = 0; x < w; x++)
{
a = (*p1 >> 24) & 0xff;
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
aa = (*p2 >> 24) & 0xff;
tmp = rr - ((r * a) >> 8);
nr = tmp & (~(tmp >> 8));
tmp = gg - ((g * a) >> 8);
ng = tmp & (~(tmp >> 8));
tmp = bb - ((b * a) >> 8);
nb = tmp & (~(tmp >> 8));
tmp = a + aa;
na = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
*p2 = (na << 24) | (nr << 16) |
(ng << 8) | nb;
if (a > 0)
{
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
aa = (*p2 >> 24) & 0xff;
tmp = rr - ((r * a) >> 8);
nr = tmp & (~(tmp >> 8));
tmp = gg - ((g * a) >> 8);
ng = tmp & (~(tmp >> 8));
tmp = bb - ((b * a) >> 8);
nb = tmp & (~(tmp >> 8));
tmp = a + aa;
na = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
*p2 = (na << 24) | (nr << 16) |
(ng << 8) | nb;
}
p1++;
p2++;
}
@ -615,21 +627,24 @@ __imlib_ReBlendRGBAToRGB(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump,
for (x = 0; x < w; x++)
{
a = (*p1 >> 24) & 0xff;
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
tmp = rr + (((r - 127) * a) >> 7);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
tmp = gg + (((g - 127) * a) >> 7);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
tmp = bb + (((b - 127) * a) >> 7);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
*p2 = (nr << 16) | (ng << 8) | nb;
if (a > 0)
{
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
tmp = rr + (((r - 127) * a) >> 7);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
tmp = gg + (((g - 127) * a) >> 7);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
tmp = bb + (((b - 127) * a) >> 7);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
*p2 = (nr << 16) | (ng << 8) | nb;
}
p1++;
p2++;
}
@ -653,25 +668,28 @@ __imlib_ReBlendRGBAToRGBA(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump,
for (x = 0; x < w; x++)
{
a = (*p1 >> 24) & 0xff;
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
aa = (*p2 >> 24) & 0xff;
tmp = rr + (((r - 127) * a) >> 7);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
tmp = gg + (((g - 127) * a) >> 7);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
tmp = bb + (((b - 127) * a) >> 7);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
tmp = a + aa;
na = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
*p2 = (na << 24) | (nr << 16) |
(ng << 8) | nb;
if (a > 0)
{
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
aa = (*p2 >> 24) & 0xff;
tmp = rr + (((r - 127) * a) >> 7);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
tmp = gg + (((g - 127) * a) >> 7);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
tmp = bb + (((b - 127) * a) >> 7);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
tmp = a + aa;
na = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
*p2 = (na << 24) | (nr << 16) |
(ng << 8) | nb;
}
p1++;
p2++;
}
@ -703,11 +721,11 @@ __imlib_ReCopyRGBAToRGB(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump,
rr = (*p2 >> 16) & 0xff;
tmp = rr + ((r - 127) << 1);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
tmp = gg + ((g - 127) << 1);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
tmp = bb + ((b - 127) << 1);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
*p2 = (*p2 & 0xff000000) | (nr << 16) | (ng << 8) | nb;
p1++;
p2++;
@ -940,23 +958,26 @@ __imlib_AddBlendRGBAToRGBCmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_ju
for (x = 0; x < w; x++)
{
a = (*p1 >> 24) & 0xff;
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
CMOD_APPLY_RGBA(cm, r, g, b, a);
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
tmp = rr + ((r * a) >> 8);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
tmp = gg + ((g * a) >> 8);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
tmp = bb + ((b * a) >> 8);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
*p2 = (nr << 16) | (ng << 8) | nb;
if (a > 0)
{
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
CMOD_APPLY_RGBA(cm, r, g, b, a);
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
tmp = rr + ((r * a) >> 8);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
tmp = gg + ((g * a) >> 8);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
tmp = bb + ((b * a) >> 8);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
*p2 = (nr << 16) | (ng << 8) | nb;
}
p1++;
p2++;
}
@ -980,27 +1001,30 @@ __imlib_AddBlendRGBAToRGBACmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_j
for (x = 0; x < w; x++)
{
a = (*p1 >> 24) & 0xff;
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
CMOD_APPLY_RGBA(cm, r, g, b, a);
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
aa = (*p2 >> 24) & 0xff;
tmp = rr + ((r * a) >> 8);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
tmp = gg + ((g * a) >> 8);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
tmp = bb + ((b * a) >> 8);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
tmp = a + aa;
na = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
*p2 = (na << 24) | (nr << 16) |
(ng << 8) | nb;
if (a > 0)
{
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
CMOD_APPLY_RGBA(cm, r, g, b, a);
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
aa = (*p2 >> 24) & 0xff;
tmp = rr + ((r * a) >> 8);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
tmp = gg + ((g * a) >> 8);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
tmp = bb + ((b * a) >> 8);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
tmp = a + aa;
na = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
*p2 = (na << 24) | (nr << 16) |
(ng << 8) | nb;
}
p1++;
p2++;
}
@ -1034,11 +1058,11 @@ __imlib_AddCopyRGBAToRGBCmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jum
rr = (*p2 >> 16) & 0xff;
tmp = rr + r;
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
tmp = gg + g;
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
tmp = bb + b;
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
*p2 = (*p2 & 0xff000000) | (nr << 16) | (ng << 8) | nb;
p1++;
p2++;
@ -1073,11 +1097,11 @@ __imlib_AddCopyRGBAToRGBACmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_ju
rr = (*p2 >> 16) & 0xff;
tmp = rr + r;
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
tmp = gg + g;
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
tmp = bb + b;
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & 0xff;
*p2 = (nr << 16) | (ng << 8) | nb;
p1++;
p2++;
@ -1104,23 +1128,26 @@ __imlib_SubBlendRGBAToRGBCmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_ju
for (x = 0; x < w; x++)
{
a = (*p1 >> 24) & 0xff;
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
CMOD_APPLY_RGBA(cm, r, g, b, a);
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
tmp = rr - ((r * a) >> 8);
nr = tmp & (~(tmp >> 8));
tmp = gg - ((g * a) >> 8);
ng = tmp & (~(tmp >> 8));
tmp = bb - ((b * a) >> 8);
nb = tmp & (~(tmp >> 8));
*p2 = (nr << 16) | (ng << 8) | nb;
if (a > 0)
{
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
CMOD_APPLY_RGBA(cm, r, g, b, a);
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
tmp = rr - ((r * a) >> 8);
nr = tmp & (~(tmp >> 8));
tmp = gg - ((g * a) >> 8);
ng = tmp & (~(tmp >> 8));
tmp = bb - ((b * a) >> 8);
nb = tmp & (~(tmp >> 8));
*p2 = (nr << 16) | (ng << 8) | nb;
}
p1++;
p2++;
}
@ -1144,27 +1171,30 @@ __imlib_SubBlendRGBAToRGBACmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_j
for (x = 0; x < w; x++)
{
a = (*p1 >> 24) & 0xff;
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
CMOD_APPLY_RGBA(cm, r, g, b, a);
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
aa = (*p2 >> 24) & 0xff;
tmp = rr - ((r * a) >> 8);
nr = tmp & (~(tmp >> 8));
tmp = gg - ((g * a) >> 8);
ng = tmp & (~(tmp >> 8));
tmp = bb - ((b * a) >> 8);
nb = tmp & (~(tmp >> 8));
tmp = a + aa;
na = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
*p2 = (na << 24) | (nr << 16) |
(ng << 8) | nb;
if (a > 0)
{
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
CMOD_APPLY_RGBA(cm, r, g, b, a);
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
aa = (*p2 >> 24) & 0xff;
tmp = rr - ((r * a) >> 8);
nr = tmp & (~(tmp >> 8));
tmp = gg - ((g * a) >> 8);
ng = tmp & (~(tmp >> 8));
tmp = bb - ((b * a) >> 8);
nb = tmp & (~(tmp >> 8));
tmp = a + aa;
na = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
*p2 = (na << 24) | (nr << 16) |
(ng << 8) | nb;
}
p1++;
p2++;
}
@ -1269,23 +1299,26 @@ __imlib_ReBlendRGBAToRGBCmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jum
for (x = 0; x < w; x++)
{
a = (*p1 >> 24) & 0xff;
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
CMOD_APPLY_RGBA(cm, r, g, b, a);
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
tmp = rr + (((r - 127) * a) >> 7);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
tmp = gg + (((g - 127) * a) >> 7);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
tmp = bb + (((b - 127) * a) >> 7);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
*p2 = (nr << 16) | (ng << 8) | nb;
if (a > 0)
{
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
CMOD_APPLY_RGBA(cm, r, g, b, a);
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
tmp = rr + (((r - 127) * a) >> 7);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
tmp = gg + (((g - 127) * a) >> 7);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
tmp = bb + (((b - 127) * a) >> 7);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
*p2 = (nr << 16) | (ng << 8) | nb;
}
p1++;
p2++;
}
@ -1309,27 +1342,30 @@ __imlib_ReBlendRGBAToRGBACmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_ju
for (x = 0; x < w; x++)
{
a = (*p1 >> 24) & 0xff;
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
CMOD_APPLY_RGBA(cm, r, g, b, a);
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
aa = (*p2 >> 24) & 0xff;
tmp = rr + (((r - 127) * a) >> 7);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
tmp = gg + (((g - 127) * a) >> 7);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
tmp = bb + (((b - 127) * a) >> 7);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
tmp = a + aa;
na = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
*p2 = (na << 24) | (nr << 16) |
(ng << 8) | nb;
if (a > 0)
{
b = (*p1 ) & 0xff;
g = (*p1 >> 8 ) & 0xff;
r = (*p1 >> 16) & 0xff;
CMOD_APPLY_RGBA(cm, r, g, b, a);
bb = (*p2 ) & 0xff;
gg = (*p2 >> 8 ) & 0xff;
rr = (*p2 >> 16) & 0xff;
aa = (*p2 >> 24) & 0xff;
tmp = rr + (((r - 127) * a) >> 7);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
tmp = gg + (((g - 127) * a) >> 7);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
tmp = bb + (((b - 127) * a) >> 7);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
tmp = a + aa;
na = (tmp | ((tmp & 256) - ((tmp & 256) >> 8)));
*p2 = (na << 24) | (nr << 16) |
(ng << 8) | nb;
}
p1++;
p2++;
}
@ -1363,11 +1399,11 @@ __imlib_ReCopyRGBAToRGBCmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump
rr = (*p2 >> 16) & 0xff;
tmp = rr + ((r - 127) << 1);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
tmp = gg + ((g - 127) << 1);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
tmp = bb + ((b - 127) << 1);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
*p2 = (*p2 & 0xff000000) | (nr << 16) | (ng << 8) | nb;
p1++;
p2++;
@ -1402,11 +1438,11 @@ __imlib_ReCopyRGBAToRGBACmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jum
rr = (*p2 >> 16) & 0xff;
tmp = rr + ((r - 127) << 1);
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
nr = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
tmp = gg + ((g - 127) << 1);
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
ng = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
tmp = bb + ((b - 127) << 1);
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9));
nb = (tmp | ((tmp & 256) - ((tmp & 256) >> 8))) & (~(tmp >> 9)) & 0xff;
*p2 = (nr << 16) | (ng << 8) | nb;
p1++;
p2++;

82
image.c
View File

@ -1,7 +1,6 @@
#include "common.h"
#include <time.h>
#include <string.h>
#include <dlfcn.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
@ -17,6 +16,83 @@ static ImlibImagePixmap *pixmaps = NULL;
static ImlibLoader *loaders = NULL;
static int cache_size = 4096 * 1024;
void
__imlib_AttachTag(ImlibImage *im, char *key, int val, void *data,
void (*destructor)(ImlibImage *im, void *data))
{
ImlibImageTag *t;
if (!key)
return;
t = malloc(sizeof(ImlibImageTag));
t->key = strdup(key);
t->val = val;
t->data = data;
t->destructor = destructor;
t->next = im->tags;
im->tags = t;
}
ImlibImageTag *
__imlib_GetTag(ImlibImage *im, char *key)
{
ImlibImageTag *t;
t = im->tags;
while (t)
{
if (!strcmp(t->key, key))
return t;
t = t->next;
}
}
ImlibImageTag *
__imlib_RemoveTag(ImlibImage *im, char *key)
{
ImlibImageTag *t, *tt;
tt = NULL;
t = im->tags;
while (t)
{
if (!strcmp(t->key, key))
{
if (tt)
tt->next = t->next;
else
im->tags = t->next;
return t;
}
tt = t;
t = t->next;
}
}
void
__imlib_FreeTag(ImlibImage *im, ImlibImageTag *t)
{
free(t->key);
if (t->destructor)
t->destructor(im, t->data);
free(t);
}
void
__imlib_FreeAllTags(ImlibImage *im)
{
ImlibImageTag *t, *tt;
t = im->tags;
while (t)
{
tt = t;
t = t->next;
__imlib_FreeTag(im, tt);
}
}
void
__imlib_SetCacheSize(int size)
{
@ -43,12 +119,14 @@ __imlib_ProduceImage(void)
im->flags = F_NONE;
im->loader = NULL;
im->next = NULL;
im->tags = NULL;
return im;
}
void
__imlib_ConsumeImage(ImlibImage *im)
{
__imlib_FreeAllTags(im);
if (im->file)
free(im->file);
if ((IMAGE_FREE_DATA(im)) && (im->data))
@ -469,7 +547,7 @@ __imlib_ConsumeLoader(ImlibLoader *l)
if (l->file)
free(l->file);
if (l->handle)
dlclose(l->handle);
lt_dlclose(l->handle);
if (l->formats)
{
int i;

18
image.h
View File

@ -7,6 +7,7 @@ typedef struct _imlibimage ImlibImage;
typedef struct _imlibimagepixmap ImlibImagePixmap;
typedef struct _imlibborder ImlibBorder;
typedef struct _imlibloader ImlibLoader;
typedef struct _imlibimagetag ImlibImageTag;
enum _load_error
{
@ -47,6 +48,15 @@ struct _imlibborder
int left, right, top, bottom;
};
struct _imlibimagetag
{
char *key;
int val;
void *data;
void (*destructor)(ImlibImage *im, void *data);
ImlibImageTag *next;
};
struct _imlibimage
{
char *file;
@ -59,6 +69,7 @@ struct _imlibimage
ImlibLoader *loader;
char *format;
ImlibImage *next;
ImlibImageTag *tags;
};
struct _imlibimagepixmap
@ -98,6 +109,13 @@ struct _imlibloader
ImlibLoader *next;
};
void __imlib_AttachTag(ImlibImage *im, char *key, int val, void *data,
void (*destructor)(ImlibImage *im, void *data));
ImlibImageTag *__imlib_GetTag(ImlibImage *im, char *key);
ImlibImageTag *__imlib_RemoveTag(ImlibImage *im, char *key);
void __imlib_FreeTag(ImlibImage *im, ImlibImageTag *t);
void __imlib_FreeAllTags(ImlibImage *im);
void __imlib_SetCacheSize(int size);
int __imlib_GetCacheSize(void);
ImlibImage *__imlib_ProduceImage(void);