Fix for 687696 PDF 1.4 transparency can use large chunks of memory.

"Dan Coby" <[email protected]> Thu, 10 Mar 2005 01:01:55 -0800
Newsgroups gmane.comp.printing.ghostscript.patches
Message-ID <[email protected]>
Fix for 687696 PDF 1.4 transparency can use large chunks of memory.
Prior to this fix the handling of PDF 1.4 transparency features used one
or more full size image buffers.  With high resolutions and large images,
these buffers can be multiple gigabytes.  As a result, we were not able
to handle these files.

DETAILS:

PDF 1.4 transparency is handled by a device which is inserted into the
device chain.  Prior to this fix, this device was via the 'device filter'
logic.  With this fix, the PDF 1.4 transparency device is inserted via
the compositor device mechanism.  This change was made since the device
filter logic did not allow other devices to control of where the PDF 1.4
transparency device is placed in the device chain.  There is a device
proc which implements the create compositor action.  This allows more
control than the device filter logic.

The first step in this fix was to convert the PDF 1.4 transparency
logic to use the create compositor mechanism.  For situations in which
the clist logic is not being used, the PDF 1.4 transparency device is
created and placed in the same location in the device chain as it was put
by the device filter logic.  In this situation, there is very little
logical difference in the operation of the PDF 1.4 transparency.

For situations in which the clist is used, there are two PDF 1.4
compositing devices created.  There is one device before the clist when the
clist is being written.  There is a second device after the clist when
the clist data is being read.

The device before the clist serves two purposes, it provides a means for
implementing the process color model for the PDF 1.4 compositing.  (The
PDF 1.4 compositing may used a different process color model from the output
device.)  Thus this device has color_info and encode/decode color procs
which match the PDF 1.4 blending color space.  This device also ensures
that the PDF 1.4 blending parameters (blend mode, shape, opacity, etc.)
are passed through the clist to the second PDF 1.4 device.

The second PDF 1.4 device (the one when the clist is being read) is the
same PDF 1.4 compositing device which is used when the clist is not being
used.  This is the device which does the blending operations.  Since the
device is after the clist, the buffers that it needs are the size of a
single band instead of the full page.  This device is placed prior to
the memory device which is used for drawing the raster data.

Two changes were made in the 'create compositor' logic.  The imager state
was being passed as a 'const'.  It is no longer const since the PDF 1.4
transparency compositing changes the cmap procs in the imager state to not
use transfer functions during color calculations.  The transfer functions
are applied later (and the cmap procs restored) when blended image data
is output from the PDF 1.4 compositing buffers.

The second change to the create compositor logic is the addition of two
more procedures to the gs_composite_type_t.procs list.  These procedures
are used by the clist device create compositor routines.  The first
is used to create the PDF 1.4 clist write device.  The second saves and
restores the color_info field for the clist device (see below).

Default versions of the added gs_composite_t.procs were also added for
use by the other compositor devices.  The defaults are no-ops.

The clist logic has a few changes.  Since the PDF 1.4 compositor device
may use a different process color model from the output device, the number
of colorants and the depth (bits per pixel) can be different for the PDF
1.4 compositor and the output device.  Thus changes were needed in parts
of the clist logic which assumed that these items were constant during the
processing of the clist.  An extra field was added to the device halftone
to indicate the number of colorants in effect when the device halftone was
created.  This data is included when the halftone is serialized for the
clist.  (Fortunately the PDF 1.4 compositing does not use halftones or
transfer functions.  So the device halftones and transfer functions do
not need to be changed when the PDF 1.4 compositor is installed.)

As previously mentioned the create compositor procedures for the clist
writer and reader now call a couple of compositor specific routines.  These
allow the compositor to implement actions related to the clist device.
(The PDF 1.4 compositor uses these routines to create the 'write clist'
PDF 1.4 compositor and to save and restore the clist device color info.
The color_info field of the clist device is changed to match the process
color model of the PDF 1.4 compositor while the PDF 1.4 compositor is active.

A additional device parameter (PageUsesTransparency) was added.  This
parameter is sent by the PDF interpreter to indicate if PDF 1.4 transparency
will be used on the page.  The banding/no banding decision and the size
of a band includes an estimate of the size of the PDF 1.4 blending buffers
if this parameter is true.  Note:  The estimate of the size of the
blending buffers is not exact since this calculation is made before the
actual number of buffers, the number of blending colors and alpha channels
is known.  Fixed values are used for the estimated buffer size.  This is
still much better than the pervious situation, in which the only the
output raster size was being used.  The blending buffers can easily be
30 or more times larger than the raster buffer.

This fix also involves the removal of the PDF 1.4 'marking' devices.
The marking devices were used to actually implement the pixel marking.
The marking devices were created at the start of each high level drawing
operation and deleted after the completion of the operation.  The marking
device action has been merged into the primary PDF 1.4 compositing device.
This change eliminates some device creation overhead.  The overhead would
have been worse since most information about high level drawing operations
is not passed through the clist.  As a result it would have been necessary
to create marking devices for each low level operations.



The following issues are not included in this fix but need to be considered.

1)  The device filter logic is no longer used.  It may be desired to remove
this logic.

2)  We currently have a 'create_compositor' device proc.  However there
is not a 'delete_compositor' device proc.  As a result, compositor devices
can stay in the device chain even when they are no longer needed.  The
current fix turns the PDF 1.4 compositor into a 'forwarding' device.  This
is the same method used by the overprint compositor device.  I do not like
leaving these devices since there is some extra overhead and there may be
possible side effects.  (Testing has been done to try to find side effects
and none has been found with the current code.)

3)  This change only affects devices which can use the clist logic.  This
excludes the 'high' level devices.  These include the 'display', 'x11',
and 'pdfwrite' devices.  Thus these device will continue to use a full
image buffer.  It is possible to extend this fix to use a clist device
for the PDF 1.4 device for these devices.


Dan

_______________________________________________
gs-code-review mailing list
[email protected]
http://www.ghostscript.com/mailman/listinfo/gs-code-review
687696.txt (text/plain, 141.8 KB) - not displayed