jbig2dec

Raph Levien <[email protected]> Wed, 03 Jul 2002 14:51:11 -0700
Newsgroups gmane.comp.printing.ghostscript.jbig2dec.cvs
Message-ID <[email protected]>
Update of /cvsroot/jbig2dec/jbig2dec
In directory usw-pr-cvs1:/tmp/cvs-serv13519

Modified Files:
	jbig2_image.c 
Log Message:
Fix image compositor. Code is not beautiful, but works.


Index: jbig2_image.c
===================================================================
RCS file: /cvsroot/jbig2dec/jbig2dec/jbig2_image.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- jbig2_image.c	3 Jul 2002 19:54:43 -0000	1.13
+++ jbig2_image.c	3 Jul 2002 21:51:09 -0000	1.14
@@ -96,35 +96,50 @@
 
     leftbyte = x >> 3;
     leftbits = x & 7;
-    rightbyte = (x + w) >> 3;
+    rightbyte = (x + w - 1) >> 3;
     rightbits = (x + w) & 7;
     fprintf(stderr, "left byte:bits %d:%d right byte:bits %d:%d\n",
         leftbyte, leftbits, rightbyte, rightbits);
 
     /* general OR case */    
-    d = ss;
+    s = ss;
     d = dd = dst->data + y*dst->stride + leftbyte;
     if (leftbyte == rightbyte) {
-        mask = (1 << (w & 7)) - 1;
+	mask = 0x100 - (0x100 >> w);
         for (j = 0; j < h; j++) {
-            *d |= (*s & mask) << leftbits;
+            *d |= (*s & mask) >> leftbits;
             d += dst->stride;
             s += src->stride;
         }
-    } else {
-        mask = 1 << (8 - leftbits) - 1;
-        highmask = (1 << rightbits) - 1;
+    } else if (leftbits == 0) {
         for (j = 0; j < h; j++) {
-            *d++ |= (*s & mask) << leftbits;
-            for(i = leftbyte; i < rightbyte; i++) {
-                *d |= (*s++ & ~mask) >> leftbits;
-                *d++ |= (*s & mask) << leftbits;
-            }
-            *d |= (*s++ & ~mask) >> leftbits;
-            *d |= (*s & highmask) << leftbits;
+	    for (i = leftbyte; i <= rightbyte; i++)
+		*d++ |= *s++;
             d = (dd += dst->stride);
             s = (ss += src->stride);
-        }
+	}
+    } else {
+	mask = 0x100 - (1 << leftbits);
+	if (((w + 7) >> 3) < ((x + w + 7) >> 3) - (x >> 3))
+	    highmask = (0x100 - (0x100 >> rightbits)) >> (8 - leftbits);
+	else
+	    highmask = 0x100 - (0x100 >> (w & 7));
+        for (j = 0; j < h; j++) {
+	    *d++ |= (*s & mask) >> leftbits;
+            for(i = leftbyte; i < rightbyte - 1; i++) {
+		*d |= ((s[0] & ~mask) << (8 - leftbits)) |
+		    ((s[1] & mask) >> leftbits);
+		s++;
+		d++;
+	    }
+	    if (((w + 7) >> 3) < ((x + w + 7) >> 3) - (x >> 3))
+		*d |= (s[0] & highmask) << (8 - leftbits);
+	    else
+		*d |= ((s[0] & ~mask) << (8 - leftbits)) |
+		    ((s[1] & highmask) >> leftbits);
+	    d = (dd += dst->stride);
+	    s = (ss += src->stride);
+	}
     }
             
     return 0;