[bug-pcl] bugs in PCL compression mode 9
Derek B. Noonburg
derekn at glyphandcog.com
Mon Mar 14 17:22:56 PST 2005
There are a couple of problems with the uncompress_9 function in
GhostPCL 1.41. I'm attaching a patch file.
I've only done minor testing (with output from a Windows driver for the
Brother 1850). Also, it seems to match up with the code in the PCL3
driver in ghostscript (which compresses images using mode 9).
- Derek
-------------- next part --------------
*** rtrstcmp.c.orig Mon Mar 14 17:16:12 2005
--- rtrstcmp.c Mon Mar 14 17:16:52 2005
***************
*** 194,201 ****
if (comp) {
offset = (val >> 5) & 0x3;
more_offset = (offset == 0x3);
! cnt = (val & 0x1f) + 1;
! more_cnt = (cnt == 0x20);
} else {
offset = (val >> 3) & 0xf;
more_offset = (offset == 0xf);
--- 194,201 ----
if (comp) {
offset = (val >> 5) & 0x3;
more_offset = (offset == 0x3);
! cnt = (val & 0x1f) + 2;
! more_cnt = (cnt == 0x21);
} else {
offset = (val >> 3) & 0xf;
more_offset = (offset == 0xf);
***************
*** 213,244 ****
uint extra = *pin++;
more_cnt = (extra == 0xff);
! offset += extra;
}
if ((pb += offset) >= plim)
break;
if (comp) {
! uint j = i / 2;
!
! while (j-- > 0) {
! uint rep_cnt = *pin++;
! uint rep_val = *pin++;
!
! if (rep_cnt > plim - pb)
! rep_cnt = plim - pb;
! while (rep_cnt-- > 0)
! *pb++ = rep_val;
! }
! i -= 2 * j;
} else {
if (cnt > i)
cnt = i;
- i -= cnt;
- pin += cnt;
if (cnt > plim - pb)
cnt = plim - pb;
while (cnt-- > 0)
*pb++ = *pin++;
}
--- 213,240 ----
uint extra = *pin++;
more_cnt = (extra == 0xff);
! cnt += extra;
}
if ((pb += offset) >= plim)
break;
if (comp) {
! uint rep_val = 0;
! if (i > 0) {
! rep_val = *pin++;
! --i;
! }
! if (cnt > plim - pb)
! cnt = plim - pb;
! while (cnt-- > 0)
! *pb++ = rep_val;
} else {
if (cnt > i)
cnt = i;
if (cnt > plim - pb)
cnt = plim - pb;
+ i -= cnt;
while (cnt-- > 0)
*pb++ = *pin++;
}
More information about the bug-pcl
mailing list