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 */