Import the current wip animation datatype and subclasses. further development will...
[AROS.git] / workbench / classes / datatypes / mpegvideo / mpegordered.c
blob4b734c31575c6decd9c72ea309ad4458a89b18ad
2 /*
3 **
4 ** $VER: mpegordered.c 1.8 (3.5.97)
5 ** mpegvideo.datatype 1.8
6 **
7 ** This file contains C code to implement an
8 ** ordered dither.
9 **
10 ** Written 1996/1997 by Roland 'Gizzy' Mainz
14 /* project includes */
15 #include "mpegvideo.h"
16 #include "mpegproto.h"
20 *--------------------------------------------------------------
22 * InitOrderedDither--
24 * Structures intialized for ordered dithering.
26 * Results:
27 * None.
29 * Side effects:
30 * None.
32 *--------------------------------------------------------------
36 void InitOrderedDither( struct MPEGVideoInstData *mvid )
38 long i,
41 err_range,
42 threshval;
43 ULONG *lmark,
44 *cmark;
46 for( i = 0 ; i < DITH_SIZE ; i++ )
48 lmark = l_darrays[ i ] = (ULONG *)mymalloc( mvid, (256 * sizeof( ULONG )) );
50 for( j = 0 ; j < lum_values[ 0 ] ; j++)
52 *lmark++ = 0;
55 for( j = 0 ; j < (LUM_RANGE - 1) ; j++ )
57 err_range = lum_values[ j + 1 ] - lum_values[ j ];
58 threshval = ((i * err_range) / DITH_SIZE) + lum_values[ j ];
60 for( k = lum_values[ j ] ; k < lum_values[ j + 1 ] ; k++ )
62 if( k > threshval )
63 *lmark++ = ((j + 1) * (CR_RANGE * CB_RANGE));
64 else
65 *lmark++ = (j * (CR_RANGE * CB_RANGE));
69 for( j = lum_values[ LUM_RANGE - 1 ] ; j < 256 ; j++ )
71 *lmark++ = (LUM_RANGE - 1) * (CR_RANGE * CB_RANGE);
75 for( i = 0 ; i < DITH_SIZE ; i++ )
77 cmark = cr_darrays[ i ] = (ULONG *)mymalloc( mvid, (256 * sizeof( ULONG )) );
79 for( j = 0 ; j < cr_values[ 0 ] ; j++ )
81 *cmark++ = 0;
84 for( j = 0 ; j < (CR_RANGE - 1) ; j++ )
86 err_range = cr_values[ j + 1 ] - cr_values[ j ];
87 threshval = ((i * err_range) / DITH_SIZE) + cr_values[ j ];
89 for( k = cr_values[ j ] ; k < cr_values[ j + 1 ] ; k++ )
91 if( k > threshval )
92 *cmark++ = ((j + 1) * CB_RANGE);
93 else
94 *cmark++ = (j * CB_RANGE);
98 for( j = cr_values[ CR_RANGE - 1 ] ; j < 256 ; j++ )
100 *cmark++ = (CR_RANGE - 1) * (CB_RANGE);
104 for( i = 0 ; i < DITH_SIZE ; i++ )
106 cmark = cb_darrays[ i ] = (ULONG *)mymalloc( mvid, (256 * sizeof( ULONG )) );
108 for( j = 0 ; j < cb_values[ 0 ] ; j++ )
110 *cmark++ = 0;
113 for( j = 0 ; j < (CB_RANGE - 1) ; j++ )
115 err_range = cb_values[ j + 1 ] - cb_values[ j ];
116 threshval = ((i * err_range) / DITH_SIZE) + cb_values[ j ];
118 for( k = cb_values[ j ] ; k < cb_values[ j + 1 ] ; k++ )
120 if( k > threshval )
121 *cmark++ = j+1;
122 else
123 *cmark++ = j;
127 for( j = cb_values[ CB_RANGE - 1 ] ; j < 256 ; j++ )
129 *cmark++ = CB_RANGE - 1;
136 *--------------------------------------------------------------
138 * OrderedDitherImage --
140 * Dithers an image using an ordered dither.
141 * Assumptions made:
142 * 1) The color space is allocated y:cr:cb = 8:4:4
143 * 2) The spatial resolution of y:cr:cb is 4:1:1
144 * The channels are dithered based on the standard
145 * ordered dither pattern for a 4x4 area.
147 * Results:
148 * None.
150 * Side effects:
151 * None.
153 *--------------------------------------------------------------
157 void OrderedDitherImage( struct MPEGVideoInstData *mvid, UBYTE *lum, UBYTE *cr, UBYTE *cb, UBYTE *out, UWORD h, UWORD w )
159 UBYTE *l, *r, *b, *o1, *o2;
160 UBYTE *l2;
161 UBYTE L, R, B;
162 UWORD i,
165 l = lum;
166 l2 = lum + w;
167 r = cr;
168 b = cb;
169 o1 = out;
170 o2 = out + w;
172 for( i = 0U ; i < h ; i += 4U )
174 for( j = 0U ; j < w ; j += 8U )
176 R = r[ 0 ]; B = b[ 0 ];
178 L = l[ 0 ]; o1[ 0 ] = mappixel[ (l_darrays[ 0 ][ L ] + cr_darrays[ 0 ][ R ] + cb_darrays[ 0 ][ B ]) ];
179 L = l[ 1 ]; o1[ 1 ] = mappixel[ (l_darrays[ 8 ][ L ] + cr_darrays[ 8 ][ R ] + cb_darrays[ 8 ][ B ]) ];
180 L = l2[ 0 ]; o2[ 0 ] = mappixel[ (l_darrays[ 12 ][ L ] + cr_darrays[ 12 ][ R ] + cb_darrays[ 12 ][ B ]) ];
181 L = l2[ 1 ]; o2[ 1 ] = mappixel[ (l_darrays[ 4 ][ L ] + cr_darrays[ 4 ][ R ] + cb_darrays[ 4 ][ B ]) ];
183 R = r[ 1 ]; B = b[ 1 ];
185 L = l[ 2 ]; o1[ 2 ] = mappixel[ (l_darrays[ 2 ][ L ] + cr_darrays[ 2 ][ R ] + cb_darrays[ 2 ][ B ]) ];
186 L = l[ 3 ]; o1[ 3 ] = mappixel[ (l_darrays[ 10 ][ L ] + cr_darrays[ 10 ][ R ] + cb_darrays[ 10 ][ B ]) ];
187 L = l2[ 2 ]; o2[ 2 ] = mappixel[ (l_darrays[ 14 ][ L ] + cr_darrays[ 14 ][ R ] + cb_darrays[ 14 ][ B ]) ];
188 L = l2[ 3 ]; o2[ 3 ] = mappixel[ (l_darrays[ 6 ][ L ] + cr_darrays[ 6 ][ R ] + cb_darrays[ 6 ][ B ]) ];
190 R = r[ 2 ]; B = b[ 2 ];
192 L = l[ 4 ]; o1[ 4 ] = mappixel[ (l_darrays[ 0 ][ L ] + cr_darrays[ 0 ][ R ] + cb_darrays[ 0 ][ B ]) ];
193 L = l[ 5 ]; o1[ 5 ] = mappixel[ (l_darrays[ 8 ][ L ] + cr_darrays[ 8 ][ R ] + cb_darrays[ 8 ][ B ]) ];
194 L = l2[ 4 ]; o2[ 4 ] = mappixel[ (l_darrays[ 12 ][ L ] + cr_darrays[ 12 ][ R ] + cb_darrays[ 12 ][ B ]) ];
195 L = l2[ 5 ]; o2[ 5 ] = mappixel[ (l_darrays[ 4 ][ L ] + cr_darrays[ 4 ][ R ] + cb_darrays[ 4 ][ B ]) ];
197 R = r[ 3 ]; B = b[ 3 ];
199 L = l[ 6 ]; o1[ 6 ] = mappixel[ (l_darrays[ 2 ][ L ] + cr_darrays[ 2 ][ R ] + cb_darrays[ 2 ][ B ]) ];
200 L = l[ 7 ]; o1[ 7 ] = mappixel[ (l_darrays[ 10 ][ L ] + cr_darrays[ 10 ][ R ] + cb_darrays[ 10 ][ B ]) ];
201 L = l2[ 6 ]; o2[ 6 ] = mappixel[ (l_darrays[ 14 ][ L ] + cr_darrays[ 14 ][ R ] + cb_darrays[ 14 ][ B ]) ];
202 L = l2[ 7 ]; o2[ 7 ] = mappixel[ (l_darrays[ 6 ][ L ] + cr_darrays[ 6 ][ R ] + cb_darrays[ 6 ][ B ]) ];
204 l += 8;
205 l2 += 8;
206 r += 4;
207 b += 4;
208 o1 += 8;
209 o2 += 8;
212 l += w; l2 += w;
213 o1 += w; o2 += w;
215 for( j = 0 ; j < w ; j += 8 )
217 R = r[ 0 ]; B = b[ 0 ];
219 L = l[ 0 ]; o1[ 0 ] = mappixel[ (l_darrays[ 3 ][ L ] + cr_darrays[ 3 ][ R ] + cb_darrays[ 3 ][ B ]) ];
220 L = l[ 1 ]; o1[ 1 ] = mappixel[ (l_darrays[ 11 ][ L ] + cr_darrays[ 11 ][ R ] + cb_darrays[ 11 ][ B ]) ];
221 L = l2[ 0 ]; o2[ 0 ] = mappixel[ (l_darrays[ 15 ][ L ] + cr_darrays[ 15 ][ R ] + cb_darrays[ 15 ][ B ]) ];
222 L = l2[ 1 ]; o2[ 1 ] = mappixel[ (l_darrays[ 7 ][ L ] + cr_darrays[ 7 ][ R ] + cb_darrays[ 7 ][ B ]) ];
224 R = r[ 1 ]; B = b[ 1 ];
226 L = l[ 2 ]; o1[ 2 ] = mappixel[ (l_darrays[ 1 ][ L ] + cr_darrays[ 1 ][ R ] + cb_darrays[ 1 ][ B ]) ];
227 L = l[ 3 ]; o1[ 3 ] = mappixel[ (l_darrays[ 9 ][ L ] + cr_darrays[ 9 ][ R ] + cb_darrays[ 9 ][ B ]) ];
228 L = l2[ 2 ]; o2[ 2 ] = mappixel[ (l_darrays[ 13 ][ L ] + cr_darrays[ 13 ][ R ] + cb_darrays[ 13 ][ B ]) ];
229 L = l2[ 3 ]; o2[ 3 ] = mappixel[ (l_darrays[ 5 ][ L ] + cr_darrays[ 5 ][ R ] + cb_darrays[ 5 ][ B ]) ];
231 R = r[ 2 ]; B = b[ 2 ];
233 L = l[ 4 ]; o1[ 4 ] = mappixel[ (l_darrays[ 3 ][ L ] + cr_darrays[ 3 ][ R ] + cb_darrays[ 3 ][ B ]) ];
234 L = l[ 5 ]; o1[ 5 ] = mappixel[ (l_darrays[ 11 ][ L ] + cr_darrays[ 11 ][ R ] + cb_darrays[ 11 ][ B ]) ];
235 L = l2[ 4 ]; o2[ 4 ] = mappixel[ (l_darrays[ 15 ][ L ] + cr_darrays[ 15 ][ R ] + cb_darrays[ 15 ][ B ]) ];
236 L = l2[ 5 ]; o2[ 5 ] = mappixel[ (l_darrays[ 7 ][ L ] + cr_darrays[ 7 ][ R ] + cb_darrays[ 7 ][ B ]) ];
238 R = r[ 3 ]; B = b[ 3 ];
240 L = l[ 6 ]; o1[ 6 ] = mappixel[ (l_darrays[ 1 ][ L ] + cr_darrays[ 1 ][ R ] + cb_darrays[ 1 ][ B ]) ];
241 L = l[ 7 ]; o1[ 7 ] = mappixel[ (l_darrays[ 9 ][ L ] + cr_darrays[ 9 ][ R ] + cb_darrays[ 9 ][ B ]) ];
242 L = l2[ 6 ]; o2[ 6 ] = mappixel[ (l_darrays[ 13 ][ L ] + cr_darrays[ 13 ][ R ] + cb_darrays[ 13 ][ B ]) ];
243 L = l2[ 7 ]; o2[ 7 ] = mappixel[ (l_darrays[ 5 ][ L ] + cr_darrays[ 5 ][ R ] + cb_darrays[ 5 ][ B ]) ];
245 l += 8;
246 l2 += 8;
247 r += 4;
248 b += 4;
249 o1 += 8;
250 o2 += 8;
253 l += w; l2 += w;
254 o1 += w; o2 += w;