kwo pushed a commit to branch master. http://git.enlightenment.org/legacy/imlib2_loaders.git/commit/?id=e2194ab37955bc21c4659804884cc9558712442a
commit e2194ab37955bc21c4659804884cc9558712442a Author: Kim Woelders <k...@woelders.dk> Date: Wed Nov 20 16:57:08 2019 +0100 XCF loader: Prefer DATA32 when accessing imlib2 image data --- src/modules/loaders/color_values.h | 20 ---- src/modules/loaders/loader_xcf.c | 69 +++++++------- src/modules/loaders/loader_xcf.h | 76 +++++++-------- src/modules/loaders/loader_xcf_pixelfuncs.c | 143 +++++++++++++++++++--------- 4 files changed, 173 insertions(+), 135 deletions(-) diff --git a/src/modules/loaders/color_values.h b/src/modules/loaders/color_values.h deleted file mode 100644 index 861daa5..0000000 --- a/src/modules/loaders/color_values.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef __color_values_h -#define __color_values_h 1 - -#ifndef WORDS_BIGENDIAN - -#define A_VAL(p) ((DATA8 *)(p))[3] -#define R_VAL(p) ((DATA8 *)(p))[2] -#define G_VAL(p) ((DATA8 *)(p))[1] -#define B_VAL(p) ((DATA8 *)(p))[0] - -#else - -#define A_VAL(p) ((DATA8 *)(p))[0] -#define R_VAL(p) ((DATA8 *)(p))[1] -#define G_VAL(p) ((DATA8 *)(p))[2] -#define B_VAL(p) ((DATA8 *)(p))[3] - -#endif - -#endif /* __color_values_h */ diff --git a/src/modules/loaders/loader_xcf.c b/src/modules/loaders/loader_xcf.c index 7ca745d..a226ba2 100644 --- a/src/modules/loaders/loader_xcf.c +++ b/src/modules/loaders/loader_xcf.c @@ -55,7 +55,6 @@ #include <sys/types.h> #include <netinet/in.h> -#include "color_values.h" #include "loader_common.h" #include "loader_xcf.h" @@ -194,7 +193,7 @@ struct _Layer { * I know, but makes life easier */ - DATA8 *data; + DATA32 *data; /* Layers are stored as a linked list. */ struct _Layer *next; @@ -240,7 +239,7 @@ struct _GimpImage { /* Tadaa -- the final image data. Layers get pasted * onto this one, bottom-up. */ - DATA8 *data; + DATA32 *data; Layer *layers; Layer *last_layer; @@ -410,8 +409,8 @@ set_layer_opacity(Layer * layer) if (layer->opacity != 255) { - for (i = 0, ptr = layer->data; i < layer->width * layer->height; - i++, ptr += 4) + for (i = 0, ptr = (DATA8 *) layer->data; + i < layer->width * layer->height; i++, ptr += 4) { *(ptr + 3) = (*(ptr + 3) * layer->opacity) >> 8; } @@ -433,8 +432,8 @@ apply_layer_mask(Layer * layer) if (!layer->mask) return; - ptr1 = layer->data; - ptr2 = layer->mask->data; + ptr1 = (DATA8 *) layer->data; + ptr2 = (DATA8 *) layer->mask->data; for (i = 0; i < layer->width * layer->height; i++) { @@ -850,12 +849,12 @@ xcf_load_layer_props(Layer * layer) static void read_tiles_into_data(Tile * tiles, int num_cols, int width, - int height, int bpp, DATA8 ** data_p, int use_cmap) + int height, int bpp, DATA32 ** data_p, int use_cmap) { int tile_x, tile_y, x, y, offset_x, offset_y; - DATA8 *data; - DATA8 *ptr; + DATA32 *data; DATA8 *ptr2; + unsigned char a, r, g, b; Tile *t; int warned = 0; @@ -866,9 +865,10 @@ read_tiles_into_data(Tile * tiles, int num_cols, int width, free(*data_p); /* Always allocate the data as 4 bytes per pixel */ - data = (*data_p) = malloc(sizeof(DATA32) * width * height); + data = malloc(sizeof(DATA32) * width * height); + *data_p = data; - ptr = data; + a = r = g = b = 0xff; for (y = 0; y < height; y++) { @@ -888,28 +888,28 @@ read_tiles_into_data(Tile * tiles, int num_cols, int width, /* use colormap if the image has one */ if (image->cmap && use_cmap) { - R_VAL(ptr) = image->cmap[*(ptr2) * 3]; - G_VAL(ptr) = image->cmap[*(ptr2) * 3 + 1]; - B_VAL(ptr) = image->cmap[*(ptr2) * 3 + 2]; - A_VAL(ptr) = 255; + r = image->cmap[*(ptr2) * 3]; + g = image->cmap[*(ptr2) * 3 + 1]; + b = image->cmap[*(ptr2) * 3 + 2]; + a = 255; } /* else use colors themselves */ else { - R_VAL(ptr) = *(ptr2); - G_VAL(ptr) = *(ptr2); - B_VAL(ptr) = *(ptr2); - A_VAL(ptr) = 255; + r = *(ptr2); + g = *(ptr2); + b = *(ptr2); + a = 255; } break; case 2: /* use colormap if the image has one */ if (image->cmap && use_cmap) { - R_VAL(ptr) = image->cmap[*(ptr2) * 3]; - G_VAL(ptr) = image->cmap[*(ptr2) * 3 + 1]; - B_VAL(ptr) = image->cmap[*(ptr2) * 3 + 2]; - A_VAL(ptr) = *(ptr2 + 1); + r = image->cmap[*(ptr2) * 3]; + g = image->cmap[*(ptr2) * 3 + 1]; + b = image->cmap[*(ptr2) * 3 + 2]; + a = *(ptr2 + 1); } /* else use colors themselves */ else if (warned == 0) @@ -931,20 +931,21 @@ read_tiles_into_data(Tile * tiles, int num_cols, int width, } else { - R_VAL(ptr) = *(ptr2); - G_VAL(ptr) = *(ptr2 + 1); - B_VAL(ptr) = *(ptr2 + 2); - A_VAL(ptr) = 255; + r = *(ptr2); + g = *(ptr2 + 1); + b = *(ptr2 + 2); + a = 255; } break; default: - R_VAL(ptr) = *(ptr2); - G_VAL(ptr) = *(ptr2 + 1); - B_VAL(ptr) = *(ptr2 + 2); - A_VAL(ptr) = *(ptr2 + 3); + r = *(ptr2); + g = *(ptr2 + 1); + b = *(ptr2 + 2); + a = *(ptr2 + 3); break; } - ptr += 4; + + *data++ = PIXEL_ARGB(a, r, g, b); } } } @@ -1585,7 +1586,7 @@ xcf_to_imlib(ImlibImage * im) im->h = image->height; SET_FLAG(im->flags, F_HAS_ALPHA); - im->data = (DATA32 *) image->data; + im->data = image->data; } char diff --git a/src/modules/loaders/loader_xcf.h b/src/modules/loaders/loader_xcf.h index 92da72f..fe55dd6 100644 --- a/src/modules/loaders/loader_xcf.h +++ b/src/modules/loaders/loader_xcf.h @@ -2,50 +2,50 @@ #define LOADER_XCF_H /* Stuff for layer merging: */ -extern void combine_pixels_normal(DATA8 * src, int src_w, int src_h, - DATA8 * dest, int dest_w, int dest_h, - int dest_x, int dest_y); -extern void combine_pixels_add(DATA8 * src, int src_w, int src_h, - DATA8 * dest, int dest_w, int dest_h, +extern void combine_pixels_normal(const DATA32 * src, int src_w, + int src_h, DATA32 * dest, int dest_w, + int dest_h, int dest_x, int dest_y); +extern void combine_pixels_add(const DATA32 * src, int src_w, int src_h, + DATA32 * dest, int dest_w, int dest_h, int dest_x, int dest_y); -extern void combine_pixels_sub(DATA8 * src, int src_w, int src_h, - DATA8 * dest, int dest_w, int dest_h, +extern void combine_pixels_sub(const DATA32 * src, int src_w, int src_h, + DATA32 * dest, int dest_w, int dest_h, int dest_x, int dest_y); -extern void combine_pixels_diff(DATA8 * src, int src_w, int src_h, - DATA8 * dest, int dest_w, int dest_h, - int dest_x, int dest_y); -extern void combine_pixels_darken(DATA8 * src, int src_w, int src_h, - DATA8 * dest, int dest_w, int dest_h, - int dest_x, int dest_y); -extern void combine_pixels_lighten(DATA8 * src, int src_w, int src_h, - DATA8 * dest, int dest_w, int dest_h, - int dest_x, int dest_y); -extern void combine_pixels_mult(DATA8 * src, int src_w, int src_h, - DATA8 * dest, int dest_w, int dest_h, - int dest_x, int dest_y); -extern void combine_pixels_div(DATA8 * src, int src_w, int src_h, - DATA8 * dest, int dest_w, int dest_h, +extern void combine_pixels_diff(const DATA32 * src, int src_w, + int src_h, DATA32 * dest, int dest_w, + int dest_h, int dest_x, int dest_y); +extern void combine_pixels_darken(const DATA32 * src, int src_w, + int src_h, DATA32 * dest, int dest_w, + int dest_h, int dest_x, int dest_y); +extern void combine_pixels_lighten(const DATA32 * src, int src_w, + int src_h, DATA32 * dest, int dest_w, + int dest_h, int dest_x, int dest_y); +extern void combine_pixels_mult(const DATA32 * src, int src_w, + int src_h, DATA32 * dest, int dest_w, + int dest_h, int dest_x, int dest_y); +extern void combine_pixels_div(const DATA32 * src, int src_w, int src_h, + DATA32 * dest, int dest_w, int dest_h, int dest_x, int dest_y); -extern void combine_pixels_screen(DATA8 * src, int src_w, int src_h, - DATA8 * dest, int dest_w, int dest_h, - int dest_x, int dest_y); -extern void combine_pixels_overlay(DATA8 * src, int src_w, int src_h, - DATA8 * dest, int dest_w, int dest_h, - int dest_x, int dest_y); -extern void combine_pixels_hue(DATA8 * src, int src_w, int src_h, - DATA8 * dest, int dest_w, int dest_h, +extern void combine_pixels_screen(const DATA32 * src, int src_w, + int src_h, DATA32 * dest, int dest_w, + int dest_h, int dest_x, int dest_y); +extern void combine_pixels_overlay(const DATA32 * src, int src_w, + int src_h, DATA32 * dest, int dest_w, + int dest_h, int dest_x, int dest_y); +extern void combine_pixels_hue(const DATA32 * src, int src_w, int src_h, + DATA32 * dest, int dest_w, int dest_h, int dest_x, int dest_y); -extern void combine_pixels_sat(DATA8 * src, int src_w, int src_h, - DATA8 * dest, int dest_w, int dest_h, +extern void combine_pixels_sat(const DATA32 * src, int src_w, int src_h, + DATA32 * dest, int dest_w, int dest_h, int dest_x, int dest_y); -extern void combine_pixels_val(DATA8 * src, int src_w, int src_h, - DATA8 * dest, int dest_w, int dest_h, +extern void combine_pixels_val(const DATA32 * src, int src_w, int src_h, + DATA32 * dest, int dest_w, int dest_h, int dest_x, int dest_y); -extern void combine_pixels_col(DATA8 * src, int src_w, int src_h, - DATA8 * dest, int dest_w, int dest_h, +extern void combine_pixels_col(const DATA32 * src, int src_w, int src_h, + DATA32 * dest, int dest_w, int dest_h, int dest_x, int dest_y); -extern void combine_pixels_diss(DATA8 * src, int src_w, int src_h, - DATA8 * dest, int dest_w, int dest_h, - int dest_x, int dest_y); +extern void combine_pixels_diss(const DATA32 * src, int src_w, + int src_h, DATA32 * dest, int dest_w, + int dest_h, int dest_x, int dest_y); #endif /* LOADER_XCF_H */ diff --git a/src/modules/loaders/loader_xcf_pixelfuncs.c b/src/modules/loaders/loader_xcf_pixelfuncs.c index fed96ee..5ae8bd5 100644 --- a/src/modules/loaders/loader_xcf_pixelfuncs.c +++ b/src/modules/loaders/loader_xcf_pixelfuncs.c @@ -28,9 +28,24 @@ #include "common.h" #include "image.h" -#include "color_values.h" #include "loader_xcf.h" +#ifndef WORDS_BIGENDIAN + +#define A_VAL(p) ((DATA8 *)(p))[3] +#define R_VAL(p) ((DATA8 *)(p))[2] +#define G_VAL(p) ((DATA8 *)(p))[1] +#define B_VAL(p) ((DATA8 *)(p))[0] + +#else + +#define A_VAL(p) ((DATA8 *)(p))[0] +#define R_VAL(p) ((DATA8 *)(p))[1] +#define G_VAL(p) ((DATA8 *)(p))[2] +#define B_VAL(p) ((DATA8 *)(p))[3] + +#endif + #ifdef XCF_DBG #define D(s) \ { \ @@ -316,9 +331,12 @@ _clip(int *src_tl_x, int *src_tl_y, } void -combine_pixels_normal(DATA8 * src, int src_w, int src_h, DATA8 * dest, - int dest_w, int dest_h, int dest_x, int dest_y) +combine_pixels_normal(const DATA32 * src_, int src_w, int src_h, + DATA32 * dst_, int dest_w, int dest_h, + int dest_x, int dest_y) { + const DATA8 *src = (const DATA8 *)src_; + DATA8 *dest = (DATA8 *) dst_; int x, y, s_idx, d_idx; int src_tl_x = 0, src_tl_y = 0; int src_br_x = src_w, src_br_y = src_h; @@ -371,9 +389,12 @@ combine_pixels_normal(DATA8 * src, int src_w, int src_h, DATA8 * dest, } void -combine_pixels_add(DATA8 * src, int src_w, int src_h, DATA8 * dest, int dest_w, - int dest_h, int dest_x, int dest_y) +combine_pixels_add(const DATA32 * src_, int src_w, int src_h, + DATA32 * dst_, int dest_w, int dest_h, + int dest_x, int dest_y) { + const DATA8 *src = (const DATA8 *)src_; + DATA8 *dest = (DATA8 *) dst_; int x, y, s_idx, d_idx; int src_tl_x = 0, src_tl_y = 0; int src_br_x = src_w, src_br_y = src_h; @@ -403,9 +424,12 @@ combine_pixels_add(DATA8 * src, int src_w, int src_h, DATA8 * dest, int dest_w, } void -combine_pixels_sub(DATA8 * src, int src_w, int src_h, DATA8 * dest, int dest_w, - int dest_h, int dest_x, int dest_y) +combine_pixels_sub(const DATA32 * src_, int src_w, int src_h, + DATA32 * dst_, int dest_w, int dest_h, + int dest_x, int dest_y) { + const DATA8 *src = (const DATA8 *)src_; + DATA8 *dest = (DATA8 *) dst_; int x, y, s_idx, d_idx; int src_tl_x = 0, src_tl_y = 0; int src_br_x = src_w, src_br_y = src_h; @@ -435,9 +459,12 @@ combine_pixels_sub(DATA8 * src, int src_w, int src_h, DATA8 * dest, int dest_w, } void -combine_pixels_diff(DATA8 * src, int src_w, int src_h, DATA8 * dest, int dest_w, - int dest_h, int dest_x, int dest_y) +combine_pixels_diff(const DATA32 * src_, int src_w, int src_h, + DATA32 * dst_, int dest_w, int dest_h, + int dest_x, int dest_y) { + const DATA8 *src = (const DATA8 *)src_; + DATA8 *dest = (DATA8 *) dst_; int x, y, s_idx, d_idx; int src_tl_x = 0, src_tl_y = 0; int src_br_x = src_w, src_br_y = src_h; @@ -467,9 +494,12 @@ combine_pixels_diff(DATA8 * src, int src_w, int src_h, DATA8 * dest, int dest_w, } void -combine_pixels_darken(DATA8 * src, int src_w, int src_h, DATA8 * dest, - int dest_w, int dest_h, int dest_x, int dest_y) +combine_pixels_darken(const DATA32 * src_, int src_w, int src_h, + DATA32 * dst_, int dest_w, int dest_h, + int dest_x, int dest_y) { + const DATA8 *src = (const DATA8 *)src_; + DATA8 *dest = (DATA8 *) dst_; int x, y, s_idx, d_idx; int src_tl_x = 0, src_tl_y = 0; int src_br_x = src_w, src_br_y = src_h; @@ -493,9 +523,12 @@ combine_pixels_darken(DATA8 * src, int src_w, int src_h, DATA8 * dest, } void -combine_pixels_lighten(DATA8 * src, int src_w, int src_h, DATA8 * dest, - int dest_w, int dest_h, int dest_x, int dest_y) +combine_pixels_lighten(const DATA32 * src_, int src_w, int src_h, + DATA32 * dst_, int dest_w, int dest_h, + int dest_x, int dest_y) { + const DATA8 *src = (const DATA8 *)src_; + DATA8 *dest = (DATA8 *) dst_; int x, y, s_idx, d_idx; int src_tl_x = 0, src_tl_y = 0; int src_br_x = src_w, src_br_y = src_h; @@ -519,9 +552,12 @@ combine_pixels_lighten(DATA8 * src, int src_w, int src_h, DATA8 * dest, } void -combine_pixels_mult(DATA8 * src, int src_w, int src_h, DATA8 * dest, int dest_w, - int dest_h, int dest_x, int dest_y) +combine_pixels_mult(const DATA32 * src_, int src_w, int src_h, + DATA32 * dst_, int dest_w, int dest_h, + int dest_x, int dest_y) { + const DATA8 *src = (const DATA8 *)src_; + DATA8 *dest = (DATA8 *) dst_; int x, y, s_idx, d_idx; int src_tl_x = 0, src_tl_y = 0; int src_br_x = src_w, src_br_y = src_h; @@ -544,14 +580,17 @@ combine_pixels_mult(DATA8 * src, int src_w, int src_h, DATA8 * dest, int dest_w, AS = MIN(AS, AD); } - combine_pixels_normal(src, src_w, src_h, dest, dest_w, dest_h, dest_x, - dest_y); + combine_pixels_normal(src_, src_w, src_h, dst_, dest_w, dest_h, + dest_x, dest_y); } void -combine_pixels_div(DATA8 * src, int src_w, int src_h, DATA8 * dest, int dest_w, - int dest_h, int dest_x, int dest_y) +combine_pixels_div(const DATA32 * src_, int src_w, int src_h, + DATA32 * dst_, int dest_w, int dest_h, + int dest_x, int dest_y) { + const DATA8 *src = (const DATA8 *)src_; + DATA8 *dest = (DATA8 *) dst_; int x, y, s_idx, d_idx; int src_tl_x = 0, src_tl_y = 0; int src_br_x = src_w, src_br_y = src_h; @@ -573,14 +612,17 @@ combine_pixels_div(DATA8 * src, int src_w, int src_h, DATA8 * dest, int dest_w, AS = MIN(AD, AS); } - combine_pixels_normal(src, src_w, src_h, dest, dest_w, dest_h, dest_x, - dest_y); + combine_pixels_normal(src_, src_w, src_h, dst_, dest_w, dest_h, + dest_x, dest_y); } void -combine_pixels_screen(DATA8 * src, int src_w, int src_h, DATA8 * dest, - int dest_w, int dest_h, int dest_x, int dest_y) +combine_pixels_screen(const DATA32 * src_, int src_w, int src_h, + DATA32 * dst_, int dest_w, int dest_h, + int dest_x, int dest_y) { + const DATA8 *src = (const DATA8 *)src_; + DATA8 *dest = (DATA8 *) dst_; int x, y, s_idx, d_idx; int src_tl_x = 0, src_tl_y = 0; int src_br_x = src_w, src_br_y = src_h; @@ -604,9 +646,12 @@ combine_pixels_screen(DATA8 * src, int src_w, int src_h, DATA8 * dest, } void -combine_pixels_overlay(DATA8 * src, int src_w, int src_h, DATA8 * dest, - int dest_w, int dest_h, int dest_x, int dest_y) +combine_pixels_overlay(const DATA32 * src_, int src_w, int src_h, + DATA32 * dst_, int dest_w, int dest_h, + int dest_x, int dest_y) { + const DATA8 *src = (const DATA8 *)src_; + DATA8 *dest = (DATA8 *) dst_; int x, y, s_idx, d_idx; int src_tl_x = 0, src_tl_y = 0; int src_br_x = src_w, src_br_y = src_h; @@ -639,9 +684,12 @@ combine_pixels_overlay(DATA8 * src, int src_w, int src_h, DATA8 * dest, } static void -combine_pixels_hsv(DATA8 * src, int src_w, int src_h, DATA8 * dest, int dest_w, - int dest_h, int dest_x, int dest_y, int mode) +combine_pixels_hsv(const DATA32 * src_, int src_w, int src_h, + DATA32 * dst_, int dest_w, int dest_h, + int dest_x, int dest_y, int mode) { + const DATA8 *src = (const DATA8 *)src_; + DATA8 *dest = (DATA8 *) dst_; int x, y, s_idx, d_idx; int src_tl_x = 0, src_tl_y = 0; int src_br_x = src_w, src_br_y = src_h; @@ -680,33 +728,39 @@ combine_pixels_hsv(DATA8 * src, int src_w, int src_h, DATA8 * dest, int dest_w, } void -combine_pixels_hue(DATA8 * src, int src_w, int src_h, DATA8 * dest, int dest_w, - int dest_h, int dest_x, int dest_y) +combine_pixels_hue(const DATA32 * src, int src_w, int src_h, + DATA32 * dest, int dest_w, int dest_h, + int dest_x, int dest_y) { - combine_pixels_hsv(src, src_w, src_h, dest, dest_w, dest_h, dest_x, dest_y, - 0); + combine_pixels_hsv(src, src_w, src_h, dest, dest_w, dest_h, + dest_x, dest_y, 0); } void -combine_pixels_sat(DATA8 * src, int src_w, int src_h, DATA8 * dest, int dest_w, - int dest_h, int dest_x, int dest_y) +combine_pixels_sat(const DATA32 * src, int src_w, int src_h, + DATA32 * dest, int dest_w, int dest_h, + int dest_x, int dest_y) { - combine_pixels_hsv(src, src_w, src_h, dest, dest_w, dest_h, dest_x, dest_y, - 1); + combine_pixels_hsv(src, src_w, src_h, dest, dest_w, dest_h, + dest_x, dest_y, 1); } void -combine_pixels_val(DATA8 * src, int src_w, int src_h, DATA8 * dest, int dest_w, - int dest_h, int dest_x, int dest_y) +combine_pixels_val(const DATA32 * src, int src_w, int src_h, + DATA32 * dest, int dest_w, int dest_h, + int dest_x, int dest_y) { - combine_pixels_hsv(src, src_w, src_h, dest, dest_w, dest_h, dest_x, dest_y, - 2); + combine_pixels_hsv(src, src_w, src_h, dest, dest_w, dest_h, + dest_x, dest_y, 2); } void -combine_pixels_col(DATA8 * src, int src_w, int src_h, DATA8 * dest, int dest_w, - int dest_h, int dest_x, int dest_y) +combine_pixels_col(const DATA32 * src_, int src_w, int src_h, + DATA32 * dst_, int dest_w, int dest_h, + int dest_x, int dest_y) { + const DATA8 *src = (const DATA8 *)src_; + DATA8 *dest = (DATA8 *) dst_; int x, y, s_idx, d_idx; int src_tl_x = 0, src_tl_y = 0; int src_br_x = src_w, src_br_y = src_h; @@ -732,9 +786,12 @@ combine_pixels_col(DATA8 * src, int src_w, int src_h, DATA8 * dest, int dest_w, } void -combine_pixels_diss(DATA8 * src, int src_w, int src_h, DATA8 * dest, int dest_w, - int dest_h, int dest_x, int dest_y) +combine_pixels_diss(const DATA32 * src_, int src_w, int src_h, + DATA32 * dst_, int dest_w, int dest_h, + int dest_x, int dest_y) { + const DATA8 *src = (const DATA8 *)src_; + DATA8 *dest = (DATA8 *) dst_; int x, y, s_idx, d_idx; int src_tl_x = 0, src_tl_y = 0; int src_br_x = src_w, src_br_y = src_h; --