Added tovideo routine

This commit is contained in:
Jack Jansen 1993-01-22 15:34:43 +00:00
parent 7564a641e5
commit d26b458325
1 changed files with 59 additions and 0 deletions

View File

@ -124,6 +124,64 @@ imageop_scale(self, args)
return rv;
}
/* Note: this routine can use a bit of optimizing */
static object *
imageop_tovideo(self, args)
object *self;
object *args;
{
int maxx, maxy, x, y, len;
int i;
unsigned char *cp, *ncp, cdata;
int width;
object *rv;
if ( !getargs(args, "(s#iii)", &cp, &len, &width, &maxx, &maxy) )
return 0;
if ( width != 1 && width != 4 ) {
err_setstr(ImageopError, "Size should be 1 or 4");
return 0;
}
if ( maxx*maxy*width != len ) {
err_setstr(ImageopError, "String has incorrect length");
return 0;
}
rv = newsizedstringobject(NULL, len);
if ( rv == 0 )
return 0;
ncp = (unsigned char *)getstringvalue(rv);
if ( width == 1 ) {
bcopy(cp, ncp, maxx); /* Copy first line */
ncp += maxx;
for (y=1; y<maxy; y++) { /* Interpolate other lines */
for(x=0; x<maxx; x++) {
i = y*maxx + x;
*ncp++ = (cp[i] + cp[i-maxx]) >> 1;
}
}
} else {
bcopy(cp, ncp, maxx*4); /* Copy first line */
ncp += maxx*4;
for (y=1; y<maxy; y++) { /* Interpolate other lines */
for(x=0; x<maxx; x++) {
i = (y*maxx + x)*4 + 1;
*ncp++ = 0; /* Skip alfa comp */
*ncp++ = (cp[i] + cp[i-4*maxx]) >> 1;
i++;
*ncp++ = (cp[i] + cp[i-4*maxx]) >> 1;
i++;
*ncp++ = (cp[i] + cp[i-4*maxx]) >> 1;
}
}
}
return rv;
}
static object *
imageop_grey2mono(self, args)
object *self;
@ -501,6 +559,7 @@ static struct methodlist imageop_methods[] = {
{ "mono2grey", imageop_mono2grey },
{ "grey22grey", imageop_grey22grey },
{ "grey42grey", imageop_grey42grey },
{ "tovideo", imageop_tovideo },
{ 0, 0 }
};