1 /*
2    Generic format conversion routines for the HERMES library
3    Copyright (c) 1998 Christian Nentwich (c.nentwich@cs.ucl.ac.uk)
4    This source code is licensed under the GNU LGPL
5 
6    Please refer to the file COPYING.LIB contained in the distribution for
7    licensing conditions
8 */
9 
10 #include "HermConf.h"
11 #include "HeadC.h"
12 #include "Debug.h"
13 
14 // ***********************************************
15 // ******** The Generic Conversion Macros ********
16 // ***********************************************
17 
18 #define CG_VARS() int32 s_pixel; \
19         unsigned int count; \
20         char8 *source=iface->s_pixels; \
21 	char8 *dest=iface->d_pixels; \
22 	int32 sc = iface->s_colorkey; \
23 	int32 dc = iface->d_colorkey;
24 
25 // Define the general macro
26 // src_read_macro = READxx
27 // dest_write_macro = WRITEyy
28 // src_byte_inc = xx/8
29 // dest_byte_inc = yy/8
30 // convert_rgb_macro = Macro to convert the RGB eg CONVERT_RGB
31 // dest_read_macro = 0 (Unused)
32 #define CG_STANDARD(src_read_macro, dest_write_macro, src_byte_inc, dest_byte_inc, convert_rgb_macro, dest_read_macro) \
33 	do { \
34 		count=iface->s_width; \
35 		do { \
36 			s_pixel = src_read_macro(source); \
37 			if (s_pixel == sc) \
38 			{ \
39 				dest_write_macro(dest, dc); \
40 			}else \
41 			{ \
42 				dest_write_macro(dest, (convert_rgb_macro(s_pixel))); \
43 			} \
44 			source+=src_byte_inc; \
45 			dest+=dest_byte_inc; \
46 		} while(--count); \
47         	source+=iface->s_add; \
48         	dest+=iface->d_add; \
49         } while (--iface->s_height);
50 
51 // ***********************************************
52 // ******** The Stretch Conversion Macros ********
53 // ***********************************************
54 
55 #define CG_S_VARS() int32 s_pixel; \
56         unsigned int count; \
57         char8 *source=iface->s_pixels; \
58 	char8 *dest=iface->d_pixels; \
59         unsigned int dy=(iface->s_height<<16)/iface->d_height; \
60         unsigned int dx=(iface->s_width<<16)/iface->d_width; \
61         unsigned int y=0,x; \
62 	int32 sc = iface->s_colorkey; \
63 	int32 dc = iface->d_colorkey;
64 
65 // Define the general macro
66 // src_read_macro = READxx
67 // dest_write_macro = WRITEyy
68 // src_byte_inc = xx/8
69 // dest_byte_inc = yy/8
70 // convert_rgb_macro = Macro to convert the RGB eg CONVERT_RGB
71 // dest_read_macro = 0 (Unused)
72 #define CG_S_STANDARD(src_read_macro, dest_write_macro, src_byte_inc, dest_byte_inc, convert_rgb_macro, dest_read_macro) \
73 	do { \
74 		count=iface->d_width; \
75 		x = 0; \
76 		do { \
77 			s_pixel = src_read_macro(source + (x>>16)); \
78 			if (s_pixel == sc) \
79 			{ \
80 				dest_write_macro(dest, dc); \
81 			}else \
82 			{ \
83 				dest_write_macro(dest, (convert_rgb_macro(s_pixel))); \
84 			} \
85 			x+=dx; \
86 			dest+=dest_byte_inc; \
87 		} while(--count); \
88         	dest+=iface->d_add; \
89         	y+=dy; \
90         	source+=(y>>16)*iface->s_pitch; \
91 	        y &= 0xffff; \
92         } while (--iface->d_height);
93 
94 // **************************************************
95 // ******** The Generic Conversion Functions ********
96 // **************************************************
97 
ConvertC_Generic32_C_Generic32_C(HermesConverterInterface * iface)98 void ConvertC_Generic32_C_Generic32_C(HermesConverterInterface *iface)
99 {
100   CG_IDENTICAL( READ32, WRITE32, 4, 0 )
101 }
102 
ConvertC_Generic32_C_Generic24_C(HermesConverterInterface * iface)103 void ConvertC_Generic32_C_Generic24_C(HermesConverterInterface *iface)
104 {
105   CG_NORMAL( READ32, WRITE24, 4, 3, 0 )
106 }
107 
ConvertC_Generic32_C_Generic16_C(HermesConverterInterface * iface)108 void ConvertC_Generic32_C_Generic16_C(HermesConverterInterface *iface)
109 {
110   CG_NORMAL( READ32, WRITE16, 4, 2, 0 )
111 }
112 
ConvertC_Generic32_C_Generic8_C(HermesConverterInterface * iface)113 void ConvertC_Generic32_C_Generic8_C(HermesConverterInterface *iface)
114 {
115   CG_NORMAL( READ32, WRITE8, 4, 1, 0 )
116 }
117 
ConvertC_Generic24_C_Generic32_C(HermesConverterInterface * iface)118 void ConvertC_Generic24_C_Generic32_C(HermesConverterInterface *iface)
119 {
120   CG_NORMAL( READ24, WRITE32, 3, 4, 0 )
121 }
122 
ConvertC_Generic24_C_Generic24_C(HermesConverterInterface * iface)123 void ConvertC_Generic24_C_Generic24_C(HermesConverterInterface *iface)
124 {
125   CG_IDENTICAL( READ24, WRITE24, 3, 0 )
126 }
127 
ConvertC_Generic24_C_Generic16_C(HermesConverterInterface * iface)128 void ConvertC_Generic24_C_Generic16_C(HermesConverterInterface *iface)
129 {
130   CG_NORMAL( READ24, WRITE16, 3, 2, 0 )
131 }
132 
ConvertC_Generic24_C_Generic8_C(HermesConverterInterface * iface)133 void ConvertC_Generic24_C_Generic8_C(HermesConverterInterface *iface)
134 {
135   CG_NORMAL( READ24, WRITE8, 3, 1, 0 )
136 }
137 
ConvertC_Generic16_C_Generic32_C(HermesConverterInterface * iface)138 void ConvertC_Generic16_C_Generic32_C(HermesConverterInterface *iface)
139 {
140   CG_NORMAL( READ16, WRITE32, 2, 4, 0 )
141 }
142 
ConvertC_Generic16_C_Generic24_C(HermesConverterInterface * iface)143 void ConvertC_Generic16_C_Generic24_C(HermesConverterInterface *iface)
144 {
145   CG_NORMAL( READ16, WRITE24, 2, 3, 0 )
146 }
147 
ConvertC_Generic16_C_Generic16_C(HermesConverterInterface * iface)148 void ConvertC_Generic16_C_Generic16_C(HermesConverterInterface *iface)
149 {
150   CG_IDENTICAL( READ16, WRITE16, 2, 0 )
151 }
152 
ConvertC_Generic16_C_Generic8_C(HermesConverterInterface * iface)153 void ConvertC_Generic16_C_Generic8_C(HermesConverterInterface *iface)
154 {
155   CG_NORMAL( READ16, WRITE8, 2, 1, 0 )
156 }
157 
158 // **************************************************
159 // ******** The Stretch Conversion Functions ********
160 // **************************************************
161 
ConvertC_Generic32_C_Generic32_C_S(HermesConverterInterface * iface)162 void ConvertC_Generic32_C_Generic32_C_S(HermesConverterInterface *iface)
163 {
164   CG_S_IDENTICAL( READ32, WRITE32, 4, 0 )
165 }
166 
ConvertC_Generic32_C_Generic24_C_S(HermesConverterInterface * iface)167 void ConvertC_Generic32_C_Generic24_C_S(HermesConverterInterface *iface)
168 {
169   CG_S_NORMAL( READ32, WRITE24, 4, 3, 0 )
170 }
171 
ConvertC_Generic32_C_Generic16_C_S(HermesConverterInterface * iface)172 void ConvertC_Generic32_C_Generic16_C_S(HermesConverterInterface *iface)
173 {
174   CG_S_NORMAL( READ32, WRITE16, 4, 2, 0 )
175 }
176 
ConvertC_Generic32_C_Generic8_C_S(HermesConverterInterface * iface)177 void ConvertC_Generic32_C_Generic8_C_S(HermesConverterInterface *iface)
178 {
179   CG_S_NORMAL( READ32, WRITE8, 4, 1, 0 )
180 }
181 
ConvertC_Generic24_C_Generic32_C_S(HermesConverterInterface * iface)182 void ConvertC_Generic24_C_Generic32_C_S(HermesConverterInterface *iface)
183 {
184   CG_S_NORMAL( READ24, WRITE32, 3, 4, 0 )
185 }
186 
ConvertC_Generic24_C_Generic24_C_S(HermesConverterInterface * iface)187 void ConvertC_Generic24_C_Generic24_C_S(HermesConverterInterface *iface)
188 {
189   CG_S_IDENTICAL( READ24, WRITE24, 3, 0 )
190 }
191 
ConvertC_Generic24_C_Generic16_C_S(HermesConverterInterface * iface)192 void ConvertC_Generic24_C_Generic16_C_S(HermesConverterInterface *iface)
193 {
194   CG_S_NORMAL( READ24, WRITE16, 3, 2, 0 )
195 }
196 
ConvertC_Generic24_C_Generic8_C_S(HermesConverterInterface * iface)197 void ConvertC_Generic24_C_Generic8_C_S(HermesConverterInterface *iface)
198 {
199   CG_S_NORMAL( READ24, WRITE8, 3, 1, 0 )
200 }
201 
ConvertC_Generic16_C_Generic32_C_S(HermesConverterInterface * iface)202 void ConvertC_Generic16_C_Generic32_C_S(HermesConverterInterface *iface)
203 {
204   CG_S_NORMAL( READ16, WRITE32, 2, 4, 0 )
205 }
206 
ConvertC_Generic16_C_Generic24_C_S(HermesConverterInterface * iface)207 void ConvertC_Generic16_C_Generic24_C_S(HermesConverterInterface *iface)
208 {
209   CG_S_NORMAL( READ16, WRITE24, 2, 3, 0 )
210 }
211 
ConvertC_Generic16_C_Generic16_C_S(HermesConverterInterface * iface)212 void ConvertC_Generic16_C_Generic16_C_S(HermesConverterInterface *iface)
213 {
214   CG_S_IDENTICAL( READ16, WRITE16, 2, 0 )
215 }
216 
ConvertC_Generic16_C_Generic8_C_S(HermesConverterInterface * iface)217 void ConvertC_Generic16_C_Generic8_C_S(HermesConverterInterface *iface)
218 {
219   CG_S_NORMAL( READ16, WRITE8, 2, 1, 0 )
220 }
221