summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
Diffstat (limited to 'Modules')
-rw-r--r--Modules/imageop.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/Modules/imageop.c b/Modules/imageop.c
index 0f30246..9c0107b 100644
--- a/Modules/imageop.c
+++ b/Modules/imageop.c
@@ -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 }
};