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