gint/src/image/image_hflip.c

48 lines
1.5 KiB
C

#include <gint/image.h>
void image_hflip(image_t const *src, image_t *dst)
{
if(!image_target(src, dst, DATA_RW, SAME_DEPTH, SAME_SIZE))
return;
void *src_px = src->data;
void *dst_px = dst->data;
int src_alpha = image_alpha(src->format);
int dst_alpha = image_alpha(dst->format);
int h = src->height;
if(IMAGE_IS_RGB16(src->format)) {
while(h-- > 0) {
for(int x1 = 0; x1 < (src->width + 1) >> 1; x1++) {
int x2 = src->width - 1 - x1;
int px1 = ((uint16_t *)src_px)[x1];
int px2 = ((uint16_t *)src_px)[x2];
if(px1 != src_alpha)
((uint16_t *)dst_px)[x2] = px1 - (px1 == dst_alpha);
if(px2 != src_alpha)
((uint16_t *)dst_px)[x1] = px2 - (px2 == dst_alpha);
}
src_px += src->stride;
dst_px += dst->stride;
}
}
else if(IMAGE_IS_P8(src->format)) {
while(h-- > 0) {
for(int x1 = 0; x1 < (src->width + 1) >> 1; x1++) {
int x2 = src->width - 1 - x1;
int px1 = ((int8_t *)src_px)[x1];
int px2 = ((int8_t *)src_px)[x2];
if(px1 != src_alpha)
((int8_t *)dst_px)[x2] = px1;
if(px2 != src_alpha)
((int8_t *)dst_px)[x1] = px2;
}
src_px += src->stride;
dst_px += dst->stride;
}
}
}