| AWARE [SYSTEMS] | Imaging expertise for the Delphi developer | |||||||
![]() |
TIFF and LibTiff Mailing List Archive | |||||||
LibTiff Mailing List
TIFF and LibTiff Mailing List Archive Contact
The TIFF Mailing List Homepage |
Thread1994.03.31 10:31 "A little PackBits bug", by Roland NahserDear TIFF-Developers,
I am an user of your fantastic libtiff Version 3.30beta. With 3.3 it
is much easier to port to different environments. But there seems to
be a little bug in PackBitsEncode in the following if statement:
case LITERAL_RUN: /* literal followed by a run */
/*
* Check to see if previous run should
* be converted to a literal, in which
* case we convert literal-run-literal
* to a single literal.
*/
if (n == 1 && -op[-2] == 1 && *lastliteral < 126) {
state = (((*lastliteral) += 2) == 127 ?
BASE : LITERAL);
op[-2] = op[-1]; /* replicate */
variable op is declared as tidata_t (unsigned char *). Using it as
-op[-2] does not always result in 1 as expected but in -255.
(binary representation of -1 as u_char = 255 (on nearly every machine I know
from). This bug arose on DEC Ultrix and SunOS with gcc. I think the most
portable way is to test: op[-2] == 255.
The solution: - (char)op[-2] == 1 works on machines where
char is signed char. Using explicit signed char is not possible on all
machines (I think Ultrix is one of them).
---
Second I am using a "private" TIFF-format for temporary storing
images generated by our GKS-software in the following format
Separate planes
SamplePerPixel = 3 or 4
BitsperSample = 1
Compression = PACKBITS or LZW
when I try to use RowsperStrip > 1 (for better performance and
compression with LZW) I get the errormessage:
TIFFWriteScanline:Compression algorithm does not support random access
I am writing the image with the following simplified code fragment :
for (i = 0; i < numscans; i++) {
/* small loop over planes (or) samples */
for (sample = 0; sample < samperpix; sample++ ) {
/* start byte in data stream = startdata */
startdata = (char *) &data[iofp] + startbyte;
(void) TIFFWriteScanline(out, (tdata_t) startdata, tmprow,
(tsample_t) sample);
iofp += planelen;
} /* end loop over samples */
} /* end loop over scans */
I do not understand why this is direct access.
Are there any plns to support real direct access in libtiff? I am
looking for a format for intermediate storage of tiled images within
rasterization of very large high resolution images for
phototype setters.
--
Roland Nahser
+----------------------------------+--------------------------------+
|GraS - Graphische Systeme GmbH | email : rn@gras.de |
|Mecklenburgische Str. 27 | Phone : +49 30 8232074 |
|D-14197 Berlin | FAX : +49 30 8248779 |
|Germany | |
+----------------------------------+--------------------------------+
|
|||||||