You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2117 lines
87 KiB
2117 lines
87 KiB
/*++
|
|
|
|
Copyright (c) 1990-1999 Microsoft Corporation
|
|
|
|
|
|
Module Name:
|
|
|
|
ht.h
|
|
|
|
|
|
Abstract:
|
|
|
|
This module contains all the public defines, constants, structures and
|
|
functions declarations for accessing the DLL.
|
|
|
|
Author:
|
|
|
|
15-Jan-1991 Tue 21:13:21 created -by- Daniel Chou (danielc)
|
|
|
|
[Environment:]
|
|
|
|
GDI Device Driver - Halftone.
|
|
|
|
|
|
[Notes:]
|
|
|
|
|
|
Revision History:
|
|
|
|
29-Oct-1991 Tue 14:33:43 updated -by- Daniel Chou (danielc)
|
|
|
|
1) Change HALFTONEPATTERN data structure.
|
|
|
|
a) 'Flags' field from WORD to BYTE
|
|
b) 'MaximumHTDensityIndex' from WORD to BYTE
|
|
c) Change the field order.
|
|
|
|
2) Remove ReferenceWhite/ReferenceBlack from HTCOLORADJUSTMENT data
|
|
structure.
|
|
|
|
3)
|
|
|
|
--*/
|
|
|
|
#ifndef _HT_
|
|
#define _HT_
|
|
|
|
//
|
|
// For compilers that don't support nameless unions
|
|
//
|
|
|
|
#ifndef DUMMYUNIONNAME
|
|
#ifdef NONAMELESSUNION
|
|
#define DUMMYUNIONNAME u
|
|
#define DUMMYUNIONNAME2 u2
|
|
#define DUMMYUNIONNAME3 u3
|
|
#define DUMMYUNIONNAME4 u4
|
|
#else
|
|
#define DUMMYUNIONNAME
|
|
#define DUMMYUNIONNAME2
|
|
#define DUMMYUNIONNAME3
|
|
#define DUMMYUNIONNAME4
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef far
|
|
#define far
|
|
#endif
|
|
|
|
#ifndef FAR
|
|
#define FAR far
|
|
#endif
|
|
|
|
typedef CHAR FAR *LPCHAR;
|
|
typedef SHORT FAR *LPSHORT;
|
|
typedef UINT FAR *LPUINT;
|
|
|
|
//
|
|
// The DECI4/UDECI4 is a special number used in halftone DLL, this number
|
|
// just like regular short, unsigned short number, except it using lower
|
|
// four decimal digits as right side of the decimal point, that is
|
|
// 10000 is as 1.0000, and -12345 will be -1.2345.
|
|
//
|
|
|
|
typedef short DECI4;
|
|
typedef unsigned short UDECI4;
|
|
typedef DECI4 FAR *PDECI4;
|
|
typedef UDECI4 FAR *PUDECI4;
|
|
|
|
#define DECI4_0 (DECI4)0
|
|
#define DECI4_1 (DECI4)10000
|
|
#define DECI4_Neg1 (DECI4)-10000
|
|
#define UDECI4_0 (UDECI4)0
|
|
#define UDECI4_1 (UDECI4)10000
|
|
|
|
|
|
#define SIZE_BYTE sizeof(BYTE)
|
|
#define SIZE_CHAR sizeof(CHAR)
|
|
#define SIZE_WORD sizeof(WORD)
|
|
#define SIZE_SHORT sizeof(SHORT)
|
|
#define SIZE_LONG sizeof(LONG)
|
|
#define SIZE_DWORD sizeof(DWORD)
|
|
#define SIZE_UINT sizeof(UINT)
|
|
#define SIZE_INT sizeof(INT)
|
|
#define SIZE_UDECI4 sizeof(UDECI4)
|
|
#define SIZE_DECI4 sizeof(DECI4)
|
|
|
|
#define COUNT_ARRAY(array) (sizeof(array) / sizeof(array[0]))
|
|
|
|
#define B_BITPOS(x) ((BYTE)(1 << (x)))
|
|
#define W_BITPOS(x) ((WORD)(1 << (x)))
|
|
#define DW_BITPOS(x) ((DWORD)(1 << (x)))
|
|
#define BIT_IF(b,t) (((t)) ? (b) : ((b)-(b)))
|
|
#define SET_BIT(x,b) ((x) |= (b))
|
|
#define CLR_BIT(x,b) ((x) &= ~(b))
|
|
#define INV_BIT(x,b) ((x) ^= (b))
|
|
#define HAS_BIT(x,b) ((x) & (b))
|
|
|
|
|
|
//
|
|
// The following are the error return values for the HTHalftoneBitmap() call.
|
|
//
|
|
|
|
#define HTERR_WRONG_VERSION_HTINITINFO -1
|
|
#define HTERR_INSUFFICIENT_MEMORY -2
|
|
#define HTERR_CANNOT_DEALLOCATE_MEMORY -3
|
|
#define HTERR_COLORTABLE_TOO_BIG -4
|
|
#define HTERR_QUERY_SRC_BITMAP_FAILED -5
|
|
#define HTERR_QUERY_DEST_BITMAP_FAILED -6
|
|
#define HTERR_QUERY_SRC_MASK_FAILED -7
|
|
#define HTERR_SET_DEST_BITMAP_FAILED -8
|
|
#define HTERR_INVALID_SRC_FORMAT -9
|
|
#define HTERR_INVALID_SRC_MASK_FORMAT -10
|
|
#define HTERR_INVALID_DEST_FORMAT -11
|
|
#define HTERR_INVALID_DHI_POINTER -12
|
|
#define HTERR_SRC_MASK_BITS_TOO_SMALL -13
|
|
#define HTERR_INVALID_HTPATTERN_INDEX -14
|
|
#define HTERR_INVALID_HALFTONE_PATTERN -15
|
|
#define HTERR_HTPATTERN_SIZE_TOO_BIG -16
|
|
#define HTERR_NO_SRC_COLORTRIAD -17
|
|
#define HTERR_INVALID_COLOR_TABLE -18
|
|
#define HTERR_INVALID_COLOR_TYPE -29
|
|
#define HTERR_INVALID_COLOR_TABLE_SIZE -20
|
|
#define HTERR_INVALID_PRIMARY_SIZE -21
|
|
#define HTERR_INVALID_PRIMARY_VALUE_MAX -22
|
|
#define HTERR_INVALID_PRIMARY_ORDER -23
|
|
#define HTERR_INVALID_COLOR_ENTRY_SIZE -24
|
|
#define HTERR_INVALID_FILL_SRC_FORMAT -25
|
|
#define HTERR_INVALID_FILL_MODE_INDEX -26
|
|
#define HTERR_INVALID_STDMONOPAT_INDEX -27
|
|
#define HTERR_INVALID_DEVICE_RESOLUTION -28
|
|
#define HTERR_INVALID_TONEMAP_VALUE -29
|
|
#define HTERR_NO_TONEMAP_DATA -30
|
|
#define HTERR_TONEMAP_VALUE_IS_SINGULAR -31
|
|
#define HTERR_INVALID_BANDRECT -32
|
|
#define HTERR_STRETCH_RATIO_TOO_BIG -33
|
|
#define HTERR_CHB_INV_COLORTABLE_SIZE -34
|
|
#define HTERR_HALFTONE_INTERRUPTTED -35
|
|
#define HTERR_NO_SRC_HTSURFACEINFO -36
|
|
#define HTERR_NO_DEST_HTSURFACEINFO -37
|
|
#define HTERR_8BPP_PATSIZE_TOO_BIG -38
|
|
#define HTERR_16BPP_555_PATSIZE_TOO_BIG -39
|
|
#define HTERR_INVALID_ABINFO -40
|
|
#define HTERR_INTERNAL_ERRORS_START -10000
|
|
|
|
|
|
#define COLOR_TYPE_RGB 0
|
|
#define COLOR_TYPE_XYZ 1
|
|
#define COLOR_TYPE_YIQ 2
|
|
#define COLOR_TYPE_MAX 2
|
|
|
|
#define PRIMARY_ORDER_123 0
|
|
#define PRIMARY_ORDER_132 1
|
|
#define PRIMARY_ORDER_213 2
|
|
#define PRIMARY_ORDER_231 3
|
|
#define PRIMARY_ORDER_321 4
|
|
#define PRIMARY_ORDER_312 5
|
|
#define PRIMARY_ORDER_MAX 5
|
|
|
|
#define PRIMARY_ORDER_RGB PRIMARY_ORDER_123
|
|
#define PRIMARY_ORDER_RBG PRIMARY_ORDER_132
|
|
#define PRIMARY_ORDER_GRB PRIMARY_ORDER_213
|
|
#define PRIMARY_ORDER_GBR PRIMARY_ORDER_231
|
|
#define PRIMARY_ORDER_BGR PRIMARY_ORDER_321
|
|
#define PRIMARY_ORDER_BRG PRIMARY_ORDER_312
|
|
|
|
#define PRIMARY_ORDER_CMY PRIMARY_ORDER_123
|
|
#define PRIMARY_ORDER_CYM PRIMARY_ORDER_132
|
|
#define PRIMARY_ORDER_MCY PRIMARY_ORDER_213
|
|
#define PRIMARY_ORDER_MYC PRIMARY_ORDER_231
|
|
#define PRIMARY_ORDER_YMC PRIMARY_ORDER_321
|
|
#define PRIMARY_ORDER_YCM PRIMARY_ORDER_312
|
|
|
|
#define PRIMARY_ORDER_XYZ PRIMARY_ORDER_123
|
|
#define PRIMARY_ORDER_XZY PRIMARY_ORDER_132
|
|
#define PRIMARY_ORDER_YXZ PRIMARY_ORDER_213
|
|
#define PRIMARY_ORDER_YZX PRIMARY_ORDER_231
|
|
#define PRIMARY_ORDER_ZYX PRIMARY_ORDER_321
|
|
#define PRIMARY_ORDER_ZXY PRIMARY_ORDER_312
|
|
|
|
#define PRIMARY_ORDER_YIQ PRIMARY_ORDER_123
|
|
#define PRIMARY_ORDER_YQI PRIMARY_ORDER_132
|
|
#define PRIMARY_ORDER_IYQ PRIMARY_ORDER_213
|
|
#define PRIMARY_ORDER_IQY PRIMARY_ORDER_231
|
|
#define PRIMARY_ORDER_QIY PRIMARY_ORDER_321
|
|
#define PRIMARY_ORDER_QYI PRIMARY_ORDER_312
|
|
|
|
//
|
|
// COLORTRIAD
|
|
//
|
|
// This data structure describe the source color informations
|
|
//
|
|
// Type - One of the following type may be specified.
|
|
//
|
|
// COLOR_TYPE_RGB - primaries are RGB.
|
|
// COLOR_TYPE_XYZ - primaries are CIE XYZ.
|
|
// COLOR_TYPE_YIQ - primaries are NTSC YIQ.
|
|
//
|
|
// BytesPerPrimary - Specified how many bytes used per primary color, it
|
|
// must be one of the following
|
|
//
|
|
// 1 - BYTE
|
|
// 2 - WORD
|
|
// 4 - DWORD
|
|
//
|
|
// All 3 primaries must be consecutive in memory.
|
|
//
|
|
// BytesPerEntry - Specified how many bytes used for color table entry,
|
|
// each entry specified 3 primaries colors.
|
|
//
|
|
// PrimaryOrder - The primaries order in the color table, it can be
|
|
// one of the defined PRIMARY_ORDER_abc, for each entry
|
|
// in the memory it defined as
|
|
//
|
|
// PRIMARY_ORDER_abc
|
|
// |||
|
|
// ||+-- highest memory location
|
|
// ||
|
|
// |+--- middle
|
|
// |
|
|
// +---- Lowest memory location
|
|
//
|
|
// All 3 primaries must be consecutive in memory.
|
|
//
|
|
// PrimaryValueMax - The maximum value for the primary color, this is used
|
|
// to nomalized the input colors, for example a 8-bit
|
|
// RGB color table will specified 255.
|
|
//
|
|
// ColorTableEntries - Total entries of the color table pointed by the
|
|
// pColorTable.
|
|
//
|
|
// pColorTable - Pointer to the start of color table, the size of the
|
|
// this color table must at least (BytesPerEntry *
|
|
// ColorTableEntries).
|
|
//
|
|
// If the first primary color in the color table entry
|
|
// is not at first byte of the pColorTable, then caller
|
|
// must specified the pColorTable at first primary
|
|
// color. (pColorTable += Offset(first primary).
|
|
//
|
|
//
|
|
|
|
typedef struct _COLORTRIAD {
|
|
BYTE Type;
|
|
BYTE BytesPerPrimary;
|
|
BYTE BytesPerEntry;
|
|
BYTE PrimaryOrder;
|
|
LONG PrimaryValueMax;
|
|
DWORD ColorTableEntries;
|
|
LPVOID pColorTable;
|
|
} COLORTRIAD, FAR *PCOLORTRIAD;
|
|
|
|
|
|
//
|
|
// HTSURFACEINFO
|
|
//
|
|
// This data structure describe the the input/output surface in order for
|
|
// halftone function to render the output, this data structure only used for
|
|
// the memory device.
|
|
//
|
|
// hSurface - This is 32-bits handle which will be passed back
|
|
// to the caller's callback function.
|
|
//
|
|
// Flags - One or more following flags may be defined
|
|
//
|
|
// HTSIF_SCANLINES_TOPDOWN
|
|
//
|
|
// This flag is ignored
|
|
//
|
|
// SurfaceFormat - Following formats are defined
|
|
//
|
|
// BMF_1BPP
|
|
//
|
|
// 1-bit per pel format, this is the index
|
|
// number (0 or 1) for the color table/palette.
|
|
//
|
|
// BMF_4BPP
|
|
//
|
|
// 4-bit per pel and pack two pels to a byte
|
|
// starting from high nibble (bit 4-7) format,
|
|
// this is the index number (0-7) for the
|
|
// color table/palette. (ONLY LOW 3 bits of
|
|
// the nibble is used)
|
|
//
|
|
// BMF_4BPP_VGA16
|
|
//
|
|
// 4-bit per pel and pack two pels to a byte
|
|
// starting from high nibble (bit 4-7) format,
|
|
// this is the index number (0-15) for the
|
|
// standard VGA 16 colors table/palette.
|
|
//
|
|
// The different from BMF_4BPP is this indices
|
|
// are fixed to standard VGA 16 colors as
|
|
//
|
|
// Index# Colors Lightness
|
|
// ---------------------------------
|
|
// 0 Black 0%
|
|
// 1 Red 50%
|
|
// 2 Green 50%
|
|
// 3 Yellow 50%
|
|
// 4 Blue 50%
|
|
// 5 Magenata 50%
|
|
// 6 Cyan 50%
|
|
// 7 Gray 50%
|
|
// 8 Gray 75%
|
|
// 9 Red 100%
|
|
// 10 Green 100%
|
|
// 11 Yellow 100%
|
|
// 12 Blue 100%
|
|
// 13 Magenata 100%
|
|
// 14 Cyan 100%
|
|
// 15 White 100%
|
|
//
|
|
// Notice that the color order is
|
|
//
|
|
// Bit 2 = Blue, Bit 1 = Green, Bit 0 = Red
|
|
//
|
|
// This format can only be used as destination
|
|
// surface, when used as destination surface
|
|
// the halftone dll automatically set it to
|
|
// USE_ADDITIVE_PRIMS and set the primaries
|
|
// order as PRIMARY_ORDER_BGR.
|
|
//
|
|
// BMF_8BPP
|
|
//
|
|
// 8-bit per pel format (1 byte each), this is
|
|
// the index number (0-255) for the color
|
|
// table/palette. The format is not allowed
|
|
// for the destination surface.
|
|
//
|
|
// BMF_8BPP_VGA256
|
|
//
|
|
// 8-bit per pel format (1 byte each), this is
|
|
// the index number (0-255) for the color
|
|
// table/palette.
|
|
//
|
|
// The different from BMF_8BPP is this indices
|
|
// are fixed to halftone special colors.
|
|
//
|
|
// The color table (palette) is defined by
|
|
// halftone.dll, the display should call
|
|
// HT_Get8BPPFormatPalette() api call to get
|
|
// the current palette used by the halftone.
|
|
//
|
|
// The HT_GetBPPFormatPalette() will only need
|
|
// to called once until next time the display
|
|
// caliberation occurred.
|
|
//
|
|
// Halftone.dll will not used all 256 colors
|
|
// in the system palette, it will leave some
|
|
// 20 or more entries for the system colors.
|
|
//
|
|
// BMF_16BPP
|
|
//
|
|
// 16-bit per pel format (16 bits each), this
|
|
// is the index number (0-65535) for the color
|
|
// table/palette. The format is not allowed
|
|
// for the destination surface.
|
|
//
|
|
// BMF_16BPP_555
|
|
//
|
|
// 16-bit per pel format (only 15 bits used),
|
|
// each primary occupy 5 bits, the layout of
|
|
// bits as follow
|
|
//
|
|
// bit 10-15 - Primary A
|
|
// bit 5- 9 - Primary B
|
|
// bit 0- 4 - Primary C
|
|
//
|
|
// The order of the Primary A, B and C is
|
|
// specfied by PRIMARY_ORDER_xxx.
|
|
//
|
|
// for each primary there are 32 gradations,
|
|
// and halftone.dll output is assume to be
|
|
// linear. (non-gamma corrected), this format
|
|
// only allowed for destination surface.
|
|
//
|
|
// BMF_24BPP
|
|
//
|
|
// 24-bit per pel format (8-bit per color),
|
|
// the order of RGB color stored in the source
|
|
// bitmap or color table.
|
|
//
|
|
// BMF_32BPP
|
|
//
|
|
// Same as BMF_24BPP but with extra byte
|
|
// packing, if the extra byte is packed at
|
|
// begining (the first color is starting from
|
|
// second byte of that 4 bytes) then caller
|
|
// must set the pColorTable = pColorTable + 1
|
|
// or set pPlane = pPlane + 1, to skip first
|
|
// unused byte.
|
|
//
|
|
// NOTE: Allowed source formats are
|
|
//
|
|
// 1) BMF_1BPP
|
|
// 2) BMF_4BPP
|
|
// 3) BMF_8BPP
|
|
// 4) BMF_16BPP
|
|
// 5) BMF_24BPP
|
|
// 6) BMF_32BPP
|
|
//
|
|
// Allowed destination formats are
|
|
//
|
|
// 1) BMF_1BPP
|
|
// 2) BMF_4BPP
|
|
// 3) BMF_4BPP_VGA16
|
|
// 4) BMF_8BPP_VGA256
|
|
// 5) BMF_16BPP_555
|
|
//
|
|
// Any other mismatch cause error returned.
|
|
//
|
|
// ScanLineAlignBytes - Total bytes needed to aligned for each scan line
|
|
// in the surface bitmap, it can be any unsigned
|
|
// 8-bit number, the common ones are defined as
|
|
//
|
|
// BMF_ALIGN_BYTE ( 8-bit aligned)
|
|
// BMF_ALIGN_WORD (16-bit aligned)
|
|
// BMF_ALIGN_DWORD (32-bit aligned)
|
|
// BMF_ALIGN_QWORD (64-bit aligned)
|
|
//
|
|
// Width - The width of the surface in pels.
|
|
//
|
|
// Height - The height of the surface in scan lines.
|
|
//
|
|
// ScanLineDelta - Specified scan lines Delta in bytes, this member
|
|
// indicate how many bytes to be added for advanced
|
|
// to next scan line
|
|
//
|
|
// pPlane - This pointer points to the first scan line in
|
|
// the defined surface, Scan #0 that is.
|
|
//
|
|
// pColorTriad - Pointe to the COLORTRIAD data structure to
|
|
// specified the source color table, this pointer
|
|
// only examined by the halftone.dll for source
|
|
// surface.
|
|
//
|
|
|
|
|
|
#if !defined( BMF_DEVICE ) && \
|
|
!defined( BMF_1BPP ) && \
|
|
!defined( BMF_4BPP ) && \
|
|
!defined( BMF_8BPP ) && \
|
|
!defined( BMF_16BPP ) && \
|
|
!defined( BMF_24BPP ) && \
|
|
!defined( BMF_32BPP )
|
|
|
|
#define BMF_1BPP 1
|
|
#define BMF_4BPP 2
|
|
#define BMF_8BPP 3
|
|
#define BMF_16BPP 4
|
|
#define BMF_24BPP 5
|
|
#define BMF_32BPP 6
|
|
|
|
#endif
|
|
|
|
#define BMF_4BPP_VGA16 255
|
|
#define BMF_8BPP_VGA256 254
|
|
#define BMF_16BPP_555 253
|
|
#define BMF_16BPP_565 252
|
|
#define BMF_HT_LAST BMF_16BPP_565
|
|
|
|
|
|
//
|
|
// Following are common used alignment bytes for the bitmap
|
|
//
|
|
|
|
#define BMF_ALIGN_BYTE 1 // 8 bits = 1 byte
|
|
#define BMF_ALIGN_WORD 2 // 16 bits = 2 bytes
|
|
#define BMF_ALIGN_DWORD 4 // 32 bits = 4 bytes
|
|
#define BMF_ALIGN_QWORD 8 // 64 bits = 8 bytes
|
|
|
|
|
|
|
|
|
|
|
|
#define HTSIF_SCANLINES_TOPDOWN W_BITPOS(0)
|
|
|
|
|
|
typedef struct _HTSURFACEINFO {
|
|
ULONG_PTR hSurface;
|
|
WORD Flags;
|
|
BYTE SurfaceFormat;
|
|
BYTE ScanLineAlignBytes;
|
|
LONG Width;
|
|
LONG Height;
|
|
LONG ScanLineDelta;
|
|
LPBYTE pPlane;
|
|
PCOLORTRIAD pColorTriad;
|
|
} HTSURFACEINFO;
|
|
|
|
typedef HTSURFACEINFO FAR *PHTSURFACEINFO;
|
|
|
|
|
|
//
|
|
// HTCALLBACKPARAMS
|
|
//
|
|
// This is structure is used durning the bitmap halftone process to obtains
|
|
// the source or destination bitmap surface pointers.
|
|
//
|
|
//
|
|
// hSurface - This is the handle which passed to the
|
|
// halftone DLL, durning the HTHalftoneBitmap() call,
|
|
// (in HTSURFACEINFO data structure) it may be
|
|
// handle to source or destination depends on the
|
|
// nature of the callback.
|
|
//
|
|
// CallBackMode - Specified the nature of the callback.
|
|
//
|
|
// HTCALLBACK_QUERY_SRC
|
|
//
|
|
// The callback is quering the source bitmap
|
|
// pointer.
|
|
//
|
|
// HTCALLBACK_QUERY_SRC_MASK
|
|
//
|
|
// The callback is quering the source mask
|
|
// bitmap pointer.
|
|
//
|
|
// HTCALLBACK_QUERY_DEST
|
|
//
|
|
// The callback is quering the destination
|
|
// bitmap pointer(s).
|
|
//
|
|
// HTCALLBACK_SET_DEST
|
|
//
|
|
// The callback is used to release halftoned
|
|
// destination. It will called in following
|
|
// conditions:
|
|
//
|
|
// 1) Before HTCALLBACK_QUERY_DEST call
|
|
// except for the very first query
|
|
// destination.
|
|
//
|
|
// 2) After the halftone process is
|
|
// completed. This give the chance for
|
|
// the caller to process the last
|
|
// halftoned destination block.
|
|
//
|
|
// SurfaceFormat - This is the surface format specified in the
|
|
// original HTSURFACEINFO.
|
|
//
|
|
// Flags - This is the copy of HTSURFACEINFO.Flags.
|
|
//
|
|
// BytesPerScanLine - This is the total bytes per scan line for the
|
|
// surface bitmap which computed by the halftone
|
|
// DLL according to the 'ScanLineAlignBytes' in the
|
|
// HTSURFACEINFO data structure, it can be used by
|
|
// the caller to calculate source/destination
|
|
// pointers information.
|
|
//
|
|
// ScanStart - Requested starting scan line number, the scan
|
|
// lines are number from 0 up, this number will
|
|
// guaranteed has following propertites:
|
|
//
|
|
// 1) It always greater than or equal to zero.
|
|
// 2) It will never greater than or equal to the
|
|
// 'height' field specified in the
|
|
// HTSURFACEINFO.
|
|
//
|
|
// NOTE: for banding destination surface it
|
|
// will never greater than or equal to
|
|
// the (rclBand.bottom - rclBand.top).
|
|
//
|
|
// 3) The scan line number 0 always refer to the
|
|
// physical lowest bitmap memory location
|
|
// regardless HTSIF_SCANLINES_TOPDOWN flag set
|
|
// or not, durning callback the caller only
|
|
// need to compute array like bitmap buffer,
|
|
// halftone DLL will compute the correct
|
|
// ScanStart if the bitmap is not TOPDOWN.
|
|
//
|
|
// ScanCount - Total scan lines requested starting from
|
|
// ScanStart, this number will guaranteed has
|
|
// following propertites:
|
|
//
|
|
// 1) It always greater than zero.
|
|
// 2) Never greater then the MaximumQueryScanLines
|
|
// specified for the surface (in HTSURFACEINFO
|
|
// data structure).
|
|
//
|
|
// NOTE: for banding destination surface it
|
|
// will never greater than the
|
|
// (rclBand.bottom - rclBand.top).
|
|
//
|
|
// NOTE: 1) ScanStart/ScanCount
|
|
//
|
|
// If the flags HTSURFACEINFO data
|
|
// structure HTSIF_SCANLINES_TOPDOWN is not
|
|
// specified then halftone DLL automatically
|
|
// calculate the correct ScanStart/ScanCount
|
|
// for read/write the up-side-down bitmap.
|
|
//
|
|
// For example:
|
|
//
|
|
// If the surface bitmap is up-side-down
|
|
// type DIB) and has 100 scan lines height
|
|
// (scan line #99 is the top of the bitmap),
|
|
// if halftone DLL need to get to scan line
|
|
// 10-14 (Start from scan line 10 and 5
|
|
// lines) then halftone DLL will flip Y,
|
|
// and passed ScanStart = 85 and ScanCount
|
|
// = 5, but if the HTSIF_SCANLINES_TOPDOWN
|
|
// flag is set (Non DIB type format) then
|
|
// callback parameters will then be
|
|
// ScanStart = 10 and ScanCount = 5.
|
|
//
|
|
// 2) The ScanStart for the callback function
|
|
// always consider the lowest bitmap in the
|
|
// memory as scan line 0, that is when
|
|
// callback fucntion received control, it
|
|
// only need to consider the ScanStart as
|
|
// physical scan line location which the
|
|
// Scan line #0 always starting from lowest
|
|
// bitmap memory location.
|
|
//
|
|
// 3) The width of the destination buffer is
|
|
// considered as 'Width' field specified
|
|
// for the destination HTSURFACEINFO, if
|
|
// destination is BANDed (horizontal or
|
|
// vertical) then its width is computed as
|
|
// Band.right - Band.left. and the result
|
|
// always Band.left/Band.top aligned.
|
|
//
|
|
// 4) If caller return 'ScanCount' diff from
|
|
// the one requested then caller must check
|
|
//
|
|
// HTSIF_SCANLINES_TOPDOWN flag is SET
|
|
//
|
|
// 1. Process 'ScanStart' and
|
|
// 'ScanCount' fields as normal.
|
|
//
|
|
// 2. Set New ScanCount to passed
|
|
// callback data structure.
|
|
// (ie. HTCallBackParam.ScanCount)
|
|
//
|
|
//
|
|
// HTSIF_SCANLINES_TOPDOWN flag is CLEAR
|
|
//
|
|
// 1. Re-compute 'ScanStart' before
|
|
// compute pPlane as
|
|
//
|
|
// ScanStart = ScanStart -
|
|
// (NewScanCount -
|
|
// RequsetedScanCount)
|
|
//
|
|
// 2. Process 'ScanStart' and
|
|
// 'ScanCount' fields as normal.
|
|
//
|
|
// 3. Set New ScanStart to passed
|
|
// callback data structure.
|
|
// (ie. HTCallBackParam.ScanStart)
|
|
//
|
|
// 4. Set New ScanCount to passed
|
|
// callback data structure.
|
|
// (ie. HTCallBackParam.ScanCount)
|
|
//
|
|
// The returned new 'ScanCount' must not
|
|
// greater then the 'RemainedSize' field.
|
|
//
|
|
// MaximumQueryScanLines - This is the copy of the MaximumQueryScanLines
|
|
// field from the HTSURFACEINFO data structure which
|
|
// passed to the the HT_HaltoneBitmap() calls.
|
|
// Depends on the nature of the callback, it may be
|
|
// source or destination.
|
|
//
|
|
// NOTE: for banding surface, it will be limited to
|
|
// (rclBand.bottom - rclBand.top) if it is
|
|
// greater than that number.
|
|
//
|
|
// RemainedSize - This field specified how many scan lines remained
|
|
// to be queried, the remainded scan lines are not
|
|
// include current call.
|
|
//
|
|
// pPlane - pointer points to the begining of first plane of
|
|
// the surface. If the callback is quering the
|
|
// source then this is the only pointer which need
|
|
// to be updated by the callback function.
|
|
//
|
|
// NOTE: The pPlane must points to the first byte
|
|
// of the 'ScanStart' scan line number.
|
|
//
|
|
// Field(s) returned from callback
|
|
//
|
|
// 1) HTCALLBACK_QUERY_SRC - pPlane (Options: ScanStart/ScanCount)
|
|
// 2) HTCALLBACK_QUERY_SRC_MASK - pPlane (Options: ScanStart/ScanCount)
|
|
// 2) HTCALLBACK_QUERY_DEST - pPlane (Options: ScanStart/ScanCount)
|
|
// 4) HTCALLBACK_SET_DEST - none.
|
|
//
|
|
|
|
|
|
#define HTCALLBACK_QUERY_SRC 0
|
|
#define HTCALLBACK_QUERY_SRC_MASK 1
|
|
#define HTCALLBACK_QUERY_DEST 2
|
|
#define HTCALLBACK_SET_DEST 3
|
|
#define HTCALLBACK_MODE_MAX HTCALLBACK_SET_DEST
|
|
|
|
typedef struct _HTCALLBACKPARAMS {
|
|
ULONG_PTR hSurface;
|
|
BYTE CallBackMode;
|
|
BYTE SurfaceFormat;
|
|
WORD Flags;
|
|
LONG BytesPerScanLine;
|
|
LONG ScanStart;
|
|
WORD ScanCount;
|
|
WORD MaximumQueryScanLines;
|
|
LONG RemainedSize;
|
|
LPBYTE pPlane;
|
|
} HTCALLBACKPARAMS;
|
|
|
|
typedef HTCALLBACKPARAMS FAR *PHTCALLBACKPARAMS;
|
|
|
|
|
|
//
|
|
// _HTCALLBACKFUNC
|
|
//
|
|
// The callback function is used to obtain the source and/destination bitmap
|
|
// surface durning the halftone process, the halftone DLL will using call
|
|
// back function is following sequences.
|
|
//
|
|
// 1) Callback to obtain block of the source bitmap, it depensds on
|
|
// the maximum query scan lines limit by the caller. (in HTSURFACEINFO)
|
|
//
|
|
// 3) Callback to obtain block of the destination bitmap, it depends on
|
|
// the maximum query scan lines limit by the caller. (in HTSURFACEINFO)
|
|
//
|
|
// 4) Repeat 1), 2), 3) until destination maximum queried scan lines are
|
|
// processed then callback to the caller to release the processed
|
|
// destination.
|
|
//
|
|
// 5) Repat 1), 2), 3) and 4) unitil all source/destination scan lines are
|
|
// processed.
|
|
//
|
|
// The return value of the callback is a boolean value, if false the halftone
|
|
// processed is interrupted and an erro code is returned, if callback function
|
|
// return true then halftone DLL assume that all queried scan lines are
|
|
// reachable by the return pointer (in the HTCALLBACKPARAMS data structure).
|
|
//
|
|
// NOTE: 1) If the callback function query for 100 lines and return value is
|
|
// ture then there must all 100 scan lines can be accessable by the
|
|
// halftone dll through the pointer(s).
|
|
//
|
|
// 2) If the caller has all the bitmap in the memory it should set the
|
|
// maximum query scan lines count to the bitmap height to reduced the
|
|
// callback calls.
|
|
//
|
|
// 3) If the caller do not need to released the halftoned destination
|
|
// then it should not set the HTCBPF_NEED_SET_DEST_CALLBACK flag
|
|
// to reduces callback calls.
|
|
//
|
|
// The callback function must be
|
|
//
|
|
// 1) Must return a 16-bit 'BOOLEAN' (TRUE/FALSE)
|
|
// 2) Must 32-bit far function
|
|
// 3) _loadds if you using your data segment at all from callback fuction
|
|
//
|
|
|
|
typedef BOOL (APIENTRY *_HTCALLBACKFUNC)(PHTCALLBACKPARAMS pHTCBParams);
|
|
#define HTCALLBACKFUNCTION BOOL APIENTRY
|
|
|
|
|
|
//
|
|
// HALFTONEPATTERN
|
|
//
|
|
// The HALFTONEPATTERN data structure is used to describe the halftone
|
|
// pattern which will be used by a particular device, if the device choosed
|
|
// to used halftone DLL's default pattern then following data structure will
|
|
// be automatically calculated by the halftone DLL.
|
|
//
|
|
// Flags - Various halftone flags for the cell, can be one
|
|
// of the following:
|
|
//
|
|
// Width - Specified the width of the pattern in pels, this
|
|
// field must not greater than MAX_HTPATTERN_WIDTH.
|
|
//
|
|
// Height - Specified the Width of the pattern in scan line,
|
|
// this field only must not greater than
|
|
// MAX_HTPATTERN_HEIGHT.
|
|
//
|
|
// pHTPatA
|
|
// pHTPatB
|
|
// pHTPatC - Specified caller defined pattern. The data items
|
|
// points by these pointer must have minimum of
|
|
// (Width * Height) bytes.
|
|
//
|
|
// These are the pointers to BYTE array contains
|
|
// threshold data, the size of the array must be
|
|
// 'Width * Height' in bytes. The data in the
|
|
// array should range from 1 to 255, a zero (0)
|
|
// indicate the pixel location is ignored.
|
|
//
|
|
// All thresholds values are indicate additive
|
|
// intensities, a zero indicate black pixel always.
|
|
// a 255 threshold value indicate the pixel always
|
|
// turn on to white.
|
|
//
|
|
// Halftone DLL use this thresholds array with
|
|
// device X, Y, PEL resolution and specified input/
|
|
// output relationship to compute color
|
|
// transformation
|
|
//
|
|
|
|
|
|
#define MAX_HTPATTERN_WIDTH 256
|
|
#define MAX_HTPATTERN_HEIGHT 256
|
|
|
|
//
|
|
// Following are the predefined halftone pattern sizes for 'HTPatternIndex'
|
|
//
|
|
|
|
#define HTPAT_SIZE_2x2 0
|
|
#define HTPAT_SIZE_2x2_M 1
|
|
#define HTPAT_SIZE_4x4 2
|
|
#define HTPAT_SIZE_4x4_M 3
|
|
#define HTPAT_SIZE_6x6 4
|
|
#define HTPAT_SIZE_6x6_M 5
|
|
#define HTPAT_SIZE_8x8 6
|
|
#define HTPAT_SIZE_8x8_M 7
|
|
#define HTPAT_SIZE_10x10 8
|
|
#define HTPAT_SIZE_10x10_M 9
|
|
#define HTPAT_SIZE_12x12 10
|
|
#define HTPAT_SIZE_12x12_M 11
|
|
#define HTPAT_SIZE_14x14 12
|
|
#define HTPAT_SIZE_14x14_M 13
|
|
#define HTPAT_SIZE_16x16 14
|
|
#define HTPAT_SIZE_16x16_M 15
|
|
#define HTPAT_SIZE_SUPERCELL 16
|
|
#define HTPAT_SIZE_SUPERCELL_M 17
|
|
#define HTPAT_SIZE_USER 18
|
|
#define HTPAT_SIZE_MAX_INDEX HTPAT_SIZE_USER
|
|
#define HTPAT_SIZE_DEFAULT HTPAT_SIZE_SUPERCELL_M
|
|
|
|
|
|
typedef struct _HALFTONEPATTERN {
|
|
WORD cbSize;
|
|
WORD Flags;
|
|
WORD Width;
|
|
WORD Height;
|
|
LPBYTE pHTPatA;
|
|
LPBYTE pHTPatB;
|
|
LPBYTE pHTPatC;
|
|
} HALFTONEPATTERN, FAR *PHALFTONEPATTERN;
|
|
|
|
|
|
//
|
|
// CIECOORD
|
|
//
|
|
// This data structure defined a C.I.E color space coordinate point, the
|
|
// coordinate is in DECI4 format.
|
|
//
|
|
// x - x coordinate in C.I.E color space
|
|
//
|
|
// y - y coordinate in C.I.E color space.
|
|
//
|
|
// Y - The liminance for the color
|
|
//
|
|
//
|
|
|
|
#define CIE_x_MIN (UDECI4)10
|
|
#define CIE_x_MAX (UDECI4)8000
|
|
#define CIE_y_MIN (UDECI4)10
|
|
#define CIE_y_MAX (UDECI4)8500
|
|
|
|
typedef struct _CIECOORD {
|
|
UDECI4 x;
|
|
UDECI4 y;
|
|
UDECI4 Y;
|
|
} CIECOORD;
|
|
|
|
typedef CIECOORD FAR *PCIECOORD;
|
|
|
|
|
|
//
|
|
// CIEINFO
|
|
//
|
|
// This data structure describe the red, green, blue, cyan, magenta, yellow
|
|
// and alignment white coordinate in the C.I.E color space plus the Luminance
|
|
// factor, these are used to calculate the C.I.E. transform matrix and its
|
|
// inversion.
|
|
//
|
|
// Red - Red primary color in CIRCOORD format.
|
|
//
|
|
// Green - Green primary color in CIRCOORD format.
|
|
//
|
|
// Blue - Blue primary color in CIRCOORD format.
|
|
//
|
|
// Cyan - Cyan primary color in CIRCOORD format.
|
|
//
|
|
// Magenta - Magenta primary color in CIRCOORD format.
|
|
//
|
|
// Yellow - Yellow primary color in CIRCOORD format.
|
|
//
|
|
// AlignmentWhite - Alignment white in CIECOORD format.
|
|
//
|
|
|
|
|
|
typedef struct _CIEINFO {
|
|
CIECOORD Red;
|
|
CIECOORD Green;
|
|
CIECOORD Blue;
|
|
CIECOORD Cyan;
|
|
CIECOORD Magenta;
|
|
CIECOORD Yellow;
|
|
CIECOORD AlignmentWhite;
|
|
} CIEINFO;
|
|
|
|
typedef CIEINFO FAR *PCIEINFO;
|
|
|
|
//
|
|
// SOLIDDYESINFO
|
|
//
|
|
// This data structure specified device cyan, magenta and yellow dyes
|
|
// concentration.
|
|
//
|
|
// MagentaInCyanDye - Mangenta component proportion in Cyan dye.
|
|
//
|
|
// YellowInCyanDye - Yellow component proportion in Cyan dye.
|
|
//
|
|
// CyanInMagentaDye - Cyan component proportion in Magenta dye.
|
|
//
|
|
// YellowInMagentaDye - Yellow component proportion in Magenta dye.
|
|
//
|
|
// CyanInYellowDye - Yellow component proportion in Cyan dye.
|
|
//
|
|
// MagentaInYellowDye - Magenta component proportion in Cyan dye.
|
|
//
|
|
// NOTE: all fields in this data structure is UDECI4 number, range from
|
|
// UDECI4_0 to UDECI_4, ie,; 0.0 to 1.0, this a inpurity proportion
|
|
// percentge in primary dye, for example a MagentaInCyanDye=1200
|
|
// mean a 0.12% of magenta component is in device Cyan dye.
|
|
//
|
|
|
|
typedef struct _SOLIDDYESINFO {
|
|
UDECI4 MagentaInCyanDye;
|
|
UDECI4 YellowInCyanDye;
|
|
UDECI4 CyanInMagentaDye;
|
|
UDECI4 YellowInMagentaDye;
|
|
UDECI4 CyanInYellowDye;
|
|
UDECI4 MagentaInYellowDye;
|
|
} SOLIDDYESINFO, FAR *PSOLIDDYESINFO;
|
|
|
|
|
|
//
|
|
// HTCOLORADJUSTMENT
|
|
//
|
|
// This data structure is a collection of the device color adjustments, it
|
|
// can be changed at any calls.
|
|
//
|
|
// Flags - CLRADJF_NEGATIVE
|
|
//
|
|
// Produced negative picture
|
|
//
|
|
// CLRADJF_LOG_FILTER
|
|
//
|
|
// Specified a relative logarithm should
|
|
// used to calculate the final density.
|
|
//
|
|
// IlluminantIndex - Specified the default illuminant of the light
|
|
// source which the object will be view under.
|
|
// The predefined value has ILLUMINANT_xxxx
|
|
// form.
|
|
//
|
|
// RedPowerGamma - The n-th power applied to the red color
|
|
// before any other color tramsformations,
|
|
// this is an UDECI4 value.
|
|
//
|
|
// For example if the RED = 0.8 (DECI4=8000)
|
|
// and the RedPowerGammaAdjustment = 0.7823
|
|
// (DECI4 = 7823) then the red is equal to
|
|
//
|
|
// 0.7823
|
|
// 0.8 = 0.8398
|
|
//
|
|
// GreenPowerGamma - The n-th power applied to the green color
|
|
// before any other color transformations, this
|
|
// is an UDECI4 value.
|
|
//
|
|
// BluePowerGamma - The n-th power applied to the blue color
|
|
// before any other color transformations, this
|
|
// is an UDECI4 value.
|
|
//
|
|
// NOTE: RedPowerGamma/GreenPowerGamma/BluePoweGamma are
|
|
// UDECI4 values and range from 100 to 65535 if any
|
|
// one of these values is less than 100 (0.01) then
|
|
// halftone dll automatically set all power gamma
|
|
// adjustments to selected default.
|
|
//
|
|
// ReferenceBlack - The black shadow reference for the colors
|
|
// passed to the halftone dll, if a color's
|
|
// lightness is darker than the reference black
|
|
// then halftone dll will treated as completed
|
|
// blackness and render it with device maximum
|
|
// density.
|
|
//
|
|
// ReferenceWhite - The white hightlight reference for the colors
|
|
// passed to the halftone dll, if a color's
|
|
// lightness is lighter than the reference white
|
|
// then halftone will treated as a specular
|
|
// hightlight and redner with device maximum
|
|
// intensity.
|
|
//
|
|
// NOTE: ReferenceBlack Range: 0.0000 - 0.4000
|
|
// ReferenceWhite Range: 0.6000 - 1.0000
|
|
//
|
|
// Contrast - Primary color contrast adjustment, this is
|
|
// a SHORT number range from -100 to 100, this
|
|
// is the black to white ratio, -100 is the
|
|
// lowest contrast, 100 is the highest and 0
|
|
// indicate no adjustment.
|
|
//
|
|
// Brightness - The brightness adjustment, this is a SHORT
|
|
// number range from -100 to 100, the brightness
|
|
// is adjusted by apply to change the overall
|
|
// saturations for the image, -100 is lowest
|
|
// brightness, 100 is the hightest and a zero
|
|
// indicate no adjustment.
|
|
//
|
|
// Colorfulness - The primary color are so adjusted that it
|
|
// will either toward or away from black/white
|
|
// colors, this is a SHORT number range from
|
|
// -100 to 100. -100 has less colorful, 100 is
|
|
// most colorfull, and a zero indicate no
|
|
// adjustment.
|
|
//
|
|
// RedGreenTint - Tint adjustment between Red/Green primary
|
|
// color, the value is a SHORT range from -100
|
|
// to 100, it adjust color toward Red if number
|
|
// is positive, adjust toward Green if number
|
|
// is negative, and a zero indicate no
|
|
// adjustment.
|
|
//
|
|
// NOTE: For Contrast/Brightness/Colorfulness/RedGreenTint adjustments, if its
|
|
// value is outside of the range (-100 to 100) then halftone DLL
|
|
// automatically set its to selected default value.
|
|
//
|
|
|
|
#ifndef _WINGDI_
|
|
|
|
// in WinGDI.H
|
|
//
|
|
// The following are predefined alignment white for 'IlluminantIndex'.
|
|
//
|
|
// If ILLUMINANT_DEFAULT is specified
|
|
//
|
|
// 1) if pDeviceCIEInfo is NULL or pDeviceCIEInfo->Red.x eqaul to 0 then
|
|
// halftone DLL automatically choosed approx. illuminant for the output
|
|
// device.
|
|
//
|
|
// 2) if pDeviceCIEInfo is NOT null and pDeviceCIEInf->Red.x not equal to 0
|
|
// then the 'White' field is used as illuminant alignment white.
|
|
//
|
|
// If other ILLUMINANT_xxxx is specified it will be used as alignment white
|
|
// even pDeviceCIEInfo is not null.
|
|
//
|
|
// If the IlluminantIndex is > ILLUMINANT_MAX_INDEX then halftone DLL will
|
|
// automatically choosed approx. illuminant even pDeviceCIEInfo is not NULL.
|
|
//
|
|
|
|
#define ILLUMINANT_DEVICE_DEFAULT 0
|
|
#define ILLUMINANT_A 1
|
|
#define ILLUMINANT_B 2
|
|
#define ILLUMINANT_C 3
|
|
#define ILLUMINANT_D50 4
|
|
#define ILLUMINANT_D55 5
|
|
#define ILLUMINANT_D65 6
|
|
#define ILLUMINANT_D75 7
|
|
#define ILLUMINANT_F2 8
|
|
#define ILLUMINANT_MAX_INDEX ILLUMINANT_F2
|
|
|
|
#define ILLUMINANT_TUNGSTEN ILLUMINANT_A
|
|
#define ILLUMINANT_DAYLIGHT ILLUMINANT_C
|
|
#define ILLUMINANT_FLUORESCENT ILLUMINANT_F2
|
|
#define ILLUMINANT_NTSC ILLUMINANT_C
|
|
|
|
#endif
|
|
|
|
|
|
#define MIN_COLOR_ADJ COLOR_ADJ_MIN
|
|
#define MAX_COLOR_ADJ COLOR_ADJ_MAX
|
|
#define MIN_POWER_GAMMA RGB_GAMMA_MIN
|
|
|
|
#define NTSC_POWER_GAMMA (UDECI4)22000
|
|
|
|
//
|
|
// The following is the default value
|
|
//
|
|
|
|
|
|
#define REFLECT_DENSITY_DEFAULT REFLECT_DENSITY_LOG
|
|
#define ILLUMINANT_DEFAULT 0
|
|
#define HT_DEF_RGB_GAMMA UDECI4_1
|
|
#define REFERENCE_WHITE_DEFAULT UDECI4_1
|
|
#define REFERENCE_BLACK_DEFAULT UDECI4_0
|
|
#define CONTRAST_ADJ_DEFAULT 0
|
|
#define BRIGHTNESS_ADJ_DEFAULT 0
|
|
#define COLORFULNESS_ADJ_DEFAULT 0
|
|
#define REDGREENTINT_ADJ_DEFAULT 0
|
|
|
|
|
|
#define CLRADJF_NEGATIVE CA_NEGATIVE
|
|
#define CLRADJF_LOG_FILTER CA_LOG_FILTER
|
|
|
|
#define CLRADJF_FLAGS_MASK (CLRADJF_NEGATIVE | \
|
|
CLRADJF_LOG_FILTER)
|
|
|
|
#ifndef _WINGDI_
|
|
|
|
//
|
|
// In WinGDI.H
|
|
//
|
|
|
|
#define REFERENCE_WHITE_MIN (UDECI4)6000
|
|
#define REFERENCE_WHITE_MAX UDECI4_1
|
|
|
|
#define REFERENCE_BLACK_MIN UDECI4_0
|
|
#define REFERENCE_BLACK_MAX (UDECI4)4000
|
|
|
|
typedef struct tagCOLORADJUSTMENT {
|
|
WORD caSize;
|
|
WORD caFlags;
|
|
WORD caIlluminantIndex;
|
|
WORD caRedGamma;
|
|
WORD caGreenGamma;
|
|
WORD caBlueGamma;
|
|
WORD caReferenceBlack;
|
|
WORD caReferenceWhite;
|
|
SHORT caContrast;
|
|
SHORT caBrightness;
|
|
SHORT caColorfulness;
|
|
SHORT caRedGreenTint;
|
|
} COLORADJUSTMENT, *PCOLORADJUSTMENT, FAR *LPCOLORADJUSTMENT;
|
|
|
|
#endif
|
|
|
|
#define HTCOLORADJUSTMENT COLORADJUSTMENT
|
|
typedef HTCOLORADJUSTMENT *PHTCOLORADJUSTMENT;
|
|
|
|
//
|
|
// HTINITINFO
|
|
//
|
|
// This data structure is a collection of the device characteristics and
|
|
// will used by the halftone DLL to carry out the color composition for the
|
|
// designated device.
|
|
//
|
|
// Version - Specified the version number of HTINITINFO data
|
|
// structure. for this version it should set to the
|
|
// HTINITINFO_VERSION
|
|
//
|
|
// Flags - Various flag defined the initialization
|
|
// requirements.
|
|
//
|
|
// HIF_SQUARE_DEVICE_PEL
|
|
//
|
|
// Specified that the device pel is square
|
|
// rather then round object. this only make
|
|
// differences when the field
|
|
// 'PelResolutionRatio' is greater than 0.01
|
|
// and it is not 1.0000.
|
|
//
|
|
// HIF_HAS_BLACK_DYE
|
|
//
|
|
// Indicate the device has separate black dye
|
|
// instead of mix cyan/magenta/yellow dyes to
|
|
// procduced black, this flag will be ignored
|
|
// if HIF_ADDITIVE_PRIMS is defined.
|
|
//
|
|
// HIF_ADDITIVE_PRIMS
|
|
//
|
|
// Specified that final device primaries are
|
|
// additively, that is adding device primaries
|
|
// will produce lighter result. (this is true
|
|
// for monitor devices and certainly false for
|
|
// the reflect devices such as printers).
|
|
//
|
|
// HIF_USE_8BPP_BITMASK
|
|
//
|
|
// Specified use CMYBitMask8BPP field is used,
|
|
// when destination surface is BMF_8BPP_VGA256
|
|
// see CMYBitMask8BPP field for more detail
|
|
//
|
|
// HIF_INVERT_8BPP_BITMASK_IDX
|
|
// Render the 8bpp mask mode with inversion of
|
|
// its indices. This is implemented for fix
|
|
// Windows GDI rop problem, it will render as
|
|
// RGB additive indices. The caller must
|
|
// do a inversion of final image's Indices
|
|
// (Idx = ~Idx or Idx ^= 0xFF) to get the
|
|
// correct CMY332 data. When this bit is
|
|
// set, the HT_Get8BPPMaskPalette must have
|
|
// its pPaletteEntry[0] Initialized to as
|
|
//
|
|
// pPaletteEntry[0].peRed = 'R';
|
|
// pPaletteEntry[0].peGreen = 'G';
|
|
// pPaletteEntry[0].peBlue = 'B';
|
|
// pPaletteEntry[0].peFlags = '0';
|
|
//
|
|
// to indicate that a RGB indices inverted
|
|
// palette should be returned and not the
|
|
// standard CMY palette (Index 0 is white and
|
|
// Index 255 is black).
|
|
//
|
|
// The inverted palette has is first entry as
|
|
// BLACK and last entry as WHITE
|
|
//
|
|
// pPaletteEntry[0].peRed = 0x00;
|
|
// pPaletteEntry[0].peGreen = 0x00;
|
|
// pPaletteEntry[0].peBlue = 0x00;
|
|
// pPaletteEntry[0].peFlags = 0x00;
|
|
//
|
|
// Notice that this setting WILL NOT work on
|
|
// earlier version of halftone (Windows 2000
|
|
// and earlier), so the caller must check the
|
|
// OS version or check the returned palette
|
|
// to ensure that first palette entry is
|
|
// BLACk rather than WHITE. If first
|
|
// entries is WHITE after initialized to
|
|
// 'R', 'G', 'B', '0' then this is a older
|
|
// version of system that does not recongnized
|
|
// the initialzed value. In this case the
|
|
// caller should not invert (Idx ^= 0xFF) the
|
|
// halftoned imaged indices when render it
|
|
// to the devices, because the halftone
|
|
// images in this case is CMY based already.
|
|
//
|
|
//
|
|
// HTPatternIndex - Default halftone pattern index number, the
|
|
// indices is predefine as HTPAT_SIZE_xxxx, this
|
|
// field only used if pHTalftonePattern pointer is
|
|
// not NULL.
|
|
//
|
|
// DevicePowerGamma - This field is used to adjust halftone pattern
|
|
// cell's gamma, the gamma applied to all the rgb
|
|
// colors, see gamma description in
|
|
// HTCOLORADJUSTMENT above.
|
|
//
|
|
// HTCallBackFunction - a 32-bit pointer to the caller supplied callback
|
|
// function which used by the halftone DLL to
|
|
// obtained the source/destination bitmap pointer
|
|
// durning the halftone process, if this pointer is
|
|
// NULL then halftone dll assume that caller does
|
|
// not need any callback and generate an error if a
|
|
// callback is needed.
|
|
//
|
|
// pHalftonePattern - pointer to HALFTONEPATTERN data structure, see
|
|
// descriptions above, if this pointer is NULL then
|
|
// halftone using HTPatternIndex field to select
|
|
// default halftone dll's pattern.
|
|
//
|
|
// pInputRGBInfo - Specified input's rgb color' coordinates within
|
|
// the C.I.E. color spaces. If this pointer is NULL
|
|
// or pInputRGBInfo->Red.x is 0 (UDECI4_0) then it
|
|
// default using NTSC standard to convert the input
|
|
// colors.
|
|
//
|
|
// pDeviceCIEInfo - Specified device primary color coordinates within
|
|
// the C.I.E. color space, see CIEINFO data
|
|
// structure, if the pointer is NULL or
|
|
// pDeviceCIEInfo->Red.x is 0 (UDECI4_0) then
|
|
// halftone DLL choose the default for the output
|
|
// device.
|
|
//
|
|
// pDeviceSolidDyesInfo - Specified device solid dyes concentrations, this
|
|
// field will be ignored if HIF_ADDITIVE_PRIMS flag
|
|
// is defined, if HIF_ADDITIVE_PRIMS is not set and
|
|
// this pointer is NULL then halftone dll choose
|
|
// approximate default for the output device.
|
|
//
|
|
// DeviceResXDPI - Specified the device horizontal (x direction)
|
|
// resolution in 'dots per inch' measurement.
|
|
//
|
|
// DeviceResYDPI - Specified the device vertical (y direction)
|
|
// resolution in 'dots per inch' measurement.
|
|
//
|
|
// DevicePelsDPI - Specified the device pel/dot/nozzle diameter
|
|
// (if rounded) or width/height (if squared) in
|
|
// 'dots per inch' measurement.
|
|
//
|
|
// This value is measure as if each pel only touch
|
|
// each other at edge of the pel.
|
|
//
|
|
// If this value is 0, then it assume that each
|
|
// device pel is rectangular shape and has
|
|
// DeviceResXDPI in X direction and DeviceResYDPI
|
|
// in Y direction.
|
|
//
|
|
// DefHTColorAdjustment - Specified the default color adjustment for
|
|
// this device. see HTCOLORADJUSTMENT data
|
|
// structure above for detail.
|
|
//
|
|
// DeviceRGamma
|
|
// DeviceGGamma
|
|
// DeviceBGamma - Red, Green, Blue gammas for the device
|
|
//
|
|
// CMYBitMask8BPP - only used for the BMF_8BPP_VGA256 destination
|
|
// surface. It indicate the how the device surface
|
|
// color are translated, when HTF_USE_8BPP_BITMASK
|
|
// bit is turn on, this byte is the CYAN. MAGENTA
|
|
// YELLOW dye levels indicator.
|
|
//
|
|
// This byte indicate how many levels for each cyan,
|
|
// magenta and yellow color, and this is how the
|
|
// halftone write to the destination surface.
|
|
//
|
|
//
|
|
// Bit 7 6 5 4 3 2 1 0
|
|
// | | | | | |
|
|
// +---+ +---+ +=+
|
|
// | | |
|
|
// | | +-- Yellow 0-3 (4 levels)
|
|
// | |
|
|
// | +-- Magenta 0-7 (8 levels)
|
|
// |
|
|
// +-- Cyan 0-7 (8 levels)
|
|
//
|
|
//
|
|
// The maximum in the bits configuration is 3:3:2,
|
|
// Other invalid combination generate different
|
|
// output as
|
|
//
|
|
// 0 - Indicate a gray scale output, the output
|
|
// byte is a 0-255 of 256 levels gray
|
|
//
|
|
// 1 - a 5x5x5 cube output, each cyan, magenta
|
|
// and yellow color are 0-4 of 5 levels and
|
|
// each color is in 25% increment.
|
|
//
|
|
// 2 - a 6x6x6 cube output, each cyan, magenta
|
|
// and yellow color are 0-5 of 6 levels and
|
|
// each color is in 20% increment.
|
|
//
|
|
// Other value that have 0 level in one of cyan,
|
|
// magenta or yellow will generate an error.
|
|
//
|
|
// To obtain a palette for each of configuration
|
|
// you can call HT_Get8BPPMaskPalette()
|
|
//
|
|
|
|
|
|
#define HTINITINFO_VERSION2 (DWORD)0x48546902 // 'HTi\02'
|
|
#define HTINITINFO_VERSION (DWORD)0x48546903 // 'HTi\03'
|
|
|
|
#define HTINITINFO_V3_CB_EXTRA 8
|
|
|
|
|
|
#define HIF_SQUARE_DEVICE_PEL 0x0001
|
|
#define HIF_HAS_BLACK_DYE 0x0002
|
|
#define HIF_ADDITIVE_PRIMS 0x0004
|
|
#define HIF_USE_8BPP_BITMASK 0x0008
|
|
#define HIF_INK_HIGH_ABSORPTION 0x0010
|
|
#define HIF_INK_ABSORPTION_INDICES 0x0060
|
|
#define HIF_DO_DEVCLR_XFORM 0x0080
|
|
#define HIF_USED_BY_DDI 0x0100
|
|
#define HIF_PRINT_DRAFT_MODE 0x0200
|
|
#define HIF_INVERT_8BPP_BITMASK_IDX 0x0400
|
|
|
|
#define HIF_BIT_MASK (HIF_SQUARE_DEVICE_PEL | \
|
|
HIF_HAS_BLACK_DYE | \
|
|
HIF_ADDITIVE_PRIMS | \
|
|
HIF_USE_8BPP_BITMASK | \
|
|
HIF_INK_HIGH_ABSORPTION | \
|
|
HIF_INK_ABSORPTION_INDICES | \
|
|
HIF_DO_DEVCLR_XFORM | \
|
|
HIF_PRINT_DRAFT_MODE | \
|
|
HIF_INVERT_8BPP_BITMASK_IDX)
|
|
|
|
#define HIF_INK_ABSORPTION_IDX0 0x0000
|
|
#define HIF_INK_ABSORPTION_IDX1 0x0020
|
|
#define HIF_INK_ABSORPTION_IDX2 0x0040
|
|
#define HIF_INK_ABSORPTION_IDX3 0x0060
|
|
|
|
#define HIF_HIGHEST_INK_ABSORPTION (HIF_INK_HIGH_ABSORPTION | \
|
|
HIF_INK_ABSORPTION_IDX3)
|
|
#define HIF_HIGHER_INK_ABSORPTION (HIF_INK_HIGH_ABSORPTION | \
|
|
HIF_INK_ABSORPTION_IDX2)
|
|
#define HIF_HIGH_INK_ABSORPTION (HIF_INK_HIGH_ABSORPTION | \
|
|
HIF_INK_ABSORPTION_IDX1)
|
|
#define HIF_NORMAL_INK_ABSORPTION HIF_INK_ABSORPTION_IDX0
|
|
#define HIF_LOW_INK_ABSORPTION (HIF_INK_ABSORPTION_IDX1)
|
|
#define HIF_LOWER_INK_ABSORPTION (HIF_INK_ABSORPTION_IDX2)
|
|
#define HIF_LOWEST_INK_ABSORPTION (HIF_INK_ABSORPTION_IDX3)
|
|
|
|
|
|
#define HTBITMASKPALRGB_DW (DWORD)'0BGR'
|
|
#define SET_HTBITMASKPAL2RGB(pPal) (*((LPDWORD)(pPal)) = HTBITMASKPALRGB_DW)
|
|
#define IS_HTBITMASKPALRGB(pPal) (*((LPDWORD)(pPal)) == (DWORD)0)
|
|
|
|
|
|
//
|
|
// This defined the minimum acceptable device resolutions
|
|
//
|
|
|
|
#define MIN_DEVICE_DPI 12
|
|
|
|
typedef struct _HTINITINFO {
|
|
DWORD Version;
|
|
WORD Flags;
|
|
WORD HTPatternIndex;
|
|
_HTCALLBACKFUNC HTCallBackFunction;
|
|
PHALFTONEPATTERN pHalftonePattern;
|
|
PCIEINFO pInputRGBInfo;
|
|
PCIEINFO pDeviceCIEInfo;
|
|
PSOLIDDYESINFO pDeviceSolidDyesInfo;
|
|
UDECI4 DevicePowerGamma;
|
|
WORD DeviceResXDPI;
|
|
WORD DeviceResYDPI;
|
|
WORD DevicePelsDPI;
|
|
HTCOLORADJUSTMENT DefHTColorAdjustment;
|
|
UDECI4 DeviceRGamma;
|
|
UDECI4 DeviceGGamma;
|
|
UDECI4 DeviceBGamma;
|
|
BYTE CMYBitMask8BPP;
|
|
BYTE bReserved;
|
|
} HTINITINFO, FAR *PHTINITINFO;
|
|
|
|
//
|
|
// BITBLTPARAMS
|
|
//
|
|
// This data structure is used when calling the HT_HalftoneBitmap(), it
|
|
// defined where to halftone from the source bitmap to the destination
|
|
// bitmap.
|
|
//
|
|
// Flags - Various flags defined how the source, destination and
|
|
// source mask should be calculated.
|
|
//
|
|
// BBPF_HAS_DEST_CLIPRECT
|
|
//
|
|
// Indicate that there is a clipping
|
|
// rectangle for the destination and it is
|
|
// specified by DestClipXLeft, DestClipXRight,
|
|
// DestClipYTop and DestClipYBottom
|
|
//
|
|
// BBPF_USE_ADDITIVE_PRIMS
|
|
//
|
|
// Specified if the halftone result will be
|
|
// using Red/Green/Blue primary color or
|
|
// using Cyan/Magenta/Yellow primary color, depends
|
|
// on the destination surface format as
|
|
//
|
|
// BMF_1BPP:
|
|
//
|
|
// Additive Prims: 0=Black, 1=White
|
|
// Substractive Prims: 0=White, 1=Black
|
|
//
|
|
// BMF_4BPP_VGA16:
|
|
//
|
|
// Always using RED, GREEN, BLUE primaries, and
|
|
// ignored this flag.
|
|
//
|
|
// BMF_4BPP:
|
|
//
|
|
// Additive Prims: RED, GREEN. BLUE
|
|
// Substractive Prims: CYAN, MAGENTA, YELLOW
|
|
//
|
|
// The order of the RGB, or CMY is specified by
|
|
// DestPrimaryOrder field. (see below)
|
|
//
|
|
// BMF_8BPP_VGA256:
|
|
// BMF_16BPP_555:
|
|
// BMF_16BPP_565:
|
|
// BMF_24BPP:
|
|
// BMF_32BPP:
|
|
//
|
|
// Always using RED, GREEN, BLUE primaries, and
|
|
// ignored this flag.
|
|
//
|
|
// BBPF_NEGATIVE_DEST
|
|
//
|
|
// Invert the final destination surface, so
|
|
// after the halftone it just the negative
|
|
// result from the source.
|
|
//
|
|
// BBPF_INVERT_SRC_MASK
|
|
//
|
|
// Invert the source mask bits before using
|
|
// it, this in effect make mask bit 0 (off)
|
|
// for copy the source and mask bit 1 (on)
|
|
// for preserved the destination.
|
|
//
|
|
// BBPF_HAS_BANDRECT
|
|
//
|
|
// Set to specified that rclBand RECTL data structrue
|
|
// should be used to compute for the caller's
|
|
// destination bitmap buffer.
|
|
//
|
|
// If this flag is not set then halftone dll assumed
|
|
// the caller's bitmap buffer is same width/height
|
|
// as specified in the destination HTSURFACEINFO.
|
|
//
|
|
// BBPF_BW_ONLY
|
|
//
|
|
// Produced monochrome version of the output even the
|
|
// destination is the color device.
|
|
//
|
|
// BBPF_TILE_SRC
|
|
//
|
|
// Tilt the source to destination and source bitmap
|
|
// when this bit is set the source mask is ignored.
|
|
//
|
|
// BBPF_ICM_ON
|
|
//
|
|
// When set, the halftone will use the input color
|
|
// directly without any modification
|
|
//
|
|
// BBPF_NO_ANTIALIASING
|
|
//
|
|
// Turn off anti-aliasing when halftone
|
|
//
|
|
//
|
|
// DestPrimaryOrder- Specified destination primary color order, it can be
|
|
// either PRIMARY_ORDER_RGB or PRIMARY_ORDER_CMY group, it
|
|
// depends on the surface format has following meaning.
|
|
//
|
|
// BMF_1BPP:
|
|
//
|
|
// This field is ignored.
|
|
//
|
|
// BMF_4BPP_VGA16:
|
|
//
|
|
// This field automatically set to PRIMARY_ORDER_BGR
|
|
// by the halftone DLL.
|
|
//
|
|
// BMF_4BPP:
|
|
//
|
|
// for each byte there are two indices entries, and
|
|
// for each nibble has following meaning, notice that
|
|
// bit 3/7 always set to 0, the index number only
|
|
// range from 0 to 7.
|
|
//
|
|
// PRIMARY_ORDER_abc
|
|
// |||
|
|
// ||+-- bit 0/4
|
|
// ||
|
|
// |+--- bit 1/5
|
|
// |
|
|
// +---- bit 2/7
|
|
//
|
|
// BMF_8BPP_VGA256:
|
|
//
|
|
// This field is ignored, the palette entries and its
|
|
// order is defined by halftone DLL at run time, the
|
|
// caller should get the palette for the VGA256
|
|
// surface through HT_Get8BPPFormatPalette() API call.
|
|
//
|
|
// BMF_16BPP_555:
|
|
//
|
|
// PRIMARY_ORDER_abc
|
|
// |||
|
|
// ||+-- bit 0-4 (5 bits)
|
|
// ||
|
|
// |+--- bit 5-9 (5 bits)
|
|
// |
|
|
// +---- bit 10-14 (5 bits)
|
|
//
|
|
// BMF_16BPP_565:
|
|
//
|
|
// This field is ignored, it alway assume BGR as
|
|
// shown below
|
|
//
|
|
// PRIMARY_ORDER_BGR
|
|
// |||
|
|
// ||+-- bit 0-4 (5 bits)
|
|
// ||
|
|
// |+--- bit 5-10 (6 bits)
|
|
// |
|
|
// +---- bit 11-15 (5 bits)
|
|
//
|
|
// BMF_24BPP:
|
|
//
|
|
// This field is ignored, it alway assume BGR as
|
|
// shown below
|
|
//
|
|
// PRIMARY_ORDER_BGR
|
|
// |||
|
|
// ||+-- bit 0-7 (8 bits)
|
|
// ||
|
|
// |+--- bit 8-15 (8 bits)
|
|
// |
|
|
// +---- bit 16-23 (8 bits)
|
|
//
|
|
// BMF_32BPP:
|
|
//
|
|
// PRIMARY_ORDER_abc
|
|
// |||
|
|
// ||+-- bit 0-7 (8 bits)
|
|
// ||
|
|
// |+--- bit 8-15 (8 bits)
|
|
// |
|
|
// +---- bit 16-23 (8 bits)
|
|
//
|
|
//
|
|
// rclSrc - RECTL data structure defined the source rectangle area
|
|
// to be bitblt from, fields in this data structure are
|
|
// relative to the source HTSURFACEINFO's width/height.
|
|
//
|
|
// rclDest - RECTL data structure defined the destination rectangle
|
|
// area to be bitblt to, fields in this data structure are
|
|
// relative to the destination HTSURFACEINFO's width/height.
|
|
//
|
|
// rclClip - RECTL data structure defined the destination clipping
|
|
// rectangle area, fields in this data structure are
|
|
// relative to the destination HTSURFACEINFO's width/height.
|
|
//
|
|
// rclBand - RECTL data structure defined the device banding rectangle
|
|
// area, fields in this data structure are relative to the
|
|
// destination HTSURFACEINFO's width/height.
|
|
//
|
|
// This RECTL only used if BBPF_HAS_BANDRECT flag is set,
|
|
// when this flag is set, halftone DLL will automatically
|
|
// clipped the destination to this rectangle area and
|
|
// copied this rectangle to the output buffer with rclBand's
|
|
// left/top aligned to the buffer's physical origin. The
|
|
// destination's buffer (bitmap) must the format specified
|
|
// in the destination HTSURFACEINFO.
|
|
//
|
|
// If rclBand rectangle is larger than the logical destination
|
|
// surface size (destination HTSURFACEINFO), halftone dll
|
|
// still move the the band's left/top location to the 0/0
|
|
// origin and extra width/height is remain unchanged.
|
|
//
|
|
// The rclBand normally is used for device which does not
|
|
// have enough memory to hold all the destination surface
|
|
// at one time, it just like to repeatly using same buffer
|
|
// to temporary holding the halftone results.
|
|
//
|
|
// The rclBand's left/top/right/bottom may not be negative
|
|
// numbers.
|
|
//
|
|
// ptlSrcMask - a POINTL data structure to specified the logical
|
|
// coordinate of starting point for the source mask bitmap,
|
|
// this field only used if a HTSURFACEINFO for the source
|
|
// mask is passed.
|
|
//
|
|
// This source mask bitmap must always monochrome and its
|
|
// width/height must
|
|
//
|
|
// Width >= ptlSrcMask.x + source surface width.
|
|
// Height >= ptlSrcMask.y + source surface height;
|
|
//
|
|
//
|
|
// NOTE: 1) all RECTL data structure are left/top inclusive and right/bottom
|
|
// exclusive.
|
|
//
|
|
// 2) if rclSrc rectangle is not will ordered it specified the source
|
|
// should be inverted before process for not ordered directions.
|
|
//
|
|
// 3) if rclDest rectangle is not will ordered it specified the
|
|
// destination should be inverted after process for not ordered
|
|
// directions.
|
|
//
|
|
// 4) if BBPF_HAS_DEST_CLIPRECT flag is set and rclClip is not well
|
|
// ordered or its left equal to its right, or its top equal to its
|
|
// bottom, then all destination are clipped, destination will not
|
|
// be updated that is.
|
|
//
|
|
// 5) if BBPF_HAS_BANDRECT flag is set and rclBand is not well orderd
|
|
// or it left eqaul to its right, or its top eqaul to its bottom,
|
|
// then a HTERR_INVALID_BANDRECT is returned.
|
|
//
|
|
//
|
|
|
|
//
|
|
// ABIF_USE_CONST_ALPHA_VALUE - The ConstAlphaValue field is used
|
|
// ABIF_DSTPAL_IS_RGRBUAD - The pDstPal Pointed to RGBQUAD structure
|
|
// array rather PALETTEENTRY array
|
|
// ABIF_SRC_ALPHA_IS_PREMUL - In 32bpp per-pixel alpha blending the
|
|
// source RGB already pre-multiply with its
|
|
// per-pixel alpha value
|
|
// ABIF_BLEND_DEST_ALPHA - Only valid if source and destination
|
|
// both are 32bpp and per-pixel alpha is used
|
|
// d = s + (1 - s) * d
|
|
//
|
|
|
|
|
|
#define ABIF_USE_CONST_ALPHA_VALUE 0x01
|
|
#define ABIF_DSTPAL_IS_RGBQUAD 0x02
|
|
#define ABIF_SRC_ALPHA_IS_PREMUL 0x04
|
|
#define ABIF_BLEND_DEST_ALPHA 0x08
|
|
|
|
typedef struct _ABINFO {
|
|
BYTE Flags;
|
|
BYTE ConstAlphaValue;
|
|
WORD cDstPal;
|
|
LPPALETTEENTRY pDstPal;
|
|
} ABINFO, *PABINFO;
|
|
|
|
|
|
#define BBPF_HAS_DEST_CLIPRECT 0x0001
|
|
#define BBPF_USE_ADDITIVE_PRIMS 0x0002
|
|
#define BBPF_NEGATIVE_DEST 0x0004
|
|
#define BBPF_INVERT_SRC_MASK 0x0008
|
|
#define BBPF_HAS_BANDRECT 0x0010
|
|
#define BBPF_BW_ONLY 0x0020
|
|
#define BBPF_TILE_SRC 0x0040
|
|
#define BBPF_ICM_ON 0x0080
|
|
#define BBPF_NO_ANTIALIASING 0x0100
|
|
#define BBPF_DO_ALPHA_BLEND 0x0200
|
|
|
|
typedef struct _BITBLTPARAMS {
|
|
WORD Flags;
|
|
BYTE bReserved;
|
|
BYTE DestPrimaryOrder;
|
|
PABINFO pABInfo;
|
|
RECTL rclSrc;
|
|
RECTL rclDest;
|
|
RECTL rclClip;
|
|
RECTL rclBand;
|
|
POINTL ptlBrushOrg;
|
|
POINTL ptlSrcMask;
|
|
LPVOID pBBData;
|
|
} BITBLTPARAMS, FAR *PBITBLTPARAMS;
|
|
|
|
|
|
|
|
//
|
|
// DEVICEHALFTONEINFO
|
|
//
|
|
// This data structure is passed for every HT_xxx api calls except the
|
|
// HT_CreateDeviceHalftoneInfo() which return the pointer to this data
|
|
// structure. It is used to identify the device color characteristics
|
|
// durning the halftone process.
|
|
//
|
|
// DeviceOwnData - this field will initially set to NULL, and will be
|
|
// used by the caller to stored useful information
|
|
// such as handle/pointer.
|
|
//
|
|
// cxPattern - width of the halftone pattern in pels
|
|
//
|
|
// cyPattern - height of the halftone pattern in pels.
|
|
//
|
|
// HTColorAdjustment - Current default color adjustment, if an halftone
|
|
// APIs required a PHTCOLORADJUSTMENT parameter and its
|
|
// passed as NULL pointer then default color adjustment
|
|
// is taken from here, the caller can change the
|
|
// HTCOLORADJUSTMENT data structure to affect all the
|
|
// color adjustment on this device.
|
|
//
|
|
|
|
typedef struct _DEVICEHALFTONEINFO {
|
|
ULONG_PTR DeviceOwnData;
|
|
WORD cxPattern;
|
|
WORD cyPattern;
|
|
HTCOLORADJUSTMENT HTColorAdjustment;
|
|
} DEVICEHALFTONEINFO;
|
|
|
|
typedef DEVICEHALFTONEINFO FAR *PDEVICEHALFTONEINFO;
|
|
typedef PDEVICEHALFTONEINFO FAR *PPDEVICEHALFTONEINFO;
|
|
|
|
|
|
//
|
|
// CHBINFO
|
|
//
|
|
// This data structure is one of the parameter passed to the halftone entry
|
|
// point HT_CreateHalftoneBrush();
|
|
//
|
|
// Flags - one or more following flags can be defined
|
|
//
|
|
// CHBF_BW_ONLY
|
|
//
|
|
// Create only black/white even the device is
|
|
// color.
|
|
//
|
|
// CHBF_USE_ADDITIVE_PRIMS
|
|
//
|
|
//
|
|
// Specified if the halftone result will be
|
|
// using Red/Green/Blue primary color or using
|
|
// Cyan/Magenta/Yellow primary color, depends
|
|
// on the destination surface format as
|
|
//
|
|
// BMF_1BPP:
|
|
//
|
|
// Additive Prims: 0=Black, 1=White
|
|
// Substractive Prims: 0=White, 1=Black
|
|
//
|
|
// BMF_4BPP_VGA16:
|
|
// BMF_8BPP_VGA256:
|
|
// BMF_16BPP_555:
|
|
// BMF_24BPP:
|
|
//
|
|
// Always using RED, GREEN, BLUE primaries
|
|
// and this flag is ignored.
|
|
//
|
|
// BMF_4BPP:
|
|
//
|
|
// Additive Prims: RED, GREEN. BLUE
|
|
// Substractive Prims: CYAN, MAGENTA, YELLOW
|
|
//
|
|
// The order of the RGB, or CMY is specified
|
|
// by DestPrimaryOrder field. (see below)
|
|
//
|
|
// CHBF_NEGATIVE_BRUSH
|
|
//
|
|
// Create the negative version of the brush.
|
|
//
|
|
//
|
|
// DestSurfaceFormat - One of the following can be specified,
|
|
//
|
|
// BMF_1BPP, BMF_4BPP, BMF_4BPP_VGA16,
|
|
// BMF_8BPP_VGA256, BMF_16BPP_555.
|
|
//
|
|
// for VGA16, VGA256, 16BPP_555 surface format
|
|
// see HTSURFACEINFO for descriptions.
|
|
//
|
|
// DestScanLineAlignBytes - Alignment bytes needed for each output pattern
|
|
// scan line, some common ones are
|
|
//
|
|
// BMF_ALIGN_BYTE ( 8-bit aligned)
|
|
// BMF_ALIGN_WORD (16-bit aligned)
|
|
// BMF_ALIGN_DWORD (32-bit aligned)
|
|
// BMF_ALIGN_QWORD (64-bit aligned)
|
|
//
|
|
// DestPrimaryOrder - Specified destination primary color order, it can
|
|
// be either PRIMARY_ORDER_RGB or PRIMARY_ORDER_CMY
|
|
// group, it depends on the surface format has
|
|
// following meaning.
|
|
//
|
|
// BMF_1BPP:
|
|
//
|
|
// This field is ignored.
|
|
//
|
|
//
|
|
// BMF_4BPP_VGA16:
|
|
//
|
|
// This field automatically set to
|
|
// PRIMARY_ORDER_BGR by the halftone DLL.
|
|
//
|
|
// BMF_4BPP:
|
|
//
|
|
// for each byte there are two indices
|
|
// entries, and for each nibble has following
|
|
// meaning, notice that bit 3/7 always set to
|
|
// 0, the index number only range from 0 to 7.
|
|
//
|
|
// PRIMARY_ORDER_abc
|
|
// |||
|
|
// ||+-- bit 0/4
|
|
// ||
|
|
// |+--- bit 1/5
|
|
// |
|
|
// +---- bit 2/7
|
|
//
|
|
//
|
|
// BMF_8BPP_VGA256:
|
|
//
|
|
// This field is ignored, the palette entries
|
|
// and its order is defined by halftone DLL
|
|
// at run time, the caller should get the
|
|
// palette for the VGA256 surface through
|
|
// HT_Get8BPPFormatPalette() API call.
|
|
//
|
|
// BMF_16BPP_555:
|
|
//
|
|
// PRIMARY_ORDER_abc
|
|
// |||
|
|
// ||+-- bit 0-4 (5 bits)
|
|
// ||
|
|
// |+--- bit 5-9 (5 bits)
|
|
// |
|
|
// +---- bit 10-15 (5 bits)
|
|
//
|
|
//
|
|
//
|
|
|
|
|
|
#define CHBF_BW_ONLY 0x01
|
|
#define CHBF_USE_ADDITIVE_PRIMS 0x02
|
|
#define CHBF_NEGATIVE_BRUSH 0x04
|
|
#define CHBF_BOTTOMUP_BRUSH 0x08
|
|
#define CHBF_ICM_ON 0x10
|
|
|
|
|
|
typedef struct _CHBINFO {
|
|
BYTE Flags;
|
|
BYTE DestSurfaceFormat;
|
|
BYTE DestScanLineAlignBytes;
|
|
BYTE DestPrimaryOrder;
|
|
} CHBINFO;
|
|
|
|
|
|
|
|
//
|
|
// STDMONOPATTERN
|
|
//
|
|
// This data structure is used when calling the HT_CreateStdMonoPattern().
|
|
//
|
|
// Flags - One or more following flags may be defined
|
|
//
|
|
// SMP_TOPDOWN
|
|
//
|
|
// Specified that first scan line of the pattern
|
|
// bitmap will be the viewing top, if this flag
|
|
// is not defined then the last scan line is the
|
|
// viewing top.
|
|
//
|
|
// SMP_0_IS_BLACK
|
|
//
|
|
// specified that the in the bitmap a bit value
|
|
// 0 = black and bit value 1=white, if this flag
|
|
// is not defined then bit value 0=white and
|
|
// bit value 1=black.
|
|
//
|
|
// ScanLineAlignBytes - Alignment bytes needed for each output pattern scan
|
|
// line, some common ones are
|
|
//
|
|
// BMF_ALIGN_BYTE ( 8-bit aligned)
|
|
// BMF_ALIGN_WORD (16-bit aligned)
|
|
// BMF_ALIGN_DWORD (32-bit aligned)
|
|
// BMF_ALIGN_QWORD (64-bit aligned)
|
|
//
|
|
// PatternIndex - Specified the pattern index number, this has the
|
|
// predefined value as HT_STDMONOPAT_xxxx. If a invalid
|
|
// index number is passed then it return an error
|
|
// HTERR_INVALID_STDMONOPAT_INDEX is returned.
|
|
//
|
|
// LineWidth - This field only applied to the pattern which has
|
|
// lines in them, the value range from 0-255 (byte) and
|
|
// it repesent as LineWidth/1000 of inch, for example
|
|
// a 3 indicate 3/1000 = 0.003 inch width, if this value
|
|
// is less than the device minimum pel size, it will
|
|
// default to the 1 pel, the maximum is 255/1000 = 0.255
|
|
// inch width.
|
|
//
|
|
// If a zero is specified then it halftone will using
|
|
// default line width settting.
|
|
//
|
|
// LinesPerInch - This field only applied to the pattern wich has lines
|
|
// in them, the value range from 0 to 255 (byte). The
|
|
// LinesPerInch is calculated in the perpendicular
|
|
// direction of two parallel lines, the distances
|
|
// between two parallel lines that is.
|
|
//
|
|
// If a zero is specified then it halftone will using
|
|
// default line per inch setting.
|
|
//
|
|
// BytesPerScanLine - If will be filled by halftone dll to specified the
|
|
// size in bytes for each scan line in the pattern.
|
|
//
|
|
// cxPels - It will be filled by halftone dll of the final
|
|
// pattern's width in pel.
|
|
//
|
|
// cyPels - It will be filled by halftone dll of the final
|
|
// pattern's height in scan line.
|
|
//
|
|
// pPattern - Specified the memory location where the pattern will
|
|
// be stored, if this field is NULL then it will fill in
|
|
// the width/height fields.
|
|
//
|
|
//
|
|
|
|
|
|
|
|
|
|
#define HT_SMP_HORZ_LINE 0
|
|
#define HT_SMP_VERT_LINE 1
|
|
#define HT_SMP_HORZ_VERT_CROSS 2
|
|
#define HT_SMP_DIAG_15_LINE_UP 3
|
|
#define HT_SMP_DIAG_15_LINE_DOWN 4
|
|
#define HT_SMP_DIAG_15_CROSS 5
|
|
#define HT_SMP_DIAG_30_LINE_UP 6
|
|
#define HT_SMP_DIAG_30_LINE_DOWN 7
|
|
#define HT_SMP_DIAG_30_CROSS 8
|
|
#define HT_SMP_DIAG_45_LINE_UP 9
|
|
#define HT_SMP_DIAG_45_LINE_DOWN 10
|
|
#define HT_SMP_DIAG_45_CROSS 11
|
|
#define HT_SMP_DIAG_60_LINE_UP 12
|
|
#define HT_SMP_DIAG_60_LINE_DOWN 13
|
|
#define HT_SMP_DIAG_60_CROSS 14
|
|
#define HT_SMP_DIAG_75_LINE_UP 15
|
|
#define HT_SMP_DIAG_75_LINE_DOWN 16
|
|
#define HT_SMP_DIAG_75_CROSS 17
|
|
|
|
#define HT_SMP_PERCENT_SCREEN_START (HT_SMP_DIAG_75_CROSS + 1)
|
|
#define HT_SMP_PERCENT_SCREEN(x) (x + HT_SMP_PERCENT_SCREEN_START)
|
|
|
|
#define HT_SMP_MAX_INDEX HT_SMP_PERCENT_SCREEN(100)
|
|
|
|
|
|
#define SMP_TOPDOWN W_BITPOS(0)
|
|
#define SMP_0_IS_BLACK W_BITPOS(1)
|
|
|
|
|
|
typedef struct _STDMONOPATTERN {
|
|
WORD Flags;
|
|
BYTE ScanLineAlignBytes;
|
|
BYTE PatternIndex;
|
|
BYTE LineWidth;
|
|
BYTE LinesPerInch;
|
|
WORD BytesPerScanLine;
|
|
WORD cxPels;
|
|
WORD cyPels;
|
|
LPBYTE pPattern;
|
|
} STDMONOPATTERN;
|
|
|
|
typedef STDMONOPATTERN FAR *PSTDMONOPATTERN;
|
|
|
|
|
|
//
|
|
// Following is used in ConvertColorTable
|
|
//
|
|
|
|
|
|
#define CCTF_BW_ONLY 0x0001
|
|
#define CCTF_NEGATIVE 0x0002
|
|
#define CCTF_ICM_ON 0x0004
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// //
|
|
// Exposed Halftone DLL APIs //
|
|
// //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _HTAPI_ENTRY_
|
|
|
|
LONG
|
|
APIENTRY
|
|
HT_CreateDeviceHalftoneInfo(
|
|
PHTINITINFO pHTInitInfo,
|
|
PPDEVICEHALFTONEINFO ppDeviceHalftoneInfo
|
|
);
|
|
|
|
BOOL
|
|
APIENTRY
|
|
HT_DestroyDeviceHalftoneInfo(
|
|
PDEVICEHALFTONEINFO pDeviceHalftoneInfo
|
|
);
|
|
|
|
LONG
|
|
APIENTRY
|
|
HT_CreateHalftoneBrush(
|
|
PDEVICEHALFTONEINFO pDeviceHalftoneInfo,
|
|
PHTCOLORADJUSTMENT pHTColorAdjustment,
|
|
PCOLORTRIAD pColorTriad,
|
|
CHBINFO CHBInfo,
|
|
LPVOID pOutputBuffer
|
|
);
|
|
|
|
#ifndef _WINDDI_
|
|
|
|
LONG
|
|
APIENTRY
|
|
HT_ComputeRGBGammaTable(
|
|
WORD GammaTableEntries,
|
|
WORD GammaTableType,
|
|
UDECI4 RedGamma,
|
|
UDECI4 GreenGamma,
|
|
UDECI4 BlueGamma,
|
|
LPBYTE pGammaTable
|
|
);
|
|
|
|
LONG
|
|
APIENTRY
|
|
HT_Get8BPPFormatPalette(
|
|
LPPALETTEENTRY pPaletteEntry,
|
|
UDECI4 RedGamma,
|
|
UDECI4 GreenGamma,
|
|
UDECI4 BlueGamma
|
|
);
|
|
|
|
LONG
|
|
APIENTRY
|
|
HT_Get8BPPMaskPalette(
|
|
LPPALETTEENTRY pPaletteEntry,
|
|
BOOL Use8BPPMaskPal,
|
|
BYTE CMYMask,
|
|
UDECI4 RedGamma,
|
|
UDECI4 GreenGamma,
|
|
UDECI4 BlueGamma
|
|
);
|
|
|
|
#endif
|
|
|
|
LONG
|
|
APIENTRY
|
|
HT_CreateStandardMonoPattern(
|
|
PDEVICEHALFTONEINFO pDeviceHalftoneInfo,
|
|
PSTDMONOPATTERN pStdMonoPattern
|
|
);
|
|
|
|
|
|
LONG
|
|
APIENTRY
|
|
HT_HalftoneBitmap(
|
|
PDEVICEHALFTONEINFO pDeviceHalftoneInfo,
|
|
PHTCOLORADJUSTMENT pHTColorAdjustment,
|
|
PHTSURFACEINFO pSourceHTSurfaceInfo,
|
|
PHTSURFACEINFO pSourceMaskHTSurfaceInfo,
|
|
PHTSURFACEINFO pDestinationHTSurfaceInfo,
|
|
PBITBLTPARAMS pBitbltParams
|
|
);
|
|
|
|
#endif // _HTAPI_ENTRY_
|
|
#endif // _HT_
|