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