@@ -166,6 +166,88 @@ imageop_grey2mono(self, args)
166166 return rv ;
167167}
168168
169+ static object *
170+ imageop_grey2grey4 (self , args )
171+ object * self ;
172+ object * args ;
173+ {
174+ int x , y , len ;
175+ unsigned char * cp , * ncp ;
176+ unsigned char ovalue ;
177+ object * rv ;
178+ int i ;
179+ int pos ;
180+
181+
182+ if ( !getargs (args , "(s#ii)" , & cp , & len , & x , & y ) )
183+ return 0 ;
184+
185+ if ( x * y != len ) {
186+ err_setstr (ImageopError , "String has incorrect length" );
187+ return 0 ;
188+ }
189+
190+ rv = newsizedstringobject (NULL , (len + 1 )/2 );
191+ if ( rv == 0 )
192+ return 0 ;
193+ ncp = (unsigned char * )getstringvalue (rv );
194+ pos = 0 ;
195+ ovalue = 0 ;
196+ for ( i = 0 ; i < len ; i ++ ) {
197+ ovalue |= (cp [i ] & 0xf0 ) >> pos ;
198+ pos += 4 ;
199+ if ( pos == 8 ) {
200+ * ncp ++ = ovalue ;
201+ ovalue = 0 ;
202+ pos = 0 ;
203+ }
204+ }
205+ if ( pos != 0 )
206+ * ncp ++ = ovalue ;
207+ return rv ;
208+ }
209+
210+ static object *
211+ imageop_grey2grey2 (self , args )
212+ object * self ;
213+ object * args ;
214+ {
215+ int x , y , len ;
216+ unsigned char * cp , * ncp ;
217+ unsigned char ovalue ;
218+ object * rv ;
219+ int i ;
220+ int pos ;
221+
222+
223+ if ( !getargs (args , "(s#ii)" , & cp , & len , & x , & y ) )
224+ return 0 ;
225+
226+ if ( x * y != len ) {
227+ err_setstr (ImageopError , "String has incorrect length" );
228+ return 0 ;
229+ }
230+
231+ rv = newsizedstringobject (NULL , (len + 3 )/4 );
232+ if ( rv == 0 )
233+ return 0 ;
234+ ncp = (unsigned char * )getstringvalue (rv );
235+ pos = 0 ;
236+ ovalue = 0 ;
237+ for ( i = 0 ; i < len ; i ++ ) {
238+ ovalue |= (cp [i ] & 0xc0 ) >> pos ;
239+ pos += 2 ;
240+ if ( pos == 8 ) {
241+ * ncp ++ = ovalue ;
242+ ovalue = 0 ;
243+ pos = 0 ;
244+ }
245+ }
246+ if ( pos != 0 )
247+ * ncp ++ = ovalue ;
248+ return rv ;
249+ }
250+
169251static object *
170252imageop_dither2mono (self , args )
171253 object * self ;
@@ -212,6 +294,51 @@ imageop_dither2mono(self, args)
212294 return rv ;
213295}
214296
297+ static object *
298+ imageop_dither2grey2 (self , args )
299+ object * self ;
300+ object * args ;
301+ {
302+ int x , y , len ;
303+ unsigned char * cp , * ncp ;
304+ unsigned char ovalue ;
305+ object * rv ;
306+ int i ;
307+ int pos ;
308+ int sum , nvalue ;
309+
310+
311+ if ( !getargs (args , "(s#ii)" , & cp , & len , & x , & y ) )
312+ return 0 ;
313+
314+ if ( x * y != len ) {
315+ err_setstr (ImageopError , "String has incorrect length" );
316+ return 0 ;
317+ }
318+
319+ rv = newsizedstringobject (NULL , (len + 3 )/4 );
320+ if ( rv == 0 )
321+ return 0 ;
322+ ncp = (unsigned char * )getstringvalue (rv );
323+ pos = 1 ;
324+ ovalue = 0 ;
325+ for ( i = 0 ; i < len ; i ++ ) {
326+ sum += cp [i ];
327+ nvalue = sum & 0x180 ;
328+ sum -= nvalue ;
329+ ovalue |= nvalue >> pos ;
330+ pos += 2 ;
331+ if ( pos == 9 ) {
332+ * ncp ++ = ovalue ;
333+ ovalue = 0 ;
334+ pos = 1 ;
335+ }
336+ }
337+ if ( pos != 0 )
338+ * ncp ++ = ovalue ;
339+ return rv ;
340+ }
341+
215342static object *
216343imageop_mono2grey (self , args )
217344 object * self ;
@@ -252,6 +379,82 @@ imageop_mono2grey(self, args)
252379 return rv ;
253380}
254381
382+ static object *
383+ imageop_grey22grey (self , args )
384+ object * self ;
385+ object * args ;
386+ {
387+ int x , y , len , nlen ;
388+ unsigned char * cp , * ncp ;
389+ unsigned char ovalue ;
390+ object * rv ;
391+ int i , pos , value , nvalue ;
392+
393+ if ( !getargs (args , "(s#ii)" , & cp , & len , & x , & y ) )
394+ return 0 ;
395+
396+ nlen = x * y ;
397+ if ( (nlen + 3 )/4 != len ) {
398+ err_setstr (ImageopError , "String has incorrect length" );
399+ return 0 ;
400+ }
401+
402+ rv = newsizedstringobject (NULL , nlen );
403+ if ( rv == 0 )
404+ return 0 ;
405+ ncp = (unsigned char * )getstringvalue (rv );
406+
407+ pos = 0 ;
408+ for ( i = 0 ; i < nlen ; i ++ ) {
409+ if ( pos == 0 ) {
410+ value = * cp ++ ;
411+ pos = 8 ;
412+ }
413+ pos -= 2 ;
414+ nvalue = (value >> pos ) & 0x03 ;
415+ * ncp ++ = nvalue | (nvalue << 2 ) | (nvalue << 4 ) | (nvalue << 6 );
416+ }
417+ return rv ;
418+ }
419+
420+ static object *
421+ imageop_grey42grey (self , args )
422+ object * self ;
423+ object * args ;
424+ {
425+ int x , y , len , nlen ;
426+ unsigned char * cp , * ncp ;
427+ unsigned char ovalue ;
428+ object * rv ;
429+ int i , pos , value , nvalue ;
430+
431+ if ( !getargs (args , "(s#ii)" , & cp , & len , & x , & y ) )
432+ return 0 ;
433+
434+ nlen = x * y ;
435+ if ( (nlen + 1 )/2 != len ) {
436+ err_setstr (ImageopError , "String has incorrect length" );
437+ return 0 ;
438+ }
439+
440+ rv = newsizedstringobject (NULL , nlen );
441+ if ( rv == 0 )
442+ return 0 ;
443+ ncp = (unsigned char * )getstringvalue (rv );
444+
445+ pos = 0 ;
446+ for ( i = 0 ; i < nlen ; i ++ ) {
447+ if ( pos == 0 ) {
448+ value = * cp ++ ;
449+ pos = 8 ;
450+ }
451+ pos -= 4 ;
452+ nvalue = (value >> pos ) & 0x0f ;
453+ * ncp ++ = nvalue | (nvalue << 4 );
454+ }
455+ return rv ;
456+ }
457+
255458/*
256459static object *
257460imageop_mul(self, args)
@@ -291,8 +494,13 @@ static struct methodlist imageop_methods[] = {
291494 { "crop" , imageop_crop },
292495 { "scale" , imageop_scale },
293496 { "grey2mono" , imageop_grey2mono },
497+ { "grey2grey2" , imageop_grey2grey2 },
498+ { "grey2grey4" , imageop_grey2grey4 },
294499 { "dither2mono" , imageop_dither2mono },
500+ { "dither2grey2" , imageop_dither2grey2 },
295501 { "mono2grey" , imageop_mono2grey },
502+ { "grey22grey" , imageop_grey22grey },
503+ { "grey42grey" , imageop_grey42grey },
296504 { 0 , 0 }
297505};
298506
0 commit comments