xref: /plan9/sys/src/cmd/gs/src/gsbitmap.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
17dd7cddfSDavid du Colombier /* Copyright (C) 1998, 1999 Aladdin Enterprises.  All rights reserved.
27dd7cddfSDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
57dd7cddfSDavid du Colombier 
6*593dc095SDavid du Colombier   This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier   modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier   of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier 
10*593dc095SDavid du Colombier   For more information about licensing, please refer to
11*593dc095SDavid du Colombier   http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier   commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: gsbitmap.h,v 1.4 2002/02/21 22:24:52 giles Exp $ */
187dd7cddfSDavid du Colombier /* Library "client" bitmap structures */
197dd7cddfSDavid du Colombier 
207dd7cddfSDavid du Colombier #ifndef gsbitmap_INCLUDED
217dd7cddfSDavid du Colombier #define gsbitmap_INCLUDED
227dd7cddfSDavid du Colombier 
237dd7cddfSDavid du Colombier #include "gsstype.h"		/* for extern_st */
247dd7cddfSDavid du Colombier 
257dd7cddfSDavid du Colombier /*
267dd7cddfSDavid du Colombier  * The Ghostscript library stores all bitmaps bit-big-endian (i.e., the 0x80
277dd7cddfSDavid du Colombier  * bit of the first byte corresponds to x=0), as a sequence of bytes (i.e.,
287dd7cddfSDavid du Colombier  * you can't do word-oriented operations on them if you're on a
297dd7cddfSDavid du Colombier  * little-endian platform like the Intel 80x86 or VAX).  The first scan line
307dd7cddfSDavid du Colombier  * corresponds to y=0 in whatever coordinate system is relevant.
317dd7cddfSDavid du Colombier  *
327dd7cddfSDavid du Colombier  * The structures defined here are for APIs that don't impose any alignment
337dd7cddfSDavid du Colombier  * restrictions on either the starting address or the raster (distance
347dd7cddfSDavid du Colombier  * between scan lines) of bitmap data.  The structures defined in gxbitmap.h
357dd7cddfSDavid du Colombier  * do impose alignment restrictions, so that the library can use more
367dd7cddfSDavid du Colombier  * efficient algorithms; they are declared with identical contents to the
377dd7cddfSDavid du Colombier  * ones defined here, so that one can cast between them under appropriate
387dd7cddfSDavid du Colombier  * circumstances (aligned to unaligned is always safe; unaligned to
397dd7cddfSDavid du Colombier  * aligned is safe if one knows somehow that the data are actually aligned.)
407dd7cddfSDavid du Colombier  *
417dd7cddfSDavid du Colombier  * In this file we also provide structures that include depth information.
427dd7cddfSDavid du Colombier  * It probably was a design mistake not to include this information in the
437dd7cddfSDavid du Colombier  * gx structures as well.
447dd7cddfSDavid du Colombier  */
457dd7cddfSDavid du Colombier 
467dd7cddfSDavid du Colombier /*
477dd7cddfSDavid du Colombier  * Drivers such as the X driver and the command list (band list) driver
487dd7cddfSDavid du Colombier  * benefit greatly by being able to cache bitmaps (tiles and characters)
497dd7cddfSDavid du Colombier  * and refer to them later.  To help them recognize when a bitmap is the
507dd7cddfSDavid du Colombier  * same as one that they have seen before, the core code passes an optional
517dd7cddfSDavid du Colombier  * ID with the property that if two bitmaps have the same ID, they are
527dd7cddfSDavid du Colombier  * guaranteed to have the same contents.  (The converse is *not* true,
537dd7cddfSDavid du Colombier  * however: two bitmaps may have different IDs and still be the same.)
547dd7cddfSDavid du Colombier  */
557dd7cddfSDavid du Colombier typedef gs_id gs_bitmap_id;
567dd7cddfSDavid du Colombier 
577dd7cddfSDavid du Colombier /* Define a special value to indicate "no identifier". */
587dd7cddfSDavid du Colombier #define gs_no_bitmap_id     gs_no_id
597dd7cddfSDavid du Colombier 
607dd7cddfSDavid du Colombier /*
617dd7cddfSDavid du Colombier  * In its simplest form, the client bitmap structure does not specify a
627dd7cddfSDavid du Colombier  * depth, expecting it to be implicit in the context of use.  In many cases
637dd7cddfSDavid du Colombier  * it is possible to guess this by comparing size.x and raster, but of
647dd7cddfSDavid du Colombier  * course code should not rely on this.  See also gs_depth_bitmap below.
657dd7cddfSDavid du Colombier  * Requirements:
667dd7cddfSDavid du Colombier  *      size.x > 0, size.y > 0
677dd7cddfSDavid du Colombier  *      If size.y > 1,
687dd7cddfSDavid du Colombier  *          raster >= (size.x * depth + 7) / 8
697dd7cddfSDavid du Colombier  */
707dd7cddfSDavid du Colombier #define gs_bitmap_common(data_type)                                         \
717dd7cddfSDavid du Colombier     data_type *     data;       /* pointer to the data */                   \
727dd7cddfSDavid du Colombier     int             raster;     /* increment between scanlines, bytes */    \
737dd7cddfSDavid du Colombier     gs_int_point    size;       /* width and height */                      \
747dd7cddfSDavid du Colombier     gs_bitmap_id    id		/* usually unused */
757dd7cddfSDavid du Colombier 
767dd7cddfSDavid du Colombier typedef struct gs_bitmap_s {
777dd7cddfSDavid du Colombier     gs_bitmap_common(byte);
787dd7cddfSDavid du Colombier } gs_bitmap;
797dd7cddfSDavid du Colombier typedef struct gs_const_bitmap_s {
807dd7cddfSDavid du Colombier     gs_bitmap_common(const byte);
817dd7cddfSDavid du Colombier } gs_const_bitmap;
827dd7cddfSDavid du Colombier 
837dd7cddfSDavid du Colombier /*
847dd7cddfSDavid du Colombier  * For bitmaps used as halftone tiles, we may replicate the tile in
857dd7cddfSDavid du Colombier  * X and/or Y, but it is still valuable to know the true tile dimensions
867dd7cddfSDavid du Colombier  * (i.e., the dimensions prior to replication).  Requirements:
877dd7cddfSDavid du Colombier  *      size.x % rep_width = 0
887dd7cddfSDavid du Colombier  *      size.y % rep_height = 0
897dd7cddfSDavid du Colombier  * Unaligned bitmaps are not very likely to be used as tiles (replicated),
907dd7cddfSDavid du Colombier  * since most of the library procedures that replicate tiles expect them
917dd7cddfSDavid du Colombier  * to be aligned.
927dd7cddfSDavid du Colombier  */
937dd7cddfSDavid du Colombier #define gs_tile_bitmap_common(data_type)                          \
947dd7cddfSDavid du Colombier     gs_bitmap_common(data_type);                                  \
957dd7cddfSDavid du Colombier     ushort      rep_width, rep_height	/* true size of tile */
967dd7cddfSDavid du Colombier 
977dd7cddfSDavid du Colombier typedef struct gs_tile_bitmap_s {
987dd7cddfSDavid du Colombier     gs_tile_bitmap_common(byte);
997dd7cddfSDavid du Colombier } gs_tile_bitmap;
1007dd7cddfSDavid du Colombier typedef struct gs_const_tile_bitmap_s {
1017dd7cddfSDavid du Colombier     gs_tile_bitmap_common(const byte);
1027dd7cddfSDavid du Colombier } gs_const_tile_bitmap;
1037dd7cddfSDavid du Colombier 
1047dd7cddfSDavid du Colombier /*
1057dd7cddfSDavid du Colombier  * There is no "strip" version for client bitmaps, as the strip structure is
1067dd7cddfSDavid du Colombier  * primarily used to efficiently store bitmaps rendered at an angle, and
1077dd7cddfSDavid du Colombier  * there is little reason to do so with client bitmaps.
1087dd7cddfSDavid du Colombier  *
1097dd7cddfSDavid du Colombier  * For client bitmaps it is not always apparent from context what the intended
1107dd7cddfSDavid du Colombier  * depth per sample value is. To provide for this, an extended version of the
1117dd7cddfSDavid du Colombier  * bitmap structure is provided, that handles both variable depth and
1127dd7cddfSDavid du Colombier  * interleaved color components. This structure is provided in both the
1137dd7cddfSDavid du Colombier  * normal and tiled version.
1147dd7cddfSDavid du Colombier  *
1157dd7cddfSDavid du Colombier  * Extending this line of thinking, one could also add color space information
1167dd7cddfSDavid du Colombier  * to a client bitmap structure. We have chosen not to do so, because color
1177dd7cddfSDavid du Colombier  * space is almost always derived from context, and to provide such a feature
1187dd7cddfSDavid du Colombier  * would involve additional memory-management complexity.
1197dd7cddfSDavid du Colombier  */
1207dd7cddfSDavid du Colombier #define gs_depth_bitmap_common(data_type)                           \
1217dd7cddfSDavid du Colombier     gs_bitmap_common(data_type);                                    \
1227dd7cddfSDavid du Colombier     byte     pix_depth;      /* bits per sample */                  \
1237dd7cddfSDavid du Colombier     byte     num_comps      /* number of interleaved components */  \
1247dd7cddfSDavid du Colombier 
1257dd7cddfSDavid du Colombier typedef struct gs_depth_bitmap_s {
1267dd7cddfSDavid du Colombier     gs_depth_bitmap_common(byte);
1277dd7cddfSDavid du Colombier } gs_depth_bitmap;
1287dd7cddfSDavid du Colombier typedef struct gs_const_depth_bitmap_s {
1297dd7cddfSDavid du Colombier     gs_depth_bitmap_common(const byte);
1307dd7cddfSDavid du Colombier } gs_const_depth_bitmap;
1317dd7cddfSDavid du Colombier 
1327dd7cddfSDavid du Colombier #define gs_tile_depth_bitmap_common(data_type)                      \
1337dd7cddfSDavid du Colombier     gs_tile_bitmap_common(data_type);                               \
1347dd7cddfSDavid du Colombier     byte     pix_depth;     /* bits per sample */                   \
1357dd7cddfSDavid du Colombier     byte     num_comps      /* number of interleaved components */  \
1367dd7cddfSDavid du Colombier 
1377dd7cddfSDavid du Colombier typedef struct gs_tile_depth_bitmap_s {
1387dd7cddfSDavid du Colombier     gs_tile_depth_bitmap_common(byte);
1397dd7cddfSDavid du Colombier } gs_tile_depth_bitmap;
1407dd7cddfSDavid du Colombier typedef struct gs_const_tile_depth_bitmap_s {
1417dd7cddfSDavid du Colombier     gs_tile_depth_bitmap_common(const byte);
1427dd7cddfSDavid du Colombier } gs_const_tile_depth_bitmap;
1437dd7cddfSDavid du Colombier 
1447dd7cddfSDavid du Colombier /*
1457dd7cddfSDavid du Colombier  * For reasons that are no entirely clear, no memory management routines were
1467dd7cddfSDavid du Colombier  * provided for the aligned bitmap structures provided in gxbitmap.h. Since
1477dd7cddfSDavid du Colombier  * client bitmaps will, by nature, be created by different clients, so public
1487dd7cddfSDavid du Colombier  * memory management procedures are provided. Note that the memory management
1497dd7cddfSDavid du Colombier  * structure names retain the "gs_" prefix, to distinguish these structures
1507dd7cddfSDavid du Colombier  * from those that may be provided for the gx_*_bitmap structures.
1517dd7cddfSDavid du Colombier  *
1527dd7cddfSDavid du Colombier  * For historical reasons of no particular validity (this was where the client
1537dd7cddfSDavid du Colombier  * bitmap structure was first provided), the memory managment procedures for
1547dd7cddfSDavid du Colombier  * client bitmap structures are included in gspcolor.c.
1557dd7cddfSDavid du Colombier  */
1567dd7cddfSDavid du Colombier extern_st(st_gs_bitmap);
1577dd7cddfSDavid du Colombier extern_st(st_gs_tile_bitmap);
1587dd7cddfSDavid du Colombier extern_st(st_gs_depth_bitmap);
1597dd7cddfSDavid du Colombier extern_st(st_gs_tile_depth_bitmap);
1607dd7cddfSDavid du Colombier 
1617dd7cddfSDavid du Colombier #define public_st_gs_bitmap()   /* in gspcolor.c */ \
1627dd7cddfSDavid du Colombier     gs_public_st_ptrs1( st_gs_bitmap,               \
1637dd7cddfSDavid du Colombier                         gs_bitmap,                  \
1647dd7cddfSDavid du Colombier                         "client bitmap",            \
1657dd7cddfSDavid du Colombier                         bitmap_enum_ptrs,           \
1667dd7cddfSDavid du Colombier                         bitmap_reloc_ptrs,          \
1677dd7cddfSDavid du Colombier                         data                        \
1687dd7cddfSDavid du Colombier                         )
1697dd7cddfSDavid du Colombier 
1707dd7cddfSDavid du Colombier #define public_st_gs_tile_bitmap()  /* in gspcolor.c */ \
1717dd7cddfSDavid du Colombier     gs_public_st_suffix_add0_local( st_gs_tile_bitmap,        \
1727dd7cddfSDavid du Colombier 				    gs_tile_bitmap,           \
1737dd7cddfSDavid du Colombier 				    "client tile bitmap",     \
1747dd7cddfSDavid du Colombier 				    bitmap_enum_ptrs,    \
1757dd7cddfSDavid du Colombier 				    bitmap_reloc_ptrs,   \
1767dd7cddfSDavid du Colombier 				    st_gs_bitmap              \
1777dd7cddfSDavid du Colombier 				    )
1787dd7cddfSDavid du Colombier 
1797dd7cddfSDavid du Colombier #define public_st_gs_depth_bitmap() /* in gspcolor.c */ \
1807dd7cddfSDavid du Colombier     gs_public_st_suffix_add0_local( st_gs_depth_bitmap,       \
1817dd7cddfSDavid du Colombier 				    gs_depth_bitmap,          \
1827dd7cddfSDavid du Colombier 				    "client depth bitmap",    \
1837dd7cddfSDavid du Colombier 				    bitmap_enum_ptrs,   \
1847dd7cddfSDavid du Colombier 				    bitmap_reloc_ptrs,  \
1857dd7cddfSDavid du Colombier 				    st_gs_bitmap              \
1867dd7cddfSDavid du Colombier 				    )
1877dd7cddfSDavid du Colombier 
1887dd7cddfSDavid du Colombier #define public_st_gs_tile_depth_bitmap()/* in gspcolor.c */ \
1897dd7cddfSDavid du Colombier     gs_public_st_suffix_add0_local( st_gs_tile_depth_bitmap,      \
1907dd7cddfSDavid du Colombier 				    gs_tile_depth_bitmap,         \
1917dd7cddfSDavid du Colombier 				    "client tile_depth bitmap",   \
1927dd7cddfSDavid du Colombier 				    bitmap_enum_ptrs,  \
1937dd7cddfSDavid du Colombier 				    bitmap_reloc_ptrs, \
1947dd7cddfSDavid du Colombier 				    st_gs_tile_bitmap             \
1957dd7cddfSDavid du Colombier 				    )
1967dd7cddfSDavid du Colombier 
1977dd7cddfSDavid du Colombier #endif /* gsbitmap_INCLUDED */
198