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