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