#ifndef _INC_XFILE_H_ #define _INC_XFILE_H_ #ifdef __cplusplus extern "C" { #endif /* Copyright (C) 1995 Xerox Corporation, All Rights Reserved. */ /* xfile.h * * DESCRIPTION * Declarations for the XF Reader API. * */ /* * INCLUDES */ /* * CONSTANTS */ /* * MACROS */ // DLL export linkage #if defined (_WIN32) #ifndef FAR #define FAR #endif #elif defined (sparc) #define FAR #else // add your define for FAR here #error "error: unknown case" #endif /* * TYPEDEFS */ /* * XF basic types * * For portability, the XF library uses platform-independent type names. * The definitions of the type will be in a single platform-dependent * section here. */ #ifndef _TYPES_PUB_INCLUDED #ifdef sparc #define signed #endif typedef signed long Bool; typedef unsigned char UInt8; typedef signed char Int8; typedef unsigned short UInt16; typedef signed short Int16; typedef unsigned long UInt32; typedef signed long Int32; #endif /* * XF derived types */ /* Rectangle type */ typedef struct XF_RECT_S { UInt32 x; UInt32 y; UInt32 width; UInt32 height; } XF_RECT; /* Handle to client's instance of library */ typedef UInt32 XF_INSTHANDLE; /* Handle to open document */ typedef UInt32 XF_DOCHANDLE; /* Return codes */ typedef enum { XF_NOERROR = 0, XF_INTERNAL_ERROR, XF_NOSUPPORT, XF_NOMEMORY, XF_CLIENTABORT, XF_IO_ERROR, XF_BADFILEFORMAT, XF_BADPARAMETER, XF_BADFILEMODE, // file not open in BINARY mode XF_SEQUENCE, // function called out-of-sequence } XF_RESULT; /* Types of image */ typedef enum { XF_IMGTYPE_NONE = 0, XF_IMGTYPE_BINARY, XF_IMGTYPE_GRAY4, XF_IMGTYPE_GRAY8, XF_IMGTYPE_COLOR4, XF_IMGTYPE_COLOR8, XF_IMGTYPE_COLOR24 } XF_IMGTYPE; /* * The type of the image with respect to the image/subimage * hierarchy. _MASTER indicates text plane/page image. * These image types can be divided into two classes, those * with image content and those that modify image * content. For example, an XF_USAGE_MASK depends on and modifes * the image content of an XF_USAGE_PICTURESEGMENT. An * XF_USAGE_MASK would never be displayed independently of * it parent. * */ typedef enum { XF_USAGE_MASTER, // binary text XF_USAGE_PICTURESEGMENT, // picture XF_USAGE_MASK, // mask XF_USAGE_LINEART, // picture type XF_USAGE_BUSINESSGRAPHIC, // picture type XF_USAGE_FOREGROUNDCOLORS, // mask XF_USAGE_BACKGROUNDCOLORS // mask } XF_USAGETYPE; /* * XF general I/O functions * * The XF client is responsible for managing the interface to the * local file system and must provide functions for basic file * I/O. To the XF library a file is represented by a token that * identifies the file to the client, along with the functions * that can be used to access the data. This data is contained in * the following structure. */ typedef Int32 (*XF_READFUNC)(UInt32 dwClientID, UInt32 dwFileID, UInt8 FAR *pBuf, UInt32 dwByteCount); typedef Int32 (*XF_WRITEFUNC)(UInt32 dwClientID, UInt32 dwFileID, UInt8 FAR *pBuf, UInt32 dwByteCount); typedef Int32 (*XF_SEEKFUNC)(UInt32 dwClientID, UInt32 dwFileID, UInt32 dwOffset); typedef Int32 (*XF_SIZEFUNC)(UInt32 dwClientID, UInt32 dwFileID); typedef struct XF_TOKEN_S { UInt32 dwSize; /* Size of this structure */ UInt32 dwClientFileID; /* Client's file identifier */ UInt32 dwCurPos; /* Internal -- filled in by XF library */ Bool bSwapBytes; /* Internal -- filled in by XF library */ XF_READFUNC FileRead; XF_WRITEFUNC FileWrite; XF_SEEKFUNC FileSeek; XF_SIZEFUNC FileSize; } XF_TOKEN_T, FAR *XF_TOKEN; /* * XF Document information * * The following structure describes the data returned by the * XF_GetDocInfo() function. */ typedef struct XF_DOCINFO_S { UInt32 dwSize; /* Size of this structure */ UInt32 nPages; /* Number of pages in file */ } XF_DOCINFO; /* * XF Page Information * * The following structure describes the data returned by the * XF_GetPageInfo() function. */ typedef struct XF_PAGEINFO_S { UInt32 dwSize; /* Size of this structure */ UInt32 dwImages; /* Number of images on page */ UInt32 dwAnnotCount; /* Number of annotations on page */ } XF_PAGEINFO; /* * XF Image information * * The following structure describes the data returned by the * XF_GetImageInfo() function. * * The dwMaskID is a magic number generated from the imageID. * New, secondary subimage types such as background or foreground * color planes will be supported by adding additional ID fields to * this structure. For example, in addition to the dwMaskID, a * a dwForegrndClrPlaneID would be added to support foreground text * color. */ typedef struct XF_IMAGEINFO_S { UInt32 dwSize; /* Size of this structure */ UInt32 dwXOffset; /* X location in page coordinates */ UInt32 dwYOffset; /* Y location in page coordinates */ UInt32 dwXResolution; /* X Resolution of image in dpi */ UInt32 dwYResolution; /* Y Resolution of image in dpi */ UInt32 dwWidth; /* Width in image's X resolution units */ UInt32 dwHeight; /* Height in image's Y resolution units */ UInt32 dwMaskID; /* Image ID for mask: 0=none */ UInt32 dwFGColorID; /* Image ID for foreground color image 0=none */ UInt32 dwBGColorID; /* Image ID for background color image: 0=none */ UInt32 dwSuggestedStripHeight; /* For best performance, read strips with height a multiple of this. */ UInt32 dwImageType; /* Type of image (XF_IMGTYPE) */ UInt32 dwImageUsage; /* subimage attribute (XF_USAGETYPE) */ } XF_IMAGEINFO; /* * XF Annotation information * * The following structure describes the data returned by the * XF_GetAnnotInfo() function. */ typedef struct XF_ANNOTINFO_S { UInt32 dwSize; /* Size of this structure */ UInt32 dwAnnotType; /* Type of annotation */ XF_RECT rLocation; /* Location of annotation, in page coordinates. */ UInt32 dwAnnotLength; /* Length of annotation data, in bytes */ } XF_ANNOTINFO; typedef enum { XF_FORMAT_UNKNOWN = 0, XF_XIF, // XIF > 1.0 XF_XIF1, // XIF 1.0 XF_TIFF, XF_PCX, XF_DCX, XF_BMP, XF_JFIF, XF_GIF } XF_FILE_FORMAT; typedef enum { XF_COMP_UNKNOWN = 0x00, XF_NOC = 0x01, XF_G4 = 0x02, XF_G3 = 0x04, XF_PACKBITS = 0x08, XF_SUPER = 0x10, XF_JPEG = 0x20, } XF_FILE_COMPRESSION; /* * ENUMS */ /* * GLOBAL VARIABLE DECLARATIONS */ /* * FUNCTION PROTOTYPES */ /* * XF progress function. The progress function is selected by the client. * It is called periodically by XF functions to report progress and offer * the client an opportunity to cancel. The meaning of the progress function * depends on the function being carried out. If not otherwise documented, * the progress value will be -1,indicating no meaningful progress to report, * or a number from 0 to 100, indicating percent complete. */ typedef Int32 (*XF_PROGRESSFUNC)(UInt32 dwClientID, Int32 dwProgress); XF_RESULT XF_SetProgressFunc(XF_INSTHANDLE xInst, XF_PROGRESSFUNC xProgress); /* * XF memory allocation function. This function allows the client to * override XF's memory allocation functions. It is not required, and * may not be available on all platforms. * * Once the functions have been overridden, they can be restored to * their defaults by passing NULL for each function. */ typedef void FAR *(*XF_MALLOCFUNC)(UInt32 dwClientId, UInt32 dwBytes); typedef void (*XF_FREEFUNC)(UInt32 dwClientId, void FAR *pBuf); XF_RESULT XF_SetMallocFuncs(XF_INSTHANDLE xInst, XF_MALLOCFUNC xMalloc, XF_FREEFUNC xFree); /* * XF_InitInstance * * Starts a client session to the XF library. The client passes in * a 32-bit instance identifier that will be passed back through * all XF callback functions (for file I/O, memory allocation, and * progress reporting). * * Returns instance handle through second parameter. This handle is * passed in to all subsequent XF functions. */ XF_RESULT XF_InitInstance(UInt32 dwClientInstID, XF_INSTHANDLE FAR *pxInst); /* * XF_EndInstance * * Ends a client session to the XF library. * */ XF_RESULT XF_EndInstance(XF_INSTHANDLE xInst); /* * XF_GetClientID * * Returns the ClientID passed into XF_InitInstance. * This function is useful when the client does not wish to * maintain a copy of the dwClientInstID passed into * XF_InitInstance. * */ XF_RESULT XF_GetClientID(XF_INSTHANDLE xInst, UInt32 FAR *dwClientInstID); /* * XF_OpenDocumentRead * * Begin a session of reading a document. The client must already * have opened the file at the operating system level, so that * the read and seek methods in the file token are available. This * function will perform any initialization required for reading * the file, including reading enough header information to verify * that the file is in a format supported by this version of * the XF library. * * A document handle is returned through the third parameter. This handle * is passed to all subsequent function calls that use the document. * * The file format is returned through the fourth parameter. */ XF_RESULT XF_OpenDocumentRead(XF_INSTHANDLE xInst, XF_TOKEN xFile, XF_DOCHANDLE FAR *pxDoc, XF_FILE_FORMAT *pxFileFormat); /* * XF_CloseDocument * * Frees storage associated with an open document */ XF_RESULT XF_CloseDocument(XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc); /* * XF_GetDocInfo * * Returns global information about the document. Client is responsible * for providing the XF_DOCINFO structure and initializing its dwSize field. */ XF_RESULT XF_GetDocInfo(XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc, XF_DOCINFO FAR *pxDocInfo); /* * XF_GetCurrentPage * * Returns the currently selected page in an open file through the * third parameter. */ XF_RESULT XF_GetCurrentPage(XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc, UInt32 FAR *pResult); /* * XF_GetPageInfo * * Returns information about the current page. Client is responsible for * providing the XF_PAGEINFO structure and intializing its dwSize field. * * */ XF_RESULT XF_GetPageInfo(XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc, XF_PAGEINFO FAR *pxPageInfo); /* * XF_GetImageInfo * * Returns information about an image on the current page. Client is responsible * for providing the XF_IMAGEINFO structure and initializing its dwSize field. * * The dwImageID parameter is simply the ordinal number (starting at 1) for * the primary images contained in the current page. Secondary images, * such as masks, are accessed from their parent images and, therefore, * are not a part of the image enumeration. Their ID's are magic numbers * which are generated from their parent image ID and supplied to the user * via the parent IMAGEINFO struct. * * Initially, the only secondary images that will be supported are masks. * Additional secondary image types, such as color planes, will be supported * by adding appropriate ID fields to the IMAGEINFO struct. * */ XF_RESULT XF_GetImageInfo(XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc, UInt32 dwImageID, XF_IMAGEINFO FAR *pxImageInfo); /* * XF_ImageReadStart * * Prepares to read image data. This function specifies the format in * which the client prefers to retrieve the image data. * * Arguments: * * xInst Client instance handle * xFile File token * dwImageID ID of image to retrieve * dwFlags Combination of XF_IMAGEFLAGS (defined below) describing * requested format * dwBytesPerRow Width of client's image buffer row, in bytes */ #define XF_IMAGEFLAGS_RGBOrder (0x0) #define XF_IMAGEFLAGS_BGROrder (0x1) #define XF_IMAGEFLAGS_TopToBottom (0x0) #define XF_IMAGEFLAGS_BottomToTop (0x2) #define XF_IMAGEFLAGS_BlackIsZero (0x0) #define XF_IMAGEFLAGS_WhiteIsZero (0x4) #define XF_IMAGEFLAGS_ColorChunky (0x0) // NIMP #define XF_IMAGEFLAGS_ColorPlanar (0x8) // NIMP #define XF_IMAGEFLAGS_ByteOrder (0x0) #define XF_IMAGEFLAGS_DwordOrder (0x10) #define XF_IMAGEFLAGS_ColorOrder (0x1) #define XF_IMAGEFLAGS_ScanlineOrder (0x2) #define XF_IMAGEFLAGS_PhotoInterp (0x4) #define XF_IMAGEFLAGS_ColorFormat (0x8) #define XF_IMAGEFLAGS_ByteOrdering (0x10) XF_RESULT XF_ImageReadStart( XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc, UInt32 dwImageID, UInt32 dwFlags, UInt32 dwBytesPerRow); /* * XF_ImageReadStrip * * Reads the next strip of image data from an image that was requested by * XF_ImageReadStart. Image data is read from the top of the image to * the bottom. If the client does not choose to read the entire image * in as a single strip, it is advisable to use a strip height that is * a multiple of the "dwSuggestedStripHeight" in the XF_IMAGEINFO structure * for best performance. * * Arguments: * * xInst Client instance handle * xFile File token * dwStripHeight Number of lines to be retrieved * pBuffer * Pointer to client's image buffer to retrieve into. * * If the UpsideDown flag was selected, this pointer * refer to the beginning of the last row in each buffer. */ XF_RESULT XF_ImageReadStrip( XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc, UInt32 dwStripHeight, UInt8 FAR *pBuffer); /* * XF_ImageReadFinish * * Notifies the XF library that the client is finished reading an image. * Every call to XF_ImageReadStart must be eventually followed by a call * to this function. */ XF_RESULT XF_ImageReadFinish(XF_INSTHANDLE xInst,XF_DOCHANDLE xDoc); /* * XF_ImageGetColorMap * */ XF_RESULT XF_GetColorMap(XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc, UInt32 dwImageID, UInt8 **ppColorMap); /* * XF_ImageSetColorMap * */ XF_RESULT XF_SetColorMap(XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc, UInt32 dwImageID, UInt8 *ppColorMap); /* * XF_GetAnnotInfo * * Returns information about an annotation on the current page. Client is * responsible for providing the XF_ANNOTINFO structure and intitializing * its dwSize field. Annotation numbers start at one, not zero. */ XF_RESULT XF_GetAnnotInfo(XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc, UInt32 dwAnnot, XF_ANNOTINFO FAR *pxAnnotInfo); /* * XF_GetAnnotData * * Returns the data for an annotation. The annotation is regarded as * a stream of bytes and is not parsed by this library in any way. * The client must provide the data buffer, whose size is specified by * the dwAnnotLength field of the XF_ANNOTINFO structure. * Annotation numbers start at one, not zero. */ XF_RESULT XF_GetAnnotData(XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc, UInt32 dwAnnot, UInt8 FAR *pBuf); /* * ********** ********** * ********** BEGIN WRITE API ********** * ********** ********** */ /* * XF_CreateDocument * * Create a new document of type 'dwFormat' (one of the XF_WRITE_FORMAT's) and * prepare to write data to it. The client must have already created the file * at the operating system level, so that the read, write, and seek methods * are available. * * A handle representing the document is passed back through the third parameter. * This handle is passed in to all subsequent write and read function calls. * * XIF only versions of the API will return XF_NOSUPPORT for dwFormat != XF_XIF. */ XF_RESULT XF_CreateDocument(XF_INSTHANDLE xInst, XF_TOKEN xFile, UInt32 dwFormat, XF_DOCHANDLE FAR *pxDoc); /* * XF_OpenDocumentWrite * * Open an existing document for writing. */ XF_RESULT XF_OpenDocumentWrite(XF_INSTHANDLE xInst, XF_TOKEN xFile, XF_DOCHANDLE FAR *pxDoc); /* * XF_SetPage * * Specifies a target page for image and annotation adds. This * is meant as an editing init for an existing page. When creating * a new page, the AddPage function implicitly sets the current page * appropriately. * * For single page image formats, this call will return a XF_NOSUPPORT error. */ XF_RESULT XF_SetPage(XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc, UInt32 dwPageNumber); /* * XF_CopyPage * * Copies specified page from xSrcDoc to xDstDoc. Supports page * deletion and reordering. * * This operation fails if the src page does not exist or the * dst page already exists and for any other parameter inconsistencies * * For single page image formats, this call will return a XF_NOSUPPORT error. */ XF_RESULT XF_CopyPage( XF_INSTHANDLE xInst, XF_TOKEN xFile, XF_DOCHANDLE xSrcDoc, XF_DOCHANDLE xDstDoc, UInt32 dwSrcPageNumber, UInt32 dwDstPageNumber); /* * XF_AddPageStart * * Adds a new page to a multipage document and selects it as the current page. * This function can be used to insert a new page into the middle of a * document, by using the dwPageNumber parameter to specify the desired * page number. Page numbers start at one, not zero. Setting * dwPageNumber = 0 causes the new page to be added at the end * of the document. The operation will fail if a nonsequential * dwPageNumber is specified, that is, {0, 1, 2, 7} is not a valid page * sequence, and the attempt to add page 7 would fail. * * For XIF files, the XF_AddPageStart call is normally followed by one or more calls to * XF_AddImage and possibly XF_AddSubImage. * * For single page image formats, this call will return a XF_NOSUPPORT error. */ XF_RESULT XF_AddPageStart(XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc, UInt32 dwPageNumber); /* * XF_AddPageFinish * */ XF_RESULT XF_AddPageFinish(XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc); /* * XF_AddImage * * Adds a new primary image to the current page. For example, images of * type XF_USAGE_MASTER, XF_USAGE_PICTURESEGMENT, etc. * * Note that every empty page must start with a master image which defines the * boundaries of the page. XF_BADPARAMETER will be returned if the first image * added is not of type XF_USAGE_MASTER. * */ XF_RESULT XF_AddImage( XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc, XF_IMAGEINFO FAR *pImageInfo, UInt32 *pImageID); /* * XF_AddSubImage * * Adds a secondary subimage to the specified primary image. For example, * Use this proc to add an XF_USAGE_MASK to an XF_USAGE_PICTURESEGMENT. * Bad subimage type combinations, such as attempting to add an * an XF_USAGE_MASTER as a subimage, will return XF_USAGE_BADPARAMETER. * * For all image formats except XIF 2.0 or greater, this call will return a * XF_NOSUPPORT error. */ XF_RESULT XF_AddSubImage( XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc, UInt32 dwImageID, XF_IMAGEINFO FAR *pSubImageInfo, UInt32 *pSubImageID); /* * XF_ImageWriteStart * * Initiates the write operation for the specified image. This call * must be followed by a number of XF_ImageWriteImageData calls dictated by * the image and strip size and a closing call to XF_ImageWriteFinish. * * The client may perform the data compression (CCITT Group IV or JPEG) * themselves and pass in the result. If so, the XF_IMAGEFLAGS_Compression * bit will be set. * * The compression type is inferred from the file format and image type. * The rows per strip value is specified in the XF_IMAGEINFO struct when the * image is added. * */ XF_RESULT XF_ImageWriteStart( XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc, UInt32 dwImageID, UInt32 dwFlags, UInt32 dwBytesPerRow); /* * XF_ImageWriteStrip * * Writes a strip of data to specified image. * Fails if dwStripHeight exceeds RowsPerStrip value for this image, * or if total rows written exceeds the image height. */ XF_RESULT XF_ImageWriteStrip( XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc, UInt32 dwStripHeight, UInt8 *pBuffer); /* * XF_ImageWriteFinish * * Cleans up write operation state and performs consistecy check. * Fails if correct number of rows not written. */ XF_RESULT XF_ImageWriteFinish( XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc); /* * XF_AddAnnotion * * Adds an annotation to the current page. * * For non-XIF image formats, this call will return a XF_NOSUPPORT error. */ XF_RESULT XF_AddAnnotion( XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc, XF_ANNOTINFO FAR *pxAnnotInfo, UInt8 FAR *pBuf, UInt32 *pAnnotID); /* * XF_DeleteAnnotation * * Deletes the specified annotation from the current page. * * For non-XIF image formats, this call will return a XF_NOSUPPORT error. */ XF_RESULT XF_DeleteAnnotation( XF_INSTHANDLE xInst, XF_DOCHANDLE xDoc, UInt32 dwAnnotID); /* Wang Viewer Only! */ /* * XF_GetMergedImageDIB * * Take the current page of an XFile document and merge all its images * into a single binary image the size of the master image, with picture * segments dithered. * * The entire resulting image is copied out in Windows DIB format to a buffer * provided by the client. The client is responsible for making sure that * the image is sufficiently large. */ XF_RESULT XF_GetMergedImageDIB(XF_INSTHANDLE xfInst, XF_DOCHANDLE xfDoc, void *pBuf); #ifdef __cplusplus } #endif #endif