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 
24 // Define the general macro
25 // src_read_macro = READxx
26 // dest_write_macro = WRITEyy
27 // src_byte_inc = xx/8
28 // dest_byte_inc = yy/8
29 // convert_rgb_macro = Macro to convert the RGB eg CONVERT_RGB
30 // dest_read_macro = 0 (Unused)
31 #define CG_STANDARD(src_read_macro, dest_write_macro, src_byte_inc, dest_byte_inc, convert_rgb_macro, dest_read_macro) \
32 	do { \
33 		count=iface->s_width; \
34 		do { \
35 			s_pixel = src_read_macro(source); \
36 			if (s_pixel != sc) \
37 			{ \
38 				dest_write_macro(dest, (convert_rgb_macro(s_pixel))); \
39 			} \
40 			source+=src_byte_inc; \
41 			dest+=dest_byte_inc; \
42 		} while(--count); \
43         	source+=iface->s_add; \
44         	dest+=iface->d_add; \
45         } while (--iface->s_height);
46 
47 // ***********************************************
48 // ******** The Stretch Conversion Macros ********
49 // ***********************************************
50 
51 #define CG_S_VARS() int32 s_pixel; \
52         unsigned int count; \
53         char8 *source=iface->s_pixels; \
54 	char8 *dest=iface->d_pixels; \
55         unsigned int dy=(iface->s_height<<16)/iface->d_height; \
56         unsigned int dx=(iface->s_width<<16)/iface->d_width; \
57         unsigned int y=0,x; \
58         int32 sc = iface->s_colorkey;
59 
60 // Define the general macro
61 // src_read_macro = READxx
62 // dest_write_macro = WRITEyy
63 // src_byte_inc = xx/8
64 // dest_byte_inc = yy/8
65 // convert_rgb_macro = Macro to convert the RGB eg CONVERT_RGB
66 // dest_read_macro = 0 (Unused)
67 #define CG_S_STANDARD(src_read_macro, dest_write_macro, src_byte_inc, dest_byte_inc, convert_rgb_macro, dest_read_macro) \
68 	do { \
69 		count=iface->d_width; \
70 		x = 0; \
71 		do { \
72 			s_pixel = src_read_macro(source + (x>>16)); \
73 			if (s_pixel != sc) \
74 			{ \
75 				dest_write_macro(dest, (convert_rgb_macro(s_pixel))); \
76 			} \
77 			x+=dx; \
78 			dest+=dest_byte_inc; \
79 		} while(--count); \
80         	dest+=iface->d_add; \
81         	y+=dy; \
82         	source+=(y>>16)*iface->s_pitch; \
83 	        y &= 0xffff; \
84         } while (--iface->d_height);
85 
86 // **************************************************
87 // ******** The Generic Conversion Functions ********
88 // **************************************************
89 
ConvertC_Generic32_C_Generic32_O_Blit(HermesConverterInterface * iface)90 void ConvertC_Generic32_C_Generic32_O_Blit(HermesConverterInterface *iface)
91 {
92   CG_IDENTICAL( READ32, WRITE32, 4, 0 )
93 }
94 
ConvertC_Generic32_C_Generic24_O_Blit(HermesConverterInterface * iface)95 void ConvertC_Generic32_C_Generic24_O_Blit(HermesConverterInterface *iface)
96 {
97   CG_NORMAL( READ32, WRITE24, 4, 3, 0 )
98 }
99 
ConvertC_Generic32_C_Generic16_O_Blit(HermesConverterInterface * iface)100 void ConvertC_Generic32_C_Generic16_O_Blit(HermesConverterInterface *iface)
101 {
102   CG_NORMAL( READ32, WRITE16, 4, 2, 0 )
103 }
104 
ConvertC_Generic32_C_Generic8_O_Blit(HermesConverterInterface * iface)105 void ConvertC_Generic32_C_Generic8_O_Blit(HermesConverterInterface *iface)
106 {
107   CG_NORMAL( READ32, WRITE8, 4, 1, 0 )
108 }
109 
ConvertC_Generic24_C_Generic32_O_Blit(HermesConverterInterface * iface)110 void ConvertC_Generic24_C_Generic32_O_Blit(HermesConverterInterface *iface)
111 {
112   CG_NORMAL( READ24, WRITE32, 3, 4, 0 )
113 }
114 
ConvertC_Generic24_C_Generic24_O_Blit(HermesConverterInterface * iface)115 void ConvertC_Generic24_C_Generic24_O_Blit(HermesConverterInterface *iface)
116 {
117   CG_IDENTICAL( READ24, WRITE24, 3, 0 )
118 }
119 
ConvertC_Generic24_C_Generic16_O_Blit(HermesConverterInterface * iface)120 void ConvertC_Generic24_C_Generic16_O_Blit(HermesConverterInterface *iface)
121 {
122   CG_NORMAL( READ24, WRITE16, 3, 2, 0 )
123 }
124 
ConvertC_Generic24_C_Generic8_O_Blit(HermesConverterInterface * iface)125 void ConvertC_Generic24_C_Generic8_O_Blit(HermesConverterInterface *iface)
126 {
127   CG_NORMAL( READ24, WRITE8, 3, 1, 0 )
128 }
129 
ConvertC_Generic16_C_Generic32_O_Blit(HermesConverterInterface * iface)130 void ConvertC_Generic16_C_Generic32_O_Blit(HermesConverterInterface *iface)
131 {
132   CG_NORMAL( READ16, WRITE32, 2, 4, 0 )
133 }
134 
ConvertC_Generic16_C_Generic24_O_Blit(HermesConverterInterface * iface)135 void ConvertC_Generic16_C_Generic24_O_Blit(HermesConverterInterface *iface)
136 {
137   CG_NORMAL( READ16, WRITE24, 2, 3, 0 )
138 }
139 
ConvertC_Generic16_C_Generic16_O_Blit(HermesConverterInterface * iface)140 void ConvertC_Generic16_C_Generic16_O_Blit(HermesConverterInterface *iface)
141 {
142   CG_IDENTICAL( READ16, WRITE16, 2, 0 )
143 }
144 
ConvertC_Generic16_C_Generic8_O_Blit(HermesConverterInterface * iface)145 void ConvertC_Generic16_C_Generic8_O_Blit(HermesConverterInterface *iface)
146 {
147   CG_NORMAL( READ16, WRITE8, 2, 1, 0 )
148 }
149 
150 // **************************************************
151 // ******** The Stretch Conversion Functions ********
152 // **************************************************
153 
ConvertC_Generic32_C_Generic32_O_S_Blit(HermesConverterInterface * iface)154 void ConvertC_Generic32_C_Generic32_O_S_Blit(HermesConverterInterface *iface)
155 {
156   CG_S_IDENTICAL( READ32, WRITE32, 4, 0 )
157 }
158 
ConvertC_Generic32_C_Generic24_O_S_Blit(HermesConverterInterface * iface)159 void ConvertC_Generic32_C_Generic24_O_S_Blit(HermesConverterInterface *iface)
160 {
161   CG_S_NORMAL( READ32, WRITE24, 4, 3, 0 )
162 }
163 
ConvertC_Generic32_C_Generic16_O_S_Blit(HermesConverterInterface * iface)164 void ConvertC_Generic32_C_Generic16_O_S_Blit(HermesConverterInterface *iface)
165 {
166   CG_S_NORMAL( READ32, WRITE16, 4, 2, 0 )
167 }
168 
ConvertC_Generic32_C_Generic8_O_S_Blit(HermesConverterInterface * iface)169 void ConvertC_Generic32_C_Generic8_O_S_Blit(HermesConverterInterface *iface)
170 {
171   CG_S_NORMAL( READ32, WRITE8, 4, 1, 0 )
172 }
173 
ConvertC_Generic24_C_Generic32_O_S_Blit(HermesConverterInterface * iface)174 void ConvertC_Generic24_C_Generic32_O_S_Blit(HermesConverterInterface *iface)
175 {
176   CG_S_NORMAL( READ24, WRITE32, 3, 4, 0 )
177 }
178 
ConvertC_Generic24_C_Generic24_O_S_Blit(HermesConverterInterface * iface)179 void ConvertC_Generic24_C_Generic24_O_S_Blit(HermesConverterInterface *iface)
180 {
181   CG_S_IDENTICAL( READ24, WRITE24, 3, 0 )
182 }
183 
ConvertC_Generic24_C_Generic16_O_S_Blit(HermesConverterInterface * iface)184 void ConvertC_Generic24_C_Generic16_O_S_Blit(HermesConverterInterface *iface)
185 {
186   CG_S_NORMAL( READ24, WRITE16, 3, 2, 0 )
187 }
188 
ConvertC_Generic24_C_Generic8_O_S_Blit(HermesConverterInterface * iface)189 void ConvertC_Generic24_C_Generic8_O_S_Blit(HermesConverterInterface *iface)
190 {
191   CG_S_NORMAL( READ24, WRITE8, 3, 1, 0 )
192 }
193 
ConvertC_Generic16_C_Generic32_O_S_Blit(HermesConverterInterface * iface)194 void ConvertC_Generic16_C_Generic32_O_S_Blit(HermesConverterInterface *iface)
195 {
196   CG_S_NORMAL( READ16, WRITE32, 2, 4, 0 )
197 }
198 
ConvertC_Generic16_C_Generic24_O_S_Blit(HermesConverterInterface * iface)199 void ConvertC_Generic16_C_Generic24_O_S_Blit(HermesConverterInterface *iface)
200 {
201   CG_S_NORMAL( READ16, WRITE24, 2, 3, 0 )
202 }
203 
ConvertC_Generic16_C_Generic16_O_S_Blit(HermesConverterInterface * iface)204 void ConvertC_Generic16_C_Generic16_O_S_Blit(HermesConverterInterface *iface)
205 {
206   CG_S_IDENTICAL( READ16, WRITE16, 2, 0 )
207 }
208 
ConvertC_Generic16_C_Generic8_O_S_Blit(HermesConverterInterface * iface)209 void ConvertC_Generic16_C_Generic8_O_S_Blit(HermesConverterInterface *iface)
210 {
211   CG_S_NORMAL( READ16, WRITE8, 2, 1, 0 )
212 }
213 
214 
215