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