kwo pushed a commit to branch master. http://git.enlightenment.org/legacy/imlib2.git/commit/?id=0d0a701a96bf87a5df95fd8bb599b414b6a6a220
commit 0d0a701a96bf87a5df95fd8bb599b414b6a6a220 Author: Kim Woelders <[email protected]> Date: Sat Nov 16 08:29:12 2019 +0100 TGA loader: Support horiontal flip --- src/modules/loaders/loader_tga.c | 53 +++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/src/modules/loaders/loader_tga.c b/src/modules/loaders/loader_tga.c index 7516e5b..053c695 100644 --- a/src/modules/loaders/loader_tga.c +++ b/src/modules/loaders/loader_tga.c @@ -17,7 +17,7 @@ #include "blend.h" /* flip an inverted image - see RLE reading below */ -static void tgaflip(DATA32 * in, int w, int h); +static void tgaflip(DATA32 * in, int w, int h, int fliph, int flipv); /* TGA pixel formats */ #define TGA_TYPE_MAPPED 1 @@ -188,7 +188,7 @@ load(ImlibImage * im, ImlibProgressFunction progress, tga_header *header; tga_footer *footer; int footer_present; - int rle, bpp, hasa, vinverted; + int rle, bpp, hasa, fliph, flipv; unsigned long datasize; unsigned char *bufptr, *bufend, *palette = 0; DATA32 *dataptr; @@ -234,8 +234,10 @@ load(ImlibImage * im, ImlibProgressFunction progress, /* now parse the header */ - /* this flag indicated bottom-up pixel storage */ - vinverted = !(header->descriptor & TGA_DESC_VERTICAL); + /* this flag indicates right-to-left pixel storage */ + fliph = !!(header->descriptor & TGA_DESC_HORIZONTAL); + /* this flag indicates bottom-up pixel storage */ + flipv = !(header->descriptor & TGA_DESC_VERTICAL); rle = 0; /* RLE compressed */ @@ -336,7 +338,7 @@ load(ImlibImage * im, ImlibProgressFunction progress, for (y = 0; y < im->h; y++) /* for each row */ { /* point dataptr at the beginning of the row */ - if (vinverted) + if (flipv) /* some TGA's are stored upside-down! */ dataptr = im->data + ((im->h - y - 1) * im->w); else @@ -386,6 +388,9 @@ load(ImlibImage * im, ImlibProgressFunction progress, } /* end for (each pixel) */ } + + if (fliph) + tgaflip(im->data, im->w, im->h, fliph, 0); } else { @@ -493,9 +498,8 @@ load(ImlibImage * im, ImlibProgressFunction progress, } /* end if (raw packet) */ } /* end for (each packet) */ - /* must now flip a bottom-up image */ - if (vinverted) - tgaflip(im->data, im->w, im->h); + if (fliph || flipv) + tgaflip(im->data, im->w, im->h, fliph, flipv); } if (progress) @@ -529,28 +533,27 @@ formats(ImlibLoader * l) /**********************/ -/* flip a DATA32 image block vertically in place */ - -static void -tgaflip(DATA32 * in, int w, int h) +/* flip a DATA32 image block in place */ +void +tgaflip(DATA32 * in, int w, int h, int fliph, int flipv) { - DATA32 *adv, *adv2; - int x, y; + DATA32 tmp; + int x, y, x2, y2, dx, dy, nx, ny; - adv = in; - adv2 = in + (w * (h - 1)); + dx = fliph ? -1 : 1; + dy = flipv ? -1 : 1; + nx = fliph ? w / 2 : w; + ny = flipv && !fliph ? h / 2 : h; - for (y = 0; y < (h / 2); y++) + y2 = flipv ? h - 1 : 0; + for (y = 0; y < ny; y++, y2 += dy) { - DATA32 tmp; - - for (x = 0; x < w; x++) + x2 = fliph ? w - 1 : 0; + for (x = 0; x < nx; x++, x2 += dx) { - tmp = adv[x]; - adv[x] = adv2[x]; - adv2[x] = tmp; + tmp = in[y * h + x]; + in[y * h + x] = in[y2 * h + x2]; + in[y2 * h + x2] = tmp; } - adv2 -= w; - adv += w; } } --
