diff options
Diffstat (limited to '')
| -rw-r--r-- | libslim.h | 94 | 
1 files changed, 82 insertions, 12 deletions
@@ -1,7 +1,7 @@  /**   * ISC License   *  - * © 2019 Mattias Andrée <maandree@kth.se> + * © 2019 Mattias Andrée <m@maandree.se>   *    * Permission to use, copy, modify, and/or distribute this software for any   * purpose with or without fee is hereby granted, provided that the above @@ -85,7 +85,7 @@ LIBSLIM_DECLARE_FORMAT(rgb_ld, { long double r, g, b; });  	do {\  		size_t i__;\  		size_t n__ = (IN)->meta.width - 1;\ -		for (i__ = 0; i__ < n__; i__++)\ +		for (i__ = 0; i__ <= n__; i__++)\  			(OUT)->data[n__ - i__] = (IN)->data[i__];\  	} while (0) @@ -101,7 +101,7 @@ LIBSLIM_DECLARE_FORMAT(rgb_ld, { long double r, g, b; });  		(OUT)->meta.width = (IN)->meta.width;\  		(OUT)->meta.height = (IN)->meta.height;\  		while (h__--) {\ -			for (i__ = 0; i__ < n__; i__++)\ +			for (i__ = 0; i__ <= n__; i__++)\  				(OUT)->data[n__ - i__] = (IN)->data[i__];\  			(IN)->data += (IN)->meta.width + (IN)->meta.hblank;\  			(OUT)->data += (OUT)->meta.width + (OUT)->meta.hblank;\ @@ -115,13 +115,13 @@ LIBSLIM_DECLARE_FORMAT(rgb_ld, { long double r, g, b; });  #define libslim_flip(OUT, IN)\  	do {\  		size_t i__;\ -		size_t n__ = (IN)->meta.height - 1;\ +		size_t n__ = (IN)->meta.height;\  		size_t w__ = (IN)->meta.width * sizeof(*(IN)->data);\  		void *in__ = (IN)->data;\  		void *out__ = (OUT)->data;\  		(OUT)->meta.width = (IN)->meta.width;\  		(OUT)->meta.height = (IN)->meta.height;\ -		(OUT)->data += n__ * ((OUT)->meta.width + (OUT)->meta.hblank);\ +		(OUT)->data += (n__ - 1) * ((OUT)->meta.width + (OUT)->meta.hblank); \  		for (i__ = 0; i__ < n__; i__++) {\  			memcpy((OUT)->data, (IN)->data, w__);\  			(IN)->data += (IN)->meta.width + (IN)->meta.hblank;\ @@ -150,31 +150,101 @@ LIBSLIM_DECLARE_FORMAT(rgb_ld, { long double r, g, b; });  			(OUT)->data += 1;\  		}\  		(IN)->data = in__;\ -		(OUT)->data = in__;\ +		(OUT)->data = out__;\  	} while (0)  /* Rotate an image 90 degrees clockwise */  #define libslim_rotate_90(OUT, IN)\  	do {\ -		libslim_transpose((IN), (OUT));\ -		libslim_flop((IN), (OUT));\ +		/* equivalent to flip than transpose */\ +		size_t x__, y__, i__;\ +		size_t rw__ = (OUT)->meta.width + (OUT)->meta.hblank;\ +		size_t w__ = (IN)->meta.width;\ +		size_t h__ = (IN)->meta.height;\ +		void *in__ = (IN)->data;\ +		void *out__ = (OUT)->data;\ +		(OUT)->meta.width = (IN)->meta.height;\ +		(OUT)->meta.height = (IN)->meta.width;\ +		(IN)->data += (h__ - 1) * ((IN)->meta.width + (IN)->meta.hblank);\ +		for (y__ = 0; y__ < h__; y__++) {\ +			for (x__ = i__ = 0; x__ < w__; x__++, i__ += rw__)\ +				(OUT)->data[i__] = (IN)->data[x__];\ +			(IN)->data -= (IN)->meta.width + (IN)->meta.hblank;\ +			(OUT)->data += 1;\ +		}\ +		(IN)->data = in__;\ +		(OUT)->data = out__;\  	} while (0)  /* Rotate an image 180 degrees */  #define libslim_rotate_180(OUT, IN)\  	do {\ -		libslim_flip((IN), (OUT));\ -		libslim_flop((IN), (OUT));\ +		/* equivalent to flip and flop */\ +		size_t i__, j__;\ +		size_t n__ = (IN)->meta.height;\ +		size_t w__ = (IN)->meta.width - 1;\ +		void *in__ = (IN)->data;\ +		void *out__ = (OUT)->data;\ +		(OUT)->meta.width = (IN)->meta.width;\ +		(OUT)->meta.height = (IN)->meta.height;\ +		(OUT)->data += (n__ - 1) * ((OUT)->meta.width + (OUT)->meta.hblank);\ +		for (i__ = 0; i__ < n__; i__++) {\ +			for (j__ = 0; j__ <= w__; j__++)\ +				(OUT)->data[w__ - j__] = (IN)->data[j__];\ +			(IN)->data += (IN)->meta.width + (IN)->meta.hblank;\ +			(OUT)->data -= (OUT)->meta.width + (OUT)->meta.hblank;\ +		}\ +		(IN)->data = in__;\ +		(OUT)->data = out__;\  	} while (0)  /* Rotate an image 270 degrees clockwise */  #define libslim_rotate_270(OUT, IN)\  	do {\ -		libslim_flop((IN), (OUT));\ -		libslim_transpose((IN), (OUT));\ +		/* equivalent to transpose than flip */\ +		size_t x__, y__, i__;\ +		size_t rw__ = (OUT)->meta.width + (OUT)->meta.hblank;\ +		size_t w__ = (IN)->meta.width;\ +		size_t h__ = (IN)->meta.height;\ +		void *in__ = (IN)->data;\ +		void *out__ = (OUT)->data;\ +		(OUT)->meta.width = (IN)->meta.height;\ +		(OUT)->meta.height = (IN)->meta.width;\ +		for (y__ = 0; y__ < h__; y__++) {\ +			for (x__ = 0, i__ = rw__ * (w__ - 1); x__ < w__; x__++, i__ -= rw__) \ +				(OUT)->data[i__] = (IN)->data[x__];\ +			(IN)->data += (IN)->meta.width + (IN)->meta.hblank;\ +			(OUT)->data += 1;\ +		}\ +		(IN)->data = in__;\ +		(OUT)->data = out__;\ +	} while (0) + + +/* Transpose an image along instead of across the main diagonal */ +#define libslim_anti_transpose(OUT, IN)\ +	do {\ +		/* equivalent to flip than transpose than flip, or a tranpose and a 180 degree rotation */\ +		size_t x__, y__, i__;\ +		size_t rw__ = (OUT)->meta.width + (OUT)->meta.hblank;\ +		size_t w__ = (IN)->meta.width;\ +		size_t h__ = (IN)->meta.height;\ +		void *in__ = (IN)->data;\ +		void *out__ = (OUT)->data;\ +		(OUT)->meta.width = (IN)->meta.height;\ +		(OUT)->meta.height = (IN)->meta.width;\ +		(IN)->data += (h__ - 1) * ((IN)->meta.width + (IN)->meta.hblank);\ +		for (y__ = 0; y__ < h__; y__++) {\ +			for (x__ = 0, i__ = rw__ * (w__ - 1); x__ < w__; x__++, i__ -= rw__) \ +				(OUT)->data[i__] = (IN)->data[x__];\ +			(IN)->data -= (IN)->meta.width + (IN)->meta.hblank;\ +			(OUT)->data += 1;\ +		}\ +		(IN)->data = in__;\ +		(OUT)->data = out__;\  	} while (0)  | 
