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