Skip to content

Commit de3adf9

Browse files
committed
Added 2 and 4 bits grey formats
1 parent a3b986e commit de3adf9

1 file changed

Lines changed: 208 additions & 0 deletions

File tree

Modules/imageop.c

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
169251
static object *
170252
imageop_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+
215342
static object *
216343
imageop_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
/*
256459
static object *
257460
imageop_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

Comments
 (0)