(a bit long, just for those interested, for the archives and for my lame
I've been asked by a client to implement support for embedding CMYK TIFF
in AFP without conversion to RGB. Even without the RGB conversion the
process is relatively slow. So it makes sense to investigate
optimization possibilities. The images to be embedded can be quite large
and are LZW-compressed. The first step is obviously functionality which
means teaching FOP how to embed CMYK bitmaps in AFP. Just leg work there.
The second step is optimization: investigating if LZW-compressed data
can be embedded in the target format without decompressing it, much like
what we do with JPEG and CCITT data in certain cases.
All CMYK TIFF images I looked at encoded the bitmap in multiple stripes.
The TIFF 6.0 spec recommends that approach to minimize memory usage for
processing. For each stripe, a number of bitmap rows are encoded. For
each stripe the compression algorithm is restarted. Since LZW has an
explicit EOD (end of data) command, it's not possible to simply
concatenate the stripes. The decoder would stop after the first stripe.
I'm not sure if it would be possible to concatenate the stripes by
simply removing the EOF command (which would basically mean interpreting
each command because they are not byte-aligned). The EOD makes it
impossible/difficult/impractical to embed such a TIFF image in undecoded
form in PDF as that doesn't seem to allow multiple streams for one image.
In PostScript it should be possible with a few tricks. In AFP, we'd
probably have to add support for tiling, i.e. create a tile per stripe
in the TIFF. Another possibility, though not as portable, is to use
"Include Object IOB" which supports whole TIFF files directly. On the
image loader framework side, I don't see any problems providing the
necessary streams. Of course, one could create multiple image XObjects
in PDF to align the stripes next to each other, but there's a risk of
visual side-effects (gaps, overlaps, anti-aliasing).
I've written some code that can embedd a single-stripe CMYK TIFF in PDF
as a proof of concept. I've done it for PDF because that was the easiest
to implement. I don't want to commit that right now since it
would need a lot of testing first. So in case I don't pursue this (due
to other priorities) and someone else wants that code, it's available.