1 #include "img_conv.h"
2
3 #ifdef __cplusplus
4 extern "C" {
5 #endif
6
7 static struct valid_image_type {
8 int type;
9 int newtype;
10 void *from_proc;
11 void *to_proc;
12 } valid_image_types[] =
13 {
14 { imbpp24 | imColor | imfmtBGR, imRGB, (void*)cm_reverse_palette, (void*)cm_reverse_palette},
15 { imbpp32 | imColor | imfmtRGBI, imRGB, (void*)bc_rgbi_rgb, (void*)bc_rgb_rgbi },
16 { imbpp32 | imColor | imfmtIRGB, imRGB, (void*)bc_irgb_rgb, (void*)bc_rgb_irgb },
17 { imbpp32 | imColor | imfmtBGRI, imRGB, (void*)bc_bgri_rgb, (void*)bc_rgb_bgri },
18 { imbpp32 | imColor | imfmtIBGR, imRGB, (void*)bc_ibgr_rgb, (void*)bc_rgb_ibgr },
19 };
20
21 Bool
itype_importable(int type,int * newtype,void ** from_proc,void ** to_proc)22 itype_importable( int type, int *newtype, void **from_proc, void **to_proc)
23 {
24 int i;
25
26 for (i=0; i < sizeof(valid_image_types)/sizeof(struct valid_image_type); i++)
27 if ( valid_image_types[i]. type == type) {
28 if (newtype) *newtype = valid_image_types[i]. newtype;
29 if (from_proc) *from_proc = valid_image_types[i]. from_proc;
30 if (to_proc) *to_proc = valid_image_types[i]. to_proc;
31 return true;
32 }
33 return false;
34 }
35
36
37 static void
memcpy_bitconvproc(Byte * src,Byte * dest,int count)38 memcpy_bitconvproc( Byte * src, Byte * dest, int count)
39 {
40 memcpy( dest, src, count);
41 }
42
43
44 void
ibc_repad(Byte * source,Byte * dest,int srcLineSize,int dstLineSize,int srcDataSize,int dstDataSize,int srcBpp,int dstBpp,void * convProc,Bool reverse)45 ibc_repad( Byte * source, Byte * dest, int srcLineSize, int dstLineSize, int srcDataSize, int dstDataSize, int srcBpp, int dstBpp, void * convProc, Bool reverse)
46 {
47 int sb = srcLineSize / srcBpp;
48 int db = dstLineSize / dstBpp;
49 int bsc = sb > db ? db : sb;
50 int sh = srcDataSize / srcLineSize;
51 int dh = dstDataSize / dstLineSize;
52 int h = sh > dh ? dh : sh;
53
54 if ( convProc == NULL) {
55 convProc = (void*)memcpy_bitconvproc;
56 srcBpp = dstBpp = 1;
57 sb = srcLineSize;
58 db = dstLineSize;
59 bsc = sb > db ? db : sb;
60 }
61
62 if ( reverse) {
63 dest += dstLineSize * ( h - 1);
64 for ( ; h > 0; h--, source += srcLineSize, dest -= dstLineSize)
65 (( PSimpleConvProc) convProc)( source, dest, bsc);
66 } else {
67 for ( ; h > 0; h--, source += srcLineSize, dest += dstLineSize)
68 (( PSimpleConvProc) convProc)( source, dest, bsc);
69 }
70
71 sb = srcDataSize % srcLineSize / srcBpp;
72 db = dstDataSize % dstLineSize / dstBpp;
73 (( PSimpleConvProc) convProc)( source, dest, sb > db ? db : sb);
74 }
75
76 void
bc_rgb_rgbi(register Byte * source,register Byte * dest,register int count)77 bc_rgb_rgbi( register Byte * source, register Byte * dest, register int count)
78 {
79 dest += count * 4 - 1;
80 source += count * 3 - 1;
81 while ( count--)
82 {
83 *dest-- = 0;
84 *dest-- = *source--;
85 *dest-- = *source--;
86 *dest-- = *source--;
87 }
88 }
89
90 void
bc_rgbi_rgb(register Byte * source,register Byte * dest,register int count)91 bc_rgbi_rgb( register Byte * source, register Byte * dest, register int count)
92 {
93 while ( count--)
94 {
95 *dest++ = *source++;
96 *dest++ = *source++;
97 *dest++ = *source++;
98 source++;
99 }
100 }
101
102
103 void
bc_rgb_irgb(register Byte * source,register Byte * dest,register int count)104 bc_rgb_irgb( register Byte * source, register Byte * dest, register int count)
105 {
106 dest += count * 4 - 1;
107 source += count * 3 - 1;
108 while ( count--)
109 {
110 *dest-- = *source--;
111 *dest-- = *source--;
112 *dest-- = *source--;
113 *dest-- = 0;
114 }
115 }
116
117 void
bc_irgb_rgb(register Byte * source,register Byte * dest,register int count)118 bc_irgb_rgb( register Byte * source, register Byte * dest, register int count)
119 {
120 while ( count--)
121 {
122 source++;
123 *dest++ = *source++;
124 *dest++ = *source++;
125 *dest++ = *source++;
126 }
127 }
128
129 void
bc_bgri_rgb(register Byte * source,register Byte * dest,register int count)130 bc_bgri_rgb( register Byte * source, register Byte * dest, register int count)
131 {
132 while ( count--)
133 {
134 register Byte a, b;
135 a = *source++;
136 b = *source++;
137 *dest++ = *source++;
138 *dest++ = b;
139 *dest++ = a;
140 source++;
141 }
142 }
143
144 void
bc_rgb_bgri(register Byte * source,register Byte * dest,register int count)145 bc_rgb_bgri( register Byte * source, register Byte * dest, register int count)
146 {
147 dest += count * 4 - 1;
148 source += count * 3 - 1;
149 while ( count--)
150 {
151 register Byte a = *source--;
152 register Byte b = *source--;
153 *dest-- = 0;
154 *dest-- = *source--;
155 *dest-- = b;
156 *dest-- = a;
157 }
158 }
159
160 void
bc_ibgr_rgb(register Byte * source,register Byte * dest,register int count)161 bc_ibgr_rgb( register Byte * source, register Byte * dest, register int count)
162 {
163 while ( count--)
164 {
165 register Byte a, b;
166 source++;
167 a = *source++;
168 b = *source++;
169 *dest++ = *source++;
170 *dest++ = b;
171 *dest++ = a;
172 }
173 }
174
175 void
bc_rgb_ibgr(register Byte * source,register Byte * dest,register int count)176 bc_rgb_ibgr( register Byte * source, register Byte * dest, register int count)
177 {
178 dest += count * 4 - 1;
179 source += count * 3 - 1;
180 while ( count--)
181 {
182 register Byte a = *source--;
183 register Byte b = *source--;
184 *dest-- = *source--;
185 *dest-- = b;
186 *dest-- = a;
187 *dest-- = 0;
188 }
189 }
190
191
192
193 #ifdef __cplusplus
194 }
195 #endif
196
197