rev 372 - trunk

[email protected] Thu, 23 Dec 2004 03:54:44 -0800 (PST)
Newsgroups gmane.comp.printing.ghostscript.jbig2dec.cvs
Message-ID <[email protected]>
Author: giles
Date: 2004-12-23 03:54:43 -0800 (Thu, 23 Dec 2004)
New Revision: 372

Modified:
   trunk/jbig2_image.c
Log:
Implement a slow general fallback for image compositing. This adds=20
support for non-OR composition operators.


Modified: trunk/jbig2_image.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/jbig2_image.c	2004-12-22 09:34:29 UTC (rev 371)
+++ trunk/jbig2_image.c	2004-12-23 11:54:43 UTC (rev 372)
@@ -81,6 +81,66 @@
 	jbig2_free(ctx->allocator, image);
 }
=20
+/* composite one jbig2_image onto another
+   slow but general version */
+int jbig2_image_compose_unopt(Jbig2Ctx *ctx,
+			Jbig2Image *dst, Jbig2Image *src,
+                        int x, int y, Jbig2ComposeOp op)
+{
+    int i, j;
+    int sw =3D src->width;
+    int sh =3D src->height;
+    int sx =3D 0;
+    int sy =3D 0;
+
+    /* clip to the dst image boundaries */
+    if (x < 0) { sx +=3D -x; sw -=3D -x; x =3D 0; }
+    if (y < 0) { sy +=3D -y; sh -=3D -y; y =3D 0; }
+    if (x + sw >=3D dst->width) sw =3D dst->width - x;
+    if (y + sh >=3D dst->height) sh =3D dst->height - y;
+
+    switch (op) {
+	case JBIG2_COMPOSE_OR:
+	    for (j =3D 0; j < sh; j++) {
+		for (i =3D 0; i < sw; i++) {
+		    jbig2_image_set_pixel(dst, i+x, j+y,
+			jbig2_image_get_pixel(src, i+sx, j+sy) |
+			jbig2_image_get_pixel(dst, i+x, j+y));
+		}
+    	    }
+	    break;
+	case JBIG2_COMPOSE_AND:
+	    for (j =3D 0; j < sh; j++) {
+		for (i =3D 0; i < sw; i++) {
+		    jbig2_image_set_pixel(dst, i+x, j+y,
+			jbig2_image_get_pixel(src, i+sx, j+sy) &
+			jbig2_image_get_pixel(dst, i+x, j+y));
+		}
+    	    }
+	    break;
+	case JBIG2_COMPOSE_XOR:
+	    for (j =3D 0; j < sh; j++) {
+		for (i =3D 0; i < sw; i++) {
+		    jbig2_image_set_pixel(dst, i+x, j+y,
+			jbig2_image_get_pixel(src, i+sx, j+sy) ^
+			jbig2_image_get_pixel(dst, i+x, j+y));
+		}
+    	    }
+	    break;
+	case JBIG2_COMPOSE_XNOR:
+	    for (j =3D 0; j < sh; j++) {
+		for (i =3D 0; i < sw; i++) {
+		    jbig2_image_set_pixel(dst, i+x, j+y,
+			~(jbig2_image_get_pixel(src, i+sx, j+sy) ^
+			jbig2_image_get_pixel(dst, i+x, j+y)));
+		}
+    	    }
+	    break;
+    }
+
+    return 0;
+}
+
 /* composite one jbig2_image onto another */
 int jbig2_image_compose(Jbig2Ctx *ctx, Jbig2Image *dst, Jbig2Image *src,=
=20
 			int x, int y, Jbig2ComposeOp op)
@@ -94,8 +154,8 @@
     uint8_t mask, rightmask;
    =20
     if (op !=3D JBIG2_COMPOSE_OR) {
-        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, -1,
-            "non-OR composition modes NYI");
+	/* hand off the the general routine */
+	return jbig2_image_compose_unopt(ctx, dst, src, x, y, op);
     }
=20
     /* clip */