summaryrefslogtreecommitdiff
path: root/pcl/pcwhtidx.h
diff options
context:
space:
mode:
Diffstat (limited to 'pcl/pcwhtidx.h')
-rw-r--r--pcl/pcwhtidx.h126
1 files changed, 126 insertions, 0 deletions
diff --git a/pcl/pcwhtidx.h b/pcl/pcwhtidx.h
new file mode 100644
index 000000000..c5c438292
--- /dev/null
+++ b/pcl/pcwhtidx.h
@@ -0,0 +1,126 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcwhtindx.c - interface to code for finding white index of a palette */
+
+#ifndef pcwhtindx_INCLUDED
+#define pcwhtindx_INCLUDED
+
+#include "gx.h"
+#include "gsbitmap.h"
+#include "pcindxed.h"
+
+/*
+ * To implement transparency in PCL colored patterns and rasters, it is
+ * necessary to identify those pixels which should be considered white, as
+ * those are the pixels which should be transparent.
+ *
+ * "White" in the sense of PCL means white in the device color space, just
+ * prior to dithering. Hence, the effect of normalization, color lookup tables,
+ * and conversion from the source to device color lookup table are taken into
+ * account before determining if a given pixel is (potentially) transparent.
+ *
+ * Such a mechanism is, unfortunately, not easily implemented via the existing
+ * graphic library, as raster transparency is implemented via PostScript
+ * ImageType 4 images. For these images, the single color or range of colors
+ * required that identify pixels as transparent are specified in the source
+ * color space, before any conversion.
+ *
+ * In this implementation, normalization of colors for black and white
+ * reference points occurs before the raw data is ever considered a color,
+ * so at least that part of the problem is handled correctly. Beyond this
+ * canonical white--(1.0, 1.0, 1.0) in all color spaces--is assumed to yield
+ * white; if it does not (due to color lookup tables), the results will be
+ * incorrect.
+ *
+ * Where appropriate, this implementation also uses the graphic library's
+ * support for indexed color spaces. Creating potentially transparent rasters
+ * with these color spaces requires us to identify which entries in the
+ * color palette are white. When there is only one such entry, this is simple.
+ * When several palette entries are involved, life is more difficult. It is
+ * then necessary to remap all raster values which map to a white palette
+ * entry to the same white entry.
+ *
+ * For straight rasters, this is can be done in-place, as the raster will
+ * never be rendered with another color space. Patterns are not so easily
+ * handled, as they may be rendered subsequently with other color spaces.
+ * Hence, for those it is necessary to copy the data.
+ */
+
+/*
+ * Determine the white entry in the color palette of an indexed color space,
+ * and perform any remapping that is required.
+ *
+ * The must_copy operand indicates if the raster data can be overwritten in
+ * place (false) or if a new array must be allocated.
+ *
+ * Returns 0 if successful, < 0 in the event of an error.
+ */
+int pcl_cmap_map_raster(
+ const pcl_cs_indexed_t * pindexed,
+ int * pfirst_white,
+ const gs_depth_bitmap * pin_pixinfo,
+ gs_depth_bitmap * pout_pixinfo,
+ bool must_copy,
+ gs_memory_t * pmem
+);
+
+/*
+ * An alternative interface to the remapping capability, this one more suited
+ * to working with rasters.
+ *
+ * Because rasters are provided in a large number of pieces (typically one
+ * sanline is an individual piece), and all pieces are rendered using the
+ * the same color palette, it does not make sense to re-derive the mapping
+ * table for each raster. Consequently, the code below can be used to get
+ * the mapping table once, re-use it for each piece, and then free it.
+ *
+ * This code is specifically intended for rasters, and will only create a
+ * remap table if:
+ *
+ * source transparency is required
+ * the current palette uses an indexed pixel encoding (by plane or
+ * by pixel)
+ * there is more than one "white" in the current palette.
+ *
+ * Note that the macros for apply and free a remapping array will check for
+ * a null-pointer inline. Hence, the caller need not provide any other check
+ * of whether or nor remapping is necessary.
+ */
+const void * pcl_cmap_create_remap_ary(
+ pcl_state_t * pcs,
+ int * pfirst_white
+);
+
+void pcl_cmap_int_apply_ary(
+ const void * vpmap, /* remap array pointer */
+ byte * prast, /* array of bytes to be mapped */
+ int b_per_p, /* bits per pixel */
+ int npixels
+);
+
+#define pcl_cmap_apply_remap_ary(pmap, prast, b_per_p, npixels) \
+ BEGIN \
+ if ((pmap) != 0) \
+ pcl_cmap_int_apply_ary((pmap), (prast), (b_per_p), (npixels)); \
+ END
+
+#define pcl_cmap_free_remap_ary(pmap, pcs) \
+ BEGIN \
+ if ((pmap) != 0) \
+ gs_free_object( (pcs)->memory, \
+ (void *)(pmap), \
+ "pcl_cmap_free_remap_ary"); \
+ END
+
+#endif /* pcwhtindx_INCLUDED */