kwo pushed a commit to branch master. http://git.enlightenment.org/legacy/imlib2.git/commit/?id=8e376b549f69ff360cc23ffcd7782a9fcce855de
commit 8e376b549f69ff360cc23ffcd7782a9fcce855de Author: Kim Woelders <[email protected]> Date: Sat Dec 14 16:34:12 2019 +0100 XPM loader: Major speedup for cpp > 2 --- src/modules/loaders/loader_xpm.c | 60 ++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/src/modules/loaders/loader_xpm.c b/src/modules/loaders/loader_xpm.c index 96fecc8..fc461bd 100644 --- a/src/modules/loaders/loader_xpm.c +++ b/src/modules/loaders/loader_xpm.c @@ -93,6 +93,40 @@ xpm_parse_done(void) rgb_txt = NULL; } +typedef struct { + char assigned; + unsigned char transp; + char str[6]; + DATA32 pixel; +} cmap_t; + +static int +xpm_cmap_sort(const void *a, const void *b) +{ + return strcmp(((const cmap_t *)a)->str, ((const cmap_t *)b)->str); +} + +static DATA32 +xpm_cmap_lookup(const cmap_t * cmap, int nc, int cpp, const char *s) +{ + int i, i1, i2, x; + + i1 = i = 0; + i2 = nc - 1; + while (i1 < i2) + { + i = (i1 + i2) / 2; + x = memcmp(s, cmap[i].str, cpp); + if (x == 0) + i1 = i2 = i; + else if (x < 0) + i2 = i - 1; + else + i1 = i + 1; + } + return cmap[i1].pixel; +} + char load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity, char immediate_load) @@ -104,12 +138,7 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity, int comment, transp, quote, context, len, done, backslash; char *line, s[256], tok[256], col[256]; int lsz = 256; - struct _cmap { - char assigned; - unsigned char transp; - char str[6]; - DATA32 pixel; - } *cmap; + cmap_t *cmap; short lookup[128 - 32][128 - 32]; float per = 0.0, per_inc = 0.0; int last_per = 0, last_y = 0; @@ -208,7 +237,7 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity, im->w = w; im->h = h; - cmap = calloc(ncolors, sizeof(struct _cmap)); + cmap = calloc(ncolors, sizeof(cmap_t)); if (!cmap) goto quit; @@ -319,10 +348,12 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity, if (cpp == 1) for (i = 0; i < ncolors; i++) lookup[(int)cmap[i].str[0] - 32][0] = i; - if (cpp == 2) + else if (cpp == 2) for (i = 0; i < ncolors; i++) lookup[(int)cmap[i].str[0] - 32][(int)cmap[i].str[1] - 32] = i; + else + qsort(cmap, ncolors, sizeof(cmap_t), xpm_cmap_sort); context++; } } @@ -350,19 +381,12 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity, } else { -#define CMn(_j) (&cmap[_j]) for (i = 0; count < pixels && i < len - (cpp - 1); i += cpp) { - for (j = 0; j < ncolors; j++) - { - if (memcmp(&line[i], cmap[j].str, cpp) == 0) - { - *ptr++ = CMn(j)->pixel; - count++; - break; - } - } + *ptr++ = + xpm_cmap_lookup(cmap, ncolors, cpp, &line[i]); + count++; } } per += per_inc; --
