/* cii.h ** Copyright (C) 1990, 1993 by Xerox Corporation. All rights reserved. ** MFP, October 28, 1993 12:48:42 pm PDT ** ** Version CII-93-10-28 ** ** Caveats: ** Device creation procedures are not part of cii.h; see ciisetup.h. ** ** Changes since CII-93-07-01 ** New methods: ** CII←MakeSampledBlack ** CII←ApplyCCITTFacsimileDecompressionFilter ** CII←SetSeparation ** CII←SetOutputBuffers ** CII←SetColorTable ** Revised: ** CII←StrokeControlRep now has provisions for dashed strokes. ** ** Changes since CII-93-08-11 ** New methods: ** CII←MakeLookupTable ** CII←DestroyLookupTable ** CII←SetColorLookupTable ** CII←GetColorLookupTable ** CII←Sync ** ** Changes since CII-93-09-21 ** The comments to GetMatrix and GetInitialMatrix were made more ** specific about the the result of GetMatrix on a newly-created ** handle. ** ** Changes since CII-93-09-28 ** New methods: ** CII←RegisterCleanupObject ** CII←UnRegisterCleanupObject ** CII←SetInitialMatrix ** */ #ifndef cii←h #define cii←h /********************************************************************** ** CII←RES: TYPE ** ** ** ** Error Codes ** **********************************************************************/ typedef enum { CII←RES←ok = 0, CII←RES←bounds = 1001, CII←RES←overflow = 1002, CII←RES←zeroDivide = 1003, CII←RES←nilFault = 1004, CII←RES←insufficientMemory = 1005, CII←RES←ioError = 1006, CII←RES←timeout = 1007, CII←RES←eof = 1008, CII←RES←numericalInstability = 1009, CII←RES←bug = 1010, CII←RES←fileNotFound = 1020, CII←RES←colorModelOperatorNotFound = 1021, CII←RES←colorOperatorNotFound = 1022, CII←RES←colorNotFound = 1023, CII←RES←decompressorNotFound = 1024, CII←RES←fontNotFound = 1025, CII←RES←operatorNotFound = 1026, CII←RES←resourceNotFound = 1027, CII←RES←accessError = 1028, CII←RES←syntax = 1040, CII←RES←undefinedOperation = 1041, CII←RES←invalidCompressedSequence = 1042, CII←RES←malformedFont = 1043, CII←RES←invalidEncoding = 1044, CII←RES←invalidHeader = 1045, CII←RES←invalidIdentifier = 1046, CII←RES←invalidInstructionProperty = 1047, CII←RES←invalidName = 1048, CII←RES←invalidString = 1049, CII←RES←invalidToner = 1050, CII←RES←invalidVersion = 1051, CII←RES←nullValue = 1060, CII←RES←illegalAlternateMetrics = 1061, CII←RES←illegalColor = 1062, CII←RES←unknownSpecialColor = 1063, CII←RES←unknownSignalType = 1064, CII←RES←wrongShape = 1065, CII←RES←wrongSize = 1066, CII←RES←notCardinal = 1067, CII←RES←notInteger = 1068, CII←RES←notNumber = 1069, CII←RES←wrongType = 1070, CII←RES←noFont = 1071, CII←RES←illegalArguments = 1072, CII←RES←illegalTransformation = 1073, CII←RES←illegalPixelMask = 1074, CII←RES←illegalPropertyVector = 1075, CII←RES←illegalRunVector = 1076, CII←RES←undefinedProperty = 1077, CII←RES←stackOverflow = 1080, CII←RES←stackUnderflow = 1081, CII←RES←saveRestoreMismatch = 1082, CII←RES←markMismatch = 1083, CII←RES←unmarkFailed = 1084, CII←RES←invalidOperationSequence = 1085, CII←RES←obsoleteConstruct = 1100, CII←RES←unsupportedColorOperator = 1101, CII←RES←notImplemented = 1102, CII←RES←unimplemented = 1103, CII←RES←squareEndOnStrokeOfZeroLength = 1120, CII←RES←unableToProperlyAdjustMaskPositions = 1121, CII←RES←noSubstituteColor = 1122, CII←RES←fontSubstitution = 1123, CII←RES←appearance = 1124, CII←RES←error = 1140, CII←RES←copySensitive = 1160 } CII←RES; /********************************************************************** ** CII←Handle: TYPE ** ** ** ** This is the primary object for the imaging operations; most of ** ** this interface is concerned with the methods belonging to this ** ** kind of object. ** **********************************************************************/ typedef struct CII←ObjectRep * CII←Handle; /********************************************************************** ** CII←Destroy: METHOD ** ** ** ** Should be called exactly once on each CII←Handle created. ** ** Prior to handle destruction, each of the registered ** ** CleanupObjects is notified - see the RegisterCleanupObject ** ** method for details. ** **********************************************************************/ #define CII←Destroy(h) \ (((h)->Destroy)(h)) typedef CII←RES PROC←CII←Destroy(CII←Handle h); /********************************************************************** ** CII←Boolean: TYPE ** ** ** ** A Boolean: 0 => FALSE, 1 => TRUE ** **********************************************************************/ typedef int CII←Boolean; /********************************************************************** ** CII←Scaled: TYPE ** ** ** ** A fixed point number, scaled by 2**16 ** **********************************************************************/ typedef long int CII←Scaled; /********************************************************************** ** CII←RectangleRep: TYPE ** ** ** ** Explicit representation of a rectangle ** ** In client coordinates. ** ** (x,y) is one corner. ** ** w is the width, in the x direction. ** ** h is the height, in the y direction. ** ** w and/or h may be negative. ** **********************************************************************/ typedef struct CII←RectangleRep {float x, y, w, h;} CII←RectangleRep; /********************************************************************** ** CII←VectorRep: TYPE ** ** ** ** Explicit representation of a point or vector ** ** In client coordinates. ** **********************************************************************/ typedef struct CII←VectorRep {float x, y;} CII←VectorRep; /********************************************************************** ** CII←Color: TYPE ** ** ** ** Represents a color. ** ** Details are opaque to the client. These objects are ** ** heap-allocated, and so may be stored in persistent data ** ** structures. ** **********************************************************************/ typedef struct {int opaque;} *CII←Color; /********************************************************************** ** CII←DestroyColor: METHOD ** ** ** ** Should be called exactly once for each CII←Color returned to ** ** the client, after after which the client should not use the ** ** object again. The handle must be the same handle used to ** ** create the CII←Color. ** **********************************************************************/ #define CII←DestroyColor(h, color) \ (((h)->DestroyColor)(h, color)) typedef CII←RES PROC←CII←DestroyColor( CII←Handle h, CII←Color color ); /********************************************************************** ** CII←ColorOperator: TYPE ** ** ** ** Represents a color operator, which maps pixel values (tuples of ** ** numbers) into colors. ** ** Details are opaque to the client. These objects are ** ** heap-allocated, and so may be stored in persistent data ** ** structures. ** **********************************************************************/ typedef struct {int opaque;} *CII←ColorOperator; /********************************************************************** ** CII←DestroyColorOperator: METHOD ** ** ** ** Should be called exactly once for each CII←ColorOperator ** ** returned to the client, after after which the client should not ** ** use the object again. The handle must be the same handle used ** ** to create the CII←ColorOperator. ** **********************************************************************/ #define CII←DestroyColorOperator(h, colorOperator) \ (((h)->DestroyColorOperator)(h, colorOperator)) typedef CII←RES PROC←CII←DestroyColorOperator( CII←Handle h, CII←ColorOperator colorOperator ); /********************************************************************** ** CII←SampleRange: TYPE ** ** ** ** Used as a parameter to the color operator creation procs, ** ** declares the interval over which the signal values may range, ** ** and what the sense is. The signal values are the result of the ** ** samples after being processed through the lookup tables, if any. ** **********************************************************************/ typedef struct CII←SampleRange { float sWhite; /* input value corresponding to white */ float sBlack; /* input value for max density */ } CII←SampleRange; /********************************************************************** ** CII←Clipper: TYPE ** ** ** ** Represents a clipping region. ** ** Details are opaque to the client. These objects are ** ** heap-allocated, and so may be stored in persistent data ** ** structures. ** **********************************************************************/ typedef struct {int opaque;} *CII←Clipper; /********************************************************************** ** CII←DestroyClipper: METHOD ** ** ** ** Should be called exactly once for each CII←Clipper returned to ** ** the client, after after which the client should not use the ** ** object again. The handle must be the same handle used to ** ** create the CII←Clipper. ** **********************************************************************/ #define CII←DestroyClipper(h, clipper) \ (((h)->DestroyClipper)(h, clipper)) typedef CII←RES PROC←CII←DestroyClipper( CII←Handle h, CII←Clipper clipper ); /********************************************************************** ** CII←Font: TYPE ** ** ** ** Represents a font. ** ** Details are opaque to the client. These objects are ** ** heap-allocated, and so may be stored in persistent data ** ** structures. ** **********************************************************************/ typedef struct {int opaque;} *CII←Font; /********************************************************************** ** CII←DestroyFont: METHOD ** ** ** ** Should be called exactly once for each CII←Font returned to the ** ** client, after after which the client should not use the object ** ** again. The handle must be the same handle used to create the ** ** CII←Font. ** **********************************************************************/ #define CII←DestroyFont(h, font) \ (((h)->DestroyFont)(h, font)) typedef CII←RES PROC←CII←DestroyFont( CII←Handle h, CII←Font font ); /********************************************************************** ** CII←FillType: TYPE ** ** ** ** Specifies the fill rule. ** **********************************************************************/ typedef enum { CII←NONZERO←FILL, /* Use non-zero winding-number fill rule */ CII←EO←FILL /* Use even/odd winding-number fill rule */ } CII←FillType; /********************************************************************** ** CII←RasterRep: TYPE ** ** ** ** Describes the layout of a raster in memory ** **********************************************************************/ typedef struct CII←RasterRep { int sMinBox; /* box.min.s */ int fMinBox; /* box.min.f */ int sMaxBox; /* box.max.s */ int fMaxBox; /* box.max.f */ unsigned bitsPerSample; /* number of bits per sample */ unsigned bitsPerLine; /* number of bits per scan line */ long* basePointer; /* word pointer to data area */ unsigned bitIndex; /* index of first bit of data */ void* ref; /* for retaining collectible storage */ } CII←RasterRep; /********************************************************************** ** CII←SetMatrix: METHOD ** ** ** ** Sets the client-to-device transformation. ** **********************************************************************/ #define CII←SetMatrix(h, matrix) \ (((h)->SetMatrix)(h, matrix)) typedef CII←RES PROC←CII←SetMatrix( CII←Handle h, float matrix[] ); /********************************************************************** ** CII←GetMatrix: METHOD ** ** ** ** Gets the client-to-device transformation. For a newly-created ** ** handle, this will be the identity matrix. ** **********************************************************************/ #define CII←GetMatrix(h, matrixResult) \ (((h)->GetMatrix)(h, matrixResult)) typedef CII←RES PROC←CII←GetMatrix( CII←Handle h, float matrixResult[] ); /********************************************************************** ** CII←GetInitialMatrix: METHOD ** ** ** ** Gets the client-to-device transformation that maps the standard ** ** initial page coordinate system to device space, taking into ** ** account the resolution and scan direction of the device. Units ** ** are inch/72, as for PostScript(TM). Note that this is not the ** ** matrix that is current for a newly-created handle. ** **********************************************************************/ #define CII←GetInitialMatrix(h, matrixResult) \ (((h)->GetInitialMatrix)(h, matrixResult)) typedef CII←RES PROC←CII←GetInitialMatrix( CII←Handle h, float matrixResult[] ); /********************************************************************** ** CII←SetInitialMatrix: METHOD ** ** ** ** Sets the value to be returned by CII←GetInitialMatrix. This ** ** may be used reflect changes to the effective resolution, ** ** origin, and orientation. Note that the value of the initial ** ** matrix does not have any effect on the CII imaging methods, but ** ** rather is for the benefit of the client. ** **********************************************************************/ #define CII←SetInitialMatrix(h, matrix) \ (((h)->SetInitialMatrix)(h, matrix)) typedef CII←RES PROC←CII←SetInitialMatrix( CII←Handle h, float matrix[] ); /********************************************************************** ** CII←MakeGrayColorOperator: METHOD ** ** ** ** Makes a gray color operator ** **********************************************************************/ #define CII←MakeGrayColorOperator(a, b, c, d, e) \ (((a)->MakeGrayColorOperator)(a, b, c, d, e)) typedef CII←RES PROC←CII←MakeGrayColorOperator( CII←Handle h, CII←SampleRange* sampleRange, unsigned int sampleTableSize, float sampleTable[], CII←ColorOperator* colorOperatorResult ); /********************************************************************** ** CII←MakeRGBColorOperator: METHOD ** ** ** ** Makes a RGB color operator ** **********************************************************************/ #define CII←MakeRGBColorOperator(a, b, c, d, e, f, g) \ (((a)->MakeRGBColorOperator)(a, b, c, d, e, f, g)) typedef CII←RES PROC←CII←MakeRGBColorOperator( CII←Handle h, CII←SampleRange* sampleRange, unsigned int sampleTableSize, float sampleTableR[], float sampleTableG[], float sampleTableB[], CII←ColorOperator* colorOperatorResult ); /********************************************************************** ** CII←MakeCMYKColorOperator: METHOD ** ** ** ** Makes a CMYK color operator ** **********************************************************************/ #define CII←MakeCMYKColorOperator(a, b, c, d, e, f, g, h) \ (((a)->MakeCMYKColorOperator)(a, b, c, d, e, f, g, h)) typedef CII←RES PROC←CII←MakeCMYKColorOperator( CII←Handle h, CII←SampleRange* sampleRange, unsigned int sampleTableSize, float sampleTableC[], float sampleTableM[], float sampleTableY[], float sampleTableK[], CII←ColorOperator* colorOperatorResult ); /********************************************************************** ** CII←MakeHighlightColorOperator: METHOD ** ** ** ** Makes a Highlight color operator ** **********************************************************************/ #define CII←MakeHighlightColorOperator(a, b, c, d, e, f, g, h) \ (((a)->MakeHighlightColorOperator)(a, b, c, d, e, f, g, h)) typedef CII←RES PROC←CII←MakeHighlightColorOperator( CII←Handle h, CII←SampleRange* sampleRange, CII←Color baseColor, CII←Color highlightColor, unsigned int sampleTableSize, float sampleTableBaseColor[], float sampleTableHighlightColor[], CII←ColorOperator* colorOperatorResult ); /********************************************************************** ** CII←MakeColor: METHOD ** ** ** ** Creates a color by applying a color operator to a tuple of ** ** sample values. The samplesPerPixel parameter is present as an ** ** error check against the samplesPerPixel of the color operator ** **********************************************************************/ #define CII←MakeColor(h, colorOperator, samplesPerPixel, pixel, colorResult) \ (((h)->MakeColor)(h, colorOperator, samplesPerPixel, pixel, colorResult)) typedef CII←RES PROC←CII←MakeColor( CII←Handle h, CII←ColorOperator colorOperator, unsigned int samplesPerPixel, float pixel[], CII←Color* colorResult ); /********************************************************************** ** CII←MakeSampledBlack: METHOD ** ** ** ** Creates a color that consists of a black-and-white or ** ** black-and-clear pattern that is replicated as necessary to fill ** ** the entire mask area. The provided raster must have one bit ** ** per sample. The '1' bits specify black, and the '0' bits ** ** specify white or clear, depending on the 'clear' parameter. ** ** The transformation matrix maps the [s, f] coordinates of the ** ** source bitmap to the [s, f] device coordinates; the current ** ** matrix has no effect on the way the color is created. ** ** Note: If the tiling effect is not needed, it is normally ** ** preferable to use MaskBitmap (with a clipping region, if ** ** required). ** **********************************************************************/ #define CII←MakeSampledBlack(h, bitmap, pixelToDevice, clear, colorResult) \ (((h)->MakeSampledBlack)(h, bitmap, pixelToDevice, clear, colorResult)) typedef CII←RES PROC←CII←MakeSampledBlack( CII←Handle h, CII←RasterRep* bitmap, float pixelToDevice[], CII←Boolean clear, CII←Color* colorResult ); /********************************************************************** ** CII←SetColor: METHOD ** ** ** ** Sets the current color ** **********************************************************************/ #define CII←SetColor(h, color) \ (((h)->SetColor)(h, color)) typedef CII←RES PROC←CII←SetColor( CII←Handle h, CII←Color color ); /********************************************************************** ** CII←SetGray: METHOD ** ** ** ** Convenience proc to set gray; 0=>black, 1=>white ** **********************************************************************/ #define CII←SetGray(h, gray) \ (((h)->SetGray)(h, gray)) typedef CII←RES PROC←CII←SetGray( CII←Handle h, float* gray ); /********************************************************************** ** CII←SetRGB: METHOD ** ** ** ** convenience proc to set rgb color; 0=>black, 1=>full primary ** **********************************************************************/ #define CII←SetRGB(h, rgb) \ (((h)->SetRGB)(h, rgb)) typedef CII←RES PROC←CII←SetRGB( CII←Handle h, float rgb[] ); /********************************************************************** ** CII←SetHSV: METHOD ** ** ** ** convenience proc to set hsv color ** **********************************************************************/ #define CII←SetHSV(h, hsv) \ (((h)->SetHSV)(h, hsv)) typedef CII←RES PROC←CII←SetHSV( CII←Handle h, float hsv[] ); /********************************************************************** ** CII←SetCMYK: METHOD ** ** ** ** convenience proc to set cmyk color ** **********************************************************************/ #define CII←SetCMYK(h, cmyk) \ (((h)->SetCMYK)(h, cmyk)) typedef CII←RES PROC←CII←SetCMYK( CII←Handle h, float cmyk[] ); /********************************************************************** ** CII←GetColor: METHOD ** ** ** ** Gets the current color ** **********************************************************************/ #define CII←GetColor(h, colorResult) \ (((h)->GetColor)(h, colorResult)) typedef CII←RES PROC←CII←GetColor( CII←Handle h, CII←Color* colorResult ); /********************************************************************** ** CII←MaskRectangle: METHOD ** ** ** ** Masks a rectangle. ** ** Uses the current matrix, color, and clipping region ** **********************************************************************/ #define CII←MaskRectangle(h, rect) \ (((h)->MaskRectangle)(h, rect)) typedef CII←RES PROC←CII←MaskRectangle( CII←Handle h, CII←RectangleRep* rect ); /********************************************************************** ** CII←PathSink: TYPE ** ** ** ** Pointer to private information to be supplied to MoveTo, ** ** LineTo, CurveTo, and ConicTo. Normally the referent is ** ** stack-allocated; so don't retain this pointer when the path ** ** generator is done. ** **********************************************************************/ typedef struct CII←PathSinkObjectRep *CII←PathSink; /********************************************************************** ** CII←PathGenerator: TYPE ** ** ** ** An abstract, procedural representation of a path ** **********************************************************************/ typedef struct CII←PathGeneratorObjectRep *CII←PathGenerator; /********************************************************************** ** CII←GeneratePath: METHOD ** ** ** ** Invokes the PathGenerator into a PathSink ** **********************************************************************/ #define CII←GeneratePath(self, sink) \ (((self)->GeneratePath)(self, sink)) typedef CII←RES PROC←CII←GeneratePath( CII←PathGenerator self, CII←PathSink sink ); /********************************************************************** ** CII←MoveTo: METHOD ** ** ** ** begins a new trajectory at the point p; p0 := p ** **********************************************************************/ #define CII←MoveTo(sink, p) \ (((sink)->MoveTo)(sink, p)) typedef CII←RES PROC←CII←MoveTo( CII←PathSink sink, CII←VectorRep* p ); /********************************************************************** ** CII←LineTo: METHOD ** ** ** ** extends a straight line from p0 to p; p0 := p ** **********************************************************************/ #define CII←LineTo(sink, p) \ (((sink)->LineTo)(sink, p)) typedef CII←RES PROC←CII←LineTo( CII←PathSink sink, CII←VectorRep* p ); /********************************************************************** ** CII←CurveTo: METHOD ** ** ** ** extends a cubic curve from p0 (controlled by p[0], p[1]) to ** ** p[2]; p0 := p[2] ** **********************************************************************/ #define CII←CurveTo(sink, p) \ (((sink)->CurveTo)(sink, p)) typedef CII←RES PROC←CII←CurveTo( CII←PathSink sink, CII←VectorRep p[] ); /********************************************************************** ** CII←ConicControlRep: TYPE ** ** ** ** Control parameters for a conic piece ** **********************************************************************/ typedef struct CII←ConicControlRep { CII←VectorRep p1, p2; float s; } CII←ConicControlRep; /********************************************************************** ** CII←ConicTo: METHOD ** ** ** ** extends a conic curve from p0 (controlled by p1, s) to p2; p0 ** ** := p2 ** **********************************************************************/ #define CII←ConicTo(sink, c) \ (((sink)->ConicTo)(sink, c)) typedef CII←RES PROC←CII←ConicTo( CII←PathSink sink, CII←ConicControlRep* c ); /********************************************************************** ** CII←MaskFill: METHOD ** ** ** ** For filling an area specified by a path. ** **********************************************************************/ #define CII←MaskFill(h, pathGenerator, fillType) \ (((h)->MaskFill)(h, pathGenerator, fillType)) typedef CII←RES PROC←CII←MaskFill( CII←Handle h, CII←PathGenerator pathGenerator, CII←FillType fillType ); /********************************************************************** ** CII←Clip: METHOD ** ** ** ** Replaces the current clipping region with its intersection with ** ** the specified area ** **********************************************************************/ #define CII←Clip(h, pathGenerator, fillType) \ (((h)->Clip)(h, pathGenerator, fillType)) typedef CII←RES PROC←CII←Clip( CII←Handle h, CII←PathGenerator pathGenerator, CII←FillType fillType ); /********************************************************************** ** CII←GetClipper: METHOD ** ** ** ** Gets the current clipping region. ** **********************************************************************/ #define CII←GetClipper(h, clipperResult) \ (((h)->GetClipper)(h, clipperResult)) typedef CII←RES PROC←CII←GetClipper( CII←Handle h, CII←Clipper* clipperResult ); /********************************************************************** ** CII←SetClipper: METHOD ** ** ** ** Sets the current clipping region. ** **********************************************************************/ #define CII←SetClipper(h, clipper) \ (((h)->SetClipper)(h, clipper)) typedef CII←RES PROC←CII←SetClipper( CII←Handle h, CII←Clipper clipper ); /********************************************************************** ** CII←BuildClipperBegin: METHOD ** ** ** ** The sequence of calls ** ** CII←BuildClipperBegin(h); ** ** CII←MaskXXX(h, ...); ** ** ... ** ** CII←BuildClipperEnd(h); ** ** may be used to modify the clipping region by means of any of ** ** the masking operations. The area marked by these mask ** ** operations will be intersected with the active clipping region; ** ** if it is desired to totally replace the clipper, do ** ** CII←SetClipper(h, NIL); ** ** prior to the above sequence. ** ** The BuildClipperBegin / BuildClipperEnd sequence may not be ** ** nested. ** **********************************************************************/ #define CII←BuildClipperBegin(h) \ (((h)->BuildClipperBegin)(h)) typedef CII←RES PROC←CII←BuildClipperBegin(CII←Handle h); /********************************************************************** ** CII←BuildClipperEnd: METHOD ** ** ** ** See CII←BuildClipperBegin, above. ** **********************************************************************/ #define CII←BuildClipperEnd(h) \ (((h)->BuildClipperEnd)(h)) typedef CII←RES PROC←CII←BuildClipperEnd(CII←Handle h); /********************************************************************** ** CII←StrokeType: TYPE ** ** ** ** For controlling closed strokes ** **********************************************************************/ typedef enum {CII←OPEN←STROKE, CII←CLOSED←STROKE} CII←StrokeType; /********************************************************************** ** CII←EndType: TYPE ** ** ** ** End treatment for strokes ** **********************************************************************/ typedef enum { CII←SQUARE←END, CII←BUTT←END, CII←ROUND←END, CII←TRIANGULAR←END } CII←EndType; /********************************************************************** ** CII←JointType: TYPE ** ** ** ** Joint treatment for strokes ** **********************************************************************/ typedef enum { CII←MITER←JOINT, CII←BEVEL←JOINT, CII←ROUND←JOINT, CII←TRIANGULAR←JOINT, CII←NO←JOINT, CII←MITERCLIP←JOINT, CII←MITERBEVEL←JOINT } CII←JointType; /********************************************************************** ** CII←StrokeControlRep: TYPE ** ** ** ** Collected stroke control. ** ** For a normal (non-dashed) stroke, dashCount is 0. For a dashed ** ** stroke, dashCount is the number of elements in the dash pattern ** ** arry, dashArray. The dashArray elements are given in ** ** user-space units, and are used cyclicly to indicate the lengths ** ** of the on ond off sections of the stroke. These elements must ** ** be non-negative, and not all zero. ** ** The value of dashOffset indicates (in user-space units) where ** ** to start the pattern. ** ** If dashCorrectLength is positive, the dashArray values (and the ** ** offset value) are effectively multiplied by the ratio ** ** dashComputedLength/dashCorrectLength, ** ** where dashComputedLength is the length of the path, in user ** ** coordinates, as computed by the imager. This allows the client ** ** to have control over the number and ending state of the dashes ** ** without needing to use exactly the same length approximations ** ** as the imager does. ** ** The setting of strokeAdjust controls the way strokes are ** ** rendered; use 0 (FALSE) to get inferior quality. ** ** thickening is in device space and can be negative ** ** (i.e. thinning is OK) ** ** minThickness is in device space and should be non-negative. ** ** A CII←StrokeControlRep should be initialized with the value ** ** CII←INITIALSTROKECONTROL, the stamp value is used to help ** ** ensure that the fields have all been properly set up. ** **********************************************************************/ typedef struct CII←StrokeControlRep { CII←StrokeType strokeType; CII←EndType end; CII←JointType joint; float miterLimit; float strokeWidth; int dashCount; float* dashArray; float dashOffset; float dashCorrectLength; CII←Boolean strokeAdjust; CII←VectorRep thickening; CII←VectorRep minThickness; int stamp; } CII←StrokeControlRep; #define CII←INITIALSTROKECONTROL \ {0, CII←SQUARE←END, CII←MITER←JOINT, 0.0, 0.0, 0, (float*)0, \ 0.0, 0.0, 1, {0.0, 0.0}, {0.0, 0.0}, 6218} /********************************************************************** ** CII←MaskStroke: METHOD ** ** ** ** Masks a stroke ** **********************************************************************/ #define CII←MaskStroke(h, pathGenerator, s) \ (((h)->MaskStroke)(h, pathGenerator, s)) typedef CII←RES PROC←CII←MaskStroke( CII←Handle h, CII←PathGenerator pathGenerator, CII←StrokeControlRep* s ); /********************************************************************** ** CII←MaskBitmap: METHOD ** ** ** ** Uses a bitmap as a mask. The raster provided should be 1 bit ** ** per pixel. The current transformation matrix is used to ** ** specify the mapping of the [s, f] source coordinate system to ** ** the device coordinate system. The current color fills the ** ** portions of the output image that correspond with the '1' bits. ** ** In most cases, the background color will be NIL, which means ** ** the '0' bits are clear, and this acts like a true masking ** ** operation. However, if the background color is not NIL, it ** ** will be used to fill the portions of the output image that ** ** correspond with the '0' bits of the source. ** **********************************************************************/ #define CII←MaskBitmap(h, raster, background) \ (((h)->MaskBitmap)(h, raster, background)) typedef CII←RES PROC←CII←MaskBitmap( CII←Handle h, CII←RasterRep* raster, CII←Color background ); /********************************************************************** ** CII←MaskDeviceTrapezoid: METHOD ** ** ** ** Masks a trapezoid, expressed in device coordinates. This ** ** operation ignores the clipping region, as well as the clipper, ** ** so it is up to the client to make sure that the trapezoid has ** ** been properly transformed and clipped. The interpretation of ** ** the parameters is as follows: ** ** sMin, fMin, sMax, fMax: these express the bounding box of the ** ** trapezoid; they are integers in device space and therefore ** ** demarcate the boundaries of pixels. Only pixels inside ** ** this box will be affected by the mask. ** ** f0, df0: these express the starting location and slope of one ** ** of the trapezoid's sides. These are both fixed-point ** ** representations of rational numbers, with a scale factor of ** ** 65536 (2**16). The value of f0 is the point at which the ** ** side intersects the line of constant s value (sMin+0.5). ** ** The corresponding values for successive lines are obtained ** ** by adding df0 to the previous line's value. ** ** f1, df1: these are like f0 and df0, but for the opposite side. ** ** It is permitted for the two sides of the trapezoid to ** ** cross, and for the sides to extend beyond the sides of the ** ** bounding box; in the latter case the mask will be clipped ** ** by the bounding box. The mask includes precisely those ** ** pixel areas [s..s+1) X [f..f+1) such that ** ** (sMin <= s < sMax) and (fMin <= f < fMax) and ( ** ** (f0+(s-sMin)*df0) <= C*(f+0.5) < (f1+(s-sMin)*df1) or ** ** (f1+(s-sMin)*df1) <= C*(f+0.5) < (f0+(s-sMin)*df0)), ** ** where C is the scale factor (2**16). ** ** As described thus far, the trapezoid is filled using a ** ** point-sampled, pixel-center rule. To get the effect of ** ** including any pixel touched by the trapezoid, consistent with ** ** section 6.5.1 of the PLRM(2nd ed) the client may do the ** ** following: ** ** 1. If necessary, subdivide the original trapezoid to ** ** eliminate crossing sides. This step may not be needed ** ** if the source of the trapezoids is guaranteed never to ** ** create such beasts. ** ** 2. Use the floor function to calculate sMin and fMin, and ** ** the ceiling function to calculate sMax and fMax, rather ** ** than rounding. ** ** 3. Sort the sides so that the f value for side 0 does not ** ** exceed the f value for side 1; this makes sense by ** ** virtue of step 1, which eliminated crossings. ** ** 4. The calculation of df0 and df1 stay the same, since the ** ** slope of the sides does not change when you offset them. ** ** However, before the calculation of f0 as the ** ** intersection of side 0 with the (sMin+0.5) line, offset ** ** the side 0 line by (ds, df) = (-0.5, -0.5) if df0 < 0, ** ** or by (0.5, -0.5) if df0 > 0 (if df0 = 0, both offsets ** ** give the same answer). Similarly, offset side 1 by ** ** (0.5, 0.5) if df1 < 0, or by (-0.5, 0.5) otherwise; ** ** additionally, f1 should be decreased by 1 after ** ** conversion to scaled form. ** **********************************************************************/ #define CII←MaskDeviceTrapezoid(h, sMin, fMin, sMax, fMax, f0, df0, f1, df1) \ (((h)->MaskDeviceTrapezoid)(h, sMin, fMin, sMax, fMax, f0, df0, f1, df1)) typedef CII←RES PROC←CII←MaskDeviceTrapezoid( CII←Handle h, int sMin, int fMin, int sMax, int fMax, CII←Scaled f0, CII←Scaled df0, CII←Scaled f1, CII←Scaled df1 ); /********************************************************************** ** CII←MaskProgram: TYPE ** ** ** ** Represents a 'compiled' version of a little program for ** ** generating device masks. See MakeMaskProgram and ** ** MaskDeviceBoxes, below. ** ** Details are opaque to the client. These objects are ** ** heap-allocated, and so may be stored in persistent data ** ** structures. ** **********************************************************************/ typedef struct {int opaque;} *CII←MaskProgram; /********************************************************************** ** CII←DestroyMaskProgram: METHOD ** ** ** ** Should be called exactly once for each CII←MaskProgram returned ** ** to the client, after after which the client should not use the ** ** object again. The handle must be the same handle used to ** ** create the CII←MaskProgram. ** **********************************************************************/ #define CII←DestroyMaskProgram(h, maskProgram) \ (((h)->DestroyMaskProgram)(h, maskProgram)) typedef CII←RES PROC←CII←DestroyMaskProgram( CII←Handle h, CII←MaskProgram maskProgram ); /********************************************************************** ** CII←MakeMaskProgram: METHOD ** ** ** ** Various CII clients may choose to represent mask data in ** ** various forms, differing in detail, but all representing mask ** ** data in device coordinates. To deal effectively with this ** ** diversity, CII allows device-resolution mask data to be stored ** ** in a form driven by the client, and accepts a little program ** ** that knows how to decode the data into device-boxes. This ** ** program is provided in the form of an ascii string, using the ** ** little language we define here. The CII implementation may ** ** work by (a) interpreting the string, by (b) recognizing special ** ** cases, or even by (c) compiling it into a small ** ** machine-language program. So that any such processing need be ** ** done only once, the CII←MakeMaskProgram is a separate call from ** ** CII←MaskDeviceBoxes. ** ** The machine model for this little programming language is as ** ** follows: ** ** There is one accumulator and ten registers, each 32 bits wide. ** ** Registers 0, 1, 2, and 3 have a special meaning, as follows: ** ** 0 - sMin ** ** 1 - fMin ** ** 2 - sMax ** ** 3 - fMax ** ** These assigned registers are used to communicate the resulting ** ** device boxes out of the program, via the E instruction; they ** ** are also initialized to be the clipping box that is passed to ** ** CII←MaskDeviceBoxes. The accumulator and the other registers ** ** are initialized to zero. ** ** For input to the program, there is (conceptually) a stream of ** ** input bytes; for CII←MaskDeviceBoxes, this data comes from ** ** consecutive memory locations. The value of bigEndian ** ** determines the order with which the bytes are fetched. The ** ** program should respect alignment - the data for F2 and F4 must ** ** occur on 2-byte and 4-byte boundaries, respectively, and the ** ** maskData pointer should be aligned on a word boundary. A ** ** program that needs to deal with unaligned data must assemble ** ** the bytes itself. ** ** The instructions in the program string are each one or two ** ** characters long. In the following description, k is a single ** ** decimal digit, and denotes a register number, and A denotes the ** ** accumulator. ** ** { start loop ** ** } end loop ** ** Lk load var k into A ** ** Sk store accum into var k ** ** +k Add var k to A ** ** -k Subtract var k from A ** ** ↑k Shift (unsigned) A by (signed) count in register k ** ** X exit loop if A is zero ** ** ~ ** ** F1 F2 F4 - fetch 1, 2, or 4 bytes into A, bump src pointer ** ** W1 W2 - fetch 1 or 2 bytes, unsigned, into A, bump src ** ** pointer ** ** = clear A ** ** 0 .. 7 - multiply A by 8 and add digit value. ** ** E emit a box (in registers 0 to 3) ** ** The program string is terminated by a null. No white space is ** ** allowed. The storage for the program string may be re-used ** ** after the MakeMaskProgram call is complete. ** ** The shift command multiplies by 2**k, dropping any bits that ** ** fall off either end of the word. ** ** This is codeVersion 1; this value should be explicitly coded ** ** with the program string, rather than symbolically, so that may ** ** be updated when the program string is updated. ** ** The program execution terminates when the end is reached, or ** ** when a fetch is attempted and there is no further data. ** ** As a simple example, the following program decodes a simple ** ** run-length encoding of a monotone region, consisting of a ** ** sequence of halfwords that give the start and length of the box ** ** on each scanline, with the start relative to the initial fMin: ** ** L1S4L2S5{L0-5XW2+4S1W2+1S3=1+0S2ES0} ** ** Breaking this down, we get: ** ** L1S4 save the initial fMin in register 4 ** ** L2S5 save the initial sMax in register 5 ** ** {L0-5X while sMin ~= sMaxInitial do ** ** W2+4S1 fMin := fetch2()+fMinInitial ** ** W2+1S3 fMax := fetch2()+fMin ** ** =1+0S2 sMax := sMin+1 ** ** E emit(sMin, fMin, sMax, fMax) ** ** S0 sMin := sMin+1 ** ** } end ** ** ** ** Notes: ** ** Loops may be nested. ** ** A simple conditional may be obtained by the idiom: ** ** { <condition> X <action> =X} ** ** The equal sign together with the digits 0 to 7 constitute an ** ** idiom for loading octal constants. Nontrivial constants may ** ** be loaded into registers outside of any loop. ** **********************************************************************/ #define CII←MakeMaskProgram(h, codeVersion, bigEndian, codeString, maskProgramResult) \ (((h)->MakeMaskProgram)(h, codeVersion, bigEndian, codeString, maskProgramResult)) typedef CII←RES PROC←CII←MakeMaskProgram( CII←Handle h, int codeVersion, CII←Boolean bigEndian, char* codeString, CII←MaskProgram* maskProgramResult ); /********************************************************************** ** CII←MaskDeviceBoxes: METHOD ** ** ** ** See CII←MakeMaskProgram for details of maskProgram. This ** ** operation bypasses the transformation and the clipper, leaving ** ** these responsibilities to the client. ** ** sMin, fMin, sMax, fMax specify the bounds of the mask. It is ** ** an error to exceed these bounds. ** ** boxOrder gives some information about the generated boxes: ** ** 0 - nothing is known about the order or overlap of the boxes ** ** 1 - boxes will be disjoint ** ** 2 - boxes will be disjoint, nonempty, and for any two ** ** consecutive boxes a and b, b.sMin >= a.sMax-1 ** **********************************************************************/ #define CII←MaskDeviceBoxes(a, b, c, d, e, f, g, h, i) \ (((a)->MaskDeviceBoxes)(a, b, c, d, e, f, g, h, i)) typedef CII←RES PROC←CII←MaskDeviceBoxes( CII←Handle h, int sMin, int fMin, int sMax, int fMax, int boxOrder, CII←MaskProgram maskProgram, int maskDataByteCount, void* maskData ); /********************************************************************** ** CII←FindFont: METHOD ** ** ** ** Finds a font, given a name. ** ** fontName is the Hierarchical name, slash delimited ** **********************************************************************/ #define CII←FindFont(h, fontName, fontResult) \ (((h)->FindFont)(h, fontName, fontResult)) typedef CII←RES PROC←CII←FindFont( CII←Handle h, char* fontName, CII←Font* fontResult ); /********************************************************************** ** CII←ModifyFont: METHOD ** ** ** ** Makes a new font with a modified transformation, according to ** ** the supplied matrix. ** **********************************************************************/ #define CII←ModifyFont(h, font, mp, fontResult) \ (((h)->ModifyFont)(h, font, mp, fontResult)) typedef CII←RES PROC←CII←ModifyFont( CII←Handle h, CII←Font font, float mp[], CII←Font* fontResult ); /********************************************************************** ** CII←MakeFontAtom: METHOD ** ** ** ** Differs from ModifyFont in that it ignores the translation ** ** component of the supplied matrix ** **********************************************************************/ #define CII←MakeFontAtom(h, font, mp, fontResult) \ (((h)->MakeFontAtom)(h, font, mp, fontResult)) typedef CII←RES PROC←CII←MakeFontAtom( CII←Handle h, CII←Font font, float mp[], CII←Font* fontResult ); /********************************************************************** ** CII←EasyMetrics: TYPE ** ** ** ** all easy => never call hardMetrics proc ** ** ordinary easy => call hardMetrics for spacing characters ** ** none easy => call hardMetrics for each character ** **********************************************************************/ typedef enum { CII←ALL←EASY←METRICS, CII←ORDINARY←EASY←METRICS, CII←NONE←EASY←METRICS } CII←EasyMetrics; /********************************************************************** ** CII←CharCode: TYPE ** ** ** ** A 32-bit character code ** **********************************************************************/ typedef unsigned long CII←CharCode; /********************************************************************** ** CII←MaskInfo: TYPE ** ** ** ** Information about the character just masked, for benefit of ** ** hardMetrics procedure ** **********************************************************************/ typedef struct CII←MaskInfo { CII←Font fontAtom; CII←CharCode charCode; CII←Scaled deltaX; /* device coords, slow scan direction */ CII←Scaled deltaY; /* device coords, fast scan direction */ int minX, minY, maxX, maxY; /* bounding box, device coords */ } CII←MaskInfo; /********************************************************************** ** CII←ShowArgs: TYPE ** ** ** ** The control block for Show. This is a read-write area; the cp ** ** field and the start field get updated to reflect how much work ** ** has been done. ** **********************************************************************/ typedef struct CII←ShowArgs { CII←Font fontAtom; /* with transformation to device coordinates */ CII←EasyMetrics easyMetrics; /* controls metrics callback */ CII←Boolean noImage; /* TRUE turns off imaging */ CII←RES (*hardChar)(CII←Handle, struct CII←ShowArgs*); CII←RES (*hardMetrics)(CII←Handle, struct CII←ShowArgs*, struct CII←MaskInfo*); CII←VectorRep cp; /* gets updated; device coords */ int start; /* gets updated for callbacks */ int end; /* characters[end-1] is the last one */ CII←CharCode* characters; /* the character codes, one per word */ void* clientData; /* for benefit of callbacks */ } CII←ShowArgs; /********************************************************************** ** CII←DoHardChar: METHOD ** ** ** ** May be used as the hardChar proc, or simply to show a single ** ** character without using the mask cache. ** ** N.B. ignores current transformation ** **********************************************************************/ #define CII←DoHardChar(h, s) \ (((h)->DoHardChar)(h, s)) typedef CII←RES PROC←CII←DoHardChar( CII←Handle h, CII←ShowArgs* s ); /********************************************************************** ** CII←DoHardMetrics: METHOD ** ** ** ** May be used as the hardMetrics proc to provide the default ** ** behavior of adding the escapement to the current position. ** ** N.B. ignores current transformation ** **********************************************************************/ #define CII←DoHardMetrics(h, s, maskInfo) \ (((h)->DoHardMetrics)(h, s, maskInfo)) typedef CII←RES PROC←CII←DoHardMetrics( CII←Handle h, CII←ShowArgs* s, CII←MaskInfo* maskInfo ); /********************************************************************** ** CII←Show: METHOD ** ** ** ** General-purpose Show procedure. ** **********************************************************************/ #define CII←Show(h, s) \ (((h)->Show)(h, s)) typedef CII←RES PROC←CII←Show( CII←Handle h, CII←ShowArgs* s ); /********************************************************************** ** CII←BufferedSeparationImage: METHOD ** ** ** ** Draws a portion of the buffered image, using any data outside ** ** of the sMin .. sMax range any interpolation or other ** ** anti-aliasing that might be done. This range will typically ** ** specify most of the image, with only a few scanlines of context ** ** from adjacent bands. ** **********************************************************************/ #define CII←BufferedSeparationImage(a, b, c, d, e, f, g) \ (((a)->BufferedSeparationImage)(a, b, c, d, e, f, g)) typedef CII←RES PROC←CII←BufferedSeparationImage( CII←Handle h, CII←RasterRep* buffers[], unsigned int samplesPerPixel, int sMin, int sMax, CII←ColorOperator colorOperator, CII←Boolean interpolate ); /********************************************************************** ** CII←BufferedInterleavedImage: METHOD ** ** ** ** Like BufferedSeparationImage, but the samples are interleaved ** ** in the buffer. The fSize of the buffer is samplesPerPixel ** ** times greater than the fSize of the image data. ** **********************************************************************/ #define CII←BufferedInterleavedImage(a, b, c, d, e, f, g) \ (((a)->BufferedInterleavedImage)(a, b, c, d, e, f, g)) typedef CII←RES PROC←CII←BufferedInterleavedImage( CII←Handle h, CII←RasterRep* buffer, unsigned int samplesPerPixel, int sMin, int sMax, CII←ColorOperator colorOperator, CII←Boolean interpolate ); /********************************************************************** ** CII←ImageSource: TYPE ** ** ** ** This is a simple, abstract byte-stream object. ** **********************************************************************/ typedef struct CII←ImageSourceObjectRep * CII←ImageSource; /********************************************************************** ** CII←ImageSourceRead: METHOD ** ** ** ** The read proc places the number of bytes read into ** ** *nbytesResult. Zero bytes read indicates the end-of-stream. ** **********************************************************************/ #define CII←ImageSourceRead(self, buf, nbytes, nbytesResult) \ (((self)->ImageSourceRead)(self, buf, nbytes, nbytesResult)) typedef CII←RES PROC←CII←ImageSourceRead( CII←ImageSource self, void* buf, unsigned int nbytes, unsigned int* nbytesResult ); /********************************************************************** ** CII←ImageSourceDestroy: METHOD ** ** ** ** Asserts this image source is finished. ** **********************************************************************/ #define CII←ImageSourceDestroy(self) \ (((self)->ImageSourceDestroy)(self)) typedef CII←RES PROC←CII←ImageSourceDestroy(CII←ImageSource self); /********************************************************************** ** CII←StreamImage: METHOD ** ** ** ** Draws the image; takes care of breaking the image into ** ** managable pieces. The image data is pulled from the source, ** ** and is always interleaved, with each scanline starting at a bit ** ** index that is zero modulo padMod. Use padMod = 1 for no ** ** padding, padMod = 8 for byte-aligned scanlines, etc. ** **********************************************************************/ #define CII←StreamImage(a, b, c, d, e, f, g, h, i) \ (((a)->StreamImage)(a, b, c, d, e, f, g, h, i)) typedef CII←RES PROC←CII←StreamImage( CII←Handle h, unsigned int sSize, unsigned int fSize, unsigned int bitsPerSample, unsigned int samplesPerPixel, unsigned int padMod, CII←ColorOperator co, CII←Boolean interpolate, CII←ImageSource source ); /********************************************************************** ** CII←MaskStreamBits: METHOD ** ** ** ** Stream-oriented analogue to MaskBitmap. Always 1 bit per ** ** pixel. The padMod argument is as for StreamImage. ** **********************************************************************/ #define CII←MaskStreamBits(h, sSize, fSize, padMod, source, background) \ (((h)->MaskStreamBits)(h, sSize, fSize, padMod, source, background)) typedef CII←RES PROC←CII←MaskStreamBits( CII←Handle h, unsigned int sSize, unsigned int fSize, unsigned int padMod, CII←ImageSource source, CII←Color background ); /********************************************************************** ** CII←ApplyCCITTFacsimileDecompressionFilter: METHOD ** ** ** ** Makes a new ImageSource that works by decompressing the data ** ** supplied by the input ImageSource according to the CCITT Group ** ** 3 or Group 4 Facsimile compression standards. ** ** ** ** input: This supplies the (compressed) source data. ** ** ** ** k: If negative, source is pure 2-D (Group 4) encoding. ** ** If zero, source is pure 1-D (Group 3) encoding. ** ** If positive, a mixed 1-D / 2-D encoding is accepted. The ** ** G3-specified limits on consecutive 2-D encoded scanlines is ** ** not enforced. ** ** ** ** requireEOL: If true, the end-of-line bit pattern is ** ** required at the end of each scan line. ** ** ** ** padMod: Additional zero bits are inserted at the end of each ** ** output scanline for alignment purposes; normal values for ** ** this would be 1 (no padding), 8 (pad to byte boundary), or ** ** 32 (pad to a word boundary). If the filtered output is ** ** destined for StreamImage or MaskStreamBits, this should ** ** match up with the padMod of that call. ** ** ** ** sSize: The number of scan lines (rows) present in the image. ** ** A value of 0 may be used if the scan count is not known. ** ** ** ** fSize: The number of source pixels in each scan line. (The ** ** facsimile standards assume a value of 1728, so the ability ** ** to specify this is a slight generalization of the ** ** standards.) ** ** ** ** endOfBlock: If true, the data is expected to be terminated ** ** with an end-of-block pattern, overriding the sSize ** ** parameter. If false, the data stops at end-of-block or ** ** after sSize scan lines, whichever comes first. ** ** ** ** blackIs1: If true, the black pixels in the source come out ** ** as 1 bits in the filtered output; otherwise the black pixels ** ** come out as 0 bits. (The facsimile standards are written in ** ** terms of black and white pixels, and leave unspecified the ** ** sense of the unencoded bits.) ** ** ** ** msbFirst: If true, the bits within each input byte of ** ** compressed data are interpreted with the ** ** most-significant-bit first; otherwise, interpret the bytes ** ** lsb-first. ** ** ** ** damagedRowsBeforeError: If > 0, with requireEOL and k >= 0, ** ** then tolerate this many damaged rows before generating an ** ** error. ** ** ** ** filteredResult: This is for returning the ImageSource that ** ** may be read to obtain the decompressed data. Note that the ** ** decompression won't, in general, take place until this ** ** source is read. (Issue: it should be specified what the ** ** destroy proc of the filtered stream does - should it call ** ** the destroy proc of the input stream or not?) ** ** ** ** There may be a performance advantage in using this ** ** decompression filter with the MaskStreamBits or StreamImage ** ** methods of this handle, because in such a case there is an ** ** opportunity for the implementation to avoid the extra buffering ** ** stage; this is the primary motivation for introducing this ** ** decompression filter into the CII interface. ** **********************************************************************/ #define CII←ApplyCCITTFacsimileDecompressionFilter(a, b, c, d, e, f, g, h, i, j, k, l) \ (((a)->ApplyCCITTFacsimileDecompressionFilter)(a, b, c, d, e, f, g, h, i, j, k, l)) typedef CII←RES PROC←CII←ApplyCCITTFacsimileDecompressionFilter( CII←Handle h, CII←ImageSource input, int k, CII←Boolean requireEOL, unsigned int padMod, unsigned int sSize, unsigned int fSize, CII←Boolean endOfBlock, CII←Boolean blackIs1, CII←Boolean msbFirst, int damagedRowsBeforeError, CII←ImageSource* filteredResult ); /********************************************************************** ** CII←Toner: TYPE ** ** ** ** Specifies a toner color for several of the more ** ** device-dependent methods ** **********************************************************************/ typedef enum { CII←TONER←BLACK, CII←TONER←CYAN, CII←TONER←MAGENTA, CII←TONER←YELLOW, CII←TONER←WHITE, CII←TONER←RED, CII←TONER←GREEN, CII←TONER←BLUE, CII←TONER←CUSTOM, CII←TONER←HIGHLIGHT } CII←Toner; /********************************************************************** ** CII←HalftonePropertiesForSeparation: TYPE ** ** ** ** Specifies the halftone dot growth for a given toner. For ** ** samples samples normalized to the range [0..maxSample], a ** ** printer pixel will be inked if sample > threshold; thus to ** ** allow full range on the output, the threshold values should be ** ** confined to the range [0..maxSample-1]. A value of 255 for ** ** maxSample is strongly recommended. ** ** Not all toner values will, in general, be meaningful for this ** ** call; the ones you probably want to use are CII←TONER←BLACK, ** ** CII←TONER←CYAN, CII←TONER←MAGENTA, and CII←TONER←YELLOW. ** **********************************************************************/ typedef struct CII←HalftonePropertiesForSeparation { char* halftoneType; /* make this NIL for now */ CII←Toner toner; /* says which toner this is for */ unsigned maxSample; /* expected range of input samples */ CII←RasterRep thresholds; /* the threshold array */ unsigned phase; /* successive rows offset by this much */ void* reserved; /* reserved - must be NIL */ } CII←HalftonePropertiesForSeparation; /********************************************************************** ** CII←HalftoneProperties: TYPE ** ** ** ** Represents the halftone properties for all toners. ** ** Details are opaque to the client. These objects are ** ** heap-allocated, and so may be stored in persistent data ** ** structures. ** **********************************************************************/ typedef struct {int opaque;} *CII←HalftoneProperties; /********************************************************************** ** CII←MakeHalftoneProperties: METHOD ** ** ** ** Makes the imager-private representation of the halftone ** ** properties. ** **********************************************************************/ #define CII←MakeHalftoneProperties(a, b, c, d) \ (((a)->MakeHalftoneProperties)(a, b, c, d)) typedef CII←RES PROC←CII←MakeHalftoneProperties( CII←Handle h, int separationCount, CII←HalftonePropertiesForSeparation halftonePropertiesForSeparation[], CII←HalftoneProperties* halftonePropertiesResult ); /********************************************************************** ** CII←SetHalftoneProperties: METHOD ** ** ** ** Sets the halftone properties for all toners. ** **********************************************************************/ #define CII←SetHalftoneProperties(h, halftoneProperties) \ (((h)->SetHalftoneProperties)(h, halftoneProperties)) typedef CII←RES PROC←CII←SetHalftoneProperties( CII←Handle h, CII←HalftoneProperties halftoneProperties ); /********************************************************************** ** CII←GetHalftoneProperties: METHOD ** ** ** ** Gets the imager-private representation of the halftone ** ** properties. ** **********************************************************************/ #define CII←GetHalftoneProperties(h, halftonePropertiesResult) \ (((h)->GetHalftoneProperties)(h, halftonePropertiesResult)) typedef CII←RES PROC←CII←GetHalftoneProperties( CII←Handle h, CII←HalftoneProperties* halftonePropertiesResult ); /********************************************************************** ** CII←DestroyHalftoneProperties: METHOD ** ** ** ** Should be called exactly once for each CII←HalftoneProperties ** ** returned to the client, after after which the client should not ** ** use the object again. The handle must be the same handle used ** ** to create the CII←HalftoneProperties. ** **********************************************************************/ #define CII←DestroyHalftoneProperties(h, halftoneProperties) \ (((h)->DestroyHalftoneProperties)(h, halftoneProperties)) typedef CII←RES PROC←CII←DestroyHalftoneProperties( CII←Handle h, CII←HalftoneProperties halftoneProperties ); /********************************************************************** ** CII←SetSeparation: METHOD ** ** ** ** For some devices, indicates which of the separations are to be ** ** constructed. Do not confuse this with the PostScript ** ** Separation color space. ** ** CII←RES←notImplemented => the device cannot support ** ** separations. ** ** CII←RES←invalidToner => the device cannot handle the selected ** ** toner. ** ** The color should be re-set after this method is invoked. ** **********************************************************************/ #define CII←SetSeparation(h, toner) \ (((h)->SetSeparation)(h, toner)) typedef CII←RES PROC←CII←SetSeparation( CII←Handle h, CII←Toner toner ); /********************************************************************** ** CII←SetOutputBuffers: METHOD ** ** ** ** For some devices, redirects the output to a different ** ** page/frame buffer. ** ** CII←RES←notImplemented => the device does not support ** ** changing the output buffer. ** ** CII←RES←wrongShape => the device does not support changing ** ** the dimensions of the output buffer. ** **********************************************************************/ #define CII←SetOutputBuffers(h, nBuffers, outputBuffers) \ (((h)->SetOutputBuffers)(h, nBuffers, outputBuffers)) typedef CII←RES PROC←CII←SetOutputBuffers( CII←Handle h, int nBuffers, CII←RasterRep outputBuffers[] ); /********************************************************************** ** CII←SetColorTable: METHOD ** ** ** ** Indicates the (device-dependent) color conversion tables to ** ** use. ** ** ** ** name: a null-terminated alphanumeric string naming the table; ** ** this is for informational purposes, and will generally not ** ** affect the behavior of the device. ** ** ** ** identification: a null-terminated ascii string with a longer ** ** description of the table; this will generally not affect the ** ** behavior of the device, but may be useful for diagnostic ** ** purposes. For example, it may include a description of how ** ** and when the table was created, and/or the name of the file ** ** that the table was loaded from. ** ** ** ** format: a null-terminated string identifying the format of the ** ** table. This is used by the device to determine whether the ** ** color table data is appropriate for the device. Each device ** ** will support only a limited number of formats (often 0 or ** ** 1); you will have to look elsewhere to find out what the ** ** supported formats are. As a special case, a null or ** ** zero-length format causes the device to revert to its ** ** initial color table. ** ** ** ** tableBase: A pointer to the color table data. This pointer ** ** must remain valid until a new color table is set or the ** ** handle is destroyed; furthermore, the client should not alter ** ** the table without doing another SetColorTable. ** ** ** ** tableByteLength: The length, in bytes, of the color table data. ** ** ** ** replacementHint: May give the stamp from a previous call (see ** ** stampValueResult, below). If the device can cache ** ** information about color tables, this may be used as a hint ** ** about which previous cache entry to replace. A value of 0 is ** ** recommended here unless the client really has some good ** ** information about the usage pattern of the color tables. ** ** ** ** stampValueResult: When SetColorTable is called for the first ** ** time with a given table, this should point to a ** ** zero-initialized word; the device stores a stamp in this word ** ** that it may use on subsequent calls to speed the loading of ** ** the color table data. The stamp should be presented to the ** ** device only in the case that the color table data is the same ** ** that was presented when the stamp was created. This may be ** ** used, for example, to take advantage of hardware that allows ** ** several tables to be in use at one time, without asking the ** ** client to keep track of how many such tables are available. ** ** ** ** Return codes: ** ** CII←RES←notImplemented => the device has ignored the table ** ** because the format was not recognized. ** ** CII←RES←malformedDataFile => the device has detected an ** ** error in the color table data. The check for a valid ** ** format is always done before this, so that if it is desired ** ** to test whether a particular format is known by the device ** ** before the actual table is read in, the client may pass a ** ** tableByteLength of 0 and check the return code. In the ** ** case of CII←RES←malformedDataFile, the color table should ** ** be set again (with a null format, if necessary), to ensure ** ** that a valid translation is in effect. ** ** ** ** The color should be re-set after the SetColorTable method is ** ** invoked. ** **********************************************************************/ #define CII←SetColorTable(a, b, c, d, e, f, g, h) \ (((a)->SetColorTable)(a, b, c, d, e, f, g, h)) typedef CII←RES PROC←CII←SetColorTable( CII←Handle h, char* name, char* identification, char* format, void* tableBase, unsigned int tableByteLength, unsigned int replacementHint, unsigned int* stampValueResult ); /********************************************************************** ** CII←LookupTable: TYPE ** ** ** ** Represents, by means of equally-spaced samples, a function that ** ** maps the real interval [0.0,1.0] into real values. ** ** Details are opaque to the client. These objects are ** ** heap-allocated, and so may be stored in persistent data ** ** structures. ** **********************************************************************/ typedef struct {int opaque;} *CII←LookupTable; /********************************************************************** ** CII←MakeLookupTable: METHOD ** ** ** ** The value of table[0] represents the value of the function at ** ** 0.0, table[tableSize-1] represents the value of the function at ** ** 1.0, and the remaining samples are equally-spaced in between ** ** these two extremes. Intermediate values are filled in, if ** ** necessary, by linear interpolation. These functions are used ** ** to provide some rudimentary control of the generation of ** ** device-dependent color. ** **********************************************************************/ #define CII←MakeLookupTable(h, tableSize, table, lookupTableResult) \ (((h)->MakeLookupTable)(h, tableSize, table, lookupTableResult)) typedef CII←RES PROC←CII←MakeLookupTable( CII←Handle h, unsigned int tableSize, float table[], CII←LookupTable* lookupTableResult ); /********************************************************************** ** CII←DestroyLookupTable: METHOD ** ** ** ** Should be called exactly once for each CII←LookupTable returned ** ** to the client, after after which the client should not use the ** ** object again. The handle must be the same handle used to ** ** create the CII←LookupTable. ** **********************************************************************/ #define CII←DestroyLookupTable(h, lookupTable) \ (((h)->DestroyLookupTable)(h, lookupTable)) typedef CII←RES PROC←CII←DestroyLookupTable( CII←Handle h, CII←LookupTable lookupTable ); /********************************************************************** ** CII←ColorLookupTableType: TYPE ** ** ** ** This enumeration is used to distinguish which of the various ** ** 1-d lookup tables are being referenced. ** ** ** ** CII←*←TRANSFER ** ** The RED, GREEN, BLUE, and GRAY transfer functions are ** ** applied as the final client-controlled stage of color ** ** generation (prior to any halftoning). Each of these ** ** functions transform a device-dependent component of the ** ** color independently of the other components. For a ** ** monochrome device, only the GRAY transfer function is used. ** ** For an RGB device, only the RED, GREEN, BLUE transfer ** ** functions are used, with one exception. The exception ** ** occurs whan a Gray color operator is in effect, in which ** ** case the GRAY transfer function is used prior to the ** ** conversion to RGB, and the RED, GREEN, BLUE transfer ** ** functions are not used. For a CMYK device, all four ** ** transfer functions are used; in this case, values of 0 ** ** correspond to maximum colorant, and values of 1 correspond ** ** minimum colorant; note this is the inverse of the usual ** ** sense of CMYK. ** ** There is the possibility of a device for which this ** ** expression of a final transfer function makes very little ** ** sense, for instance if the target is a CIE L*a*b* rendition. ** ** The device may ignore the transfer functions in such a ** ** case, except that the GRAY transfer shall always apply to ** ** the results of the Gray color operator. ** ** For the transfer functions, a NIL lookupTable corresponds to ** ** the identity function. ** ** All four transfer functions should be provided; if only a ** ** gray transfer function is available, it should be used for ** ** all four. ** ** ** ** CII←BLACK←GENERATION ** ** This function (BG) is used when the device needs to produce ** ** a CMYK output, and it only has three-component (CMY) color. ** ** The input to the BG is the minimum of the cyan, magenta, and ** ** yellow components, and the output is the amount of black; ** ** the range for both input and output is 0 (minimum colorant) ** ** to 1 (maximum colorant). Notice the sense of these numbers ** ** is opposite to that of the inputs and outputs of the ** ** transfer functions. ** ** A NIL BG lookupTable corresponds to the constant zero ** ** function. ** ** ** ** CII←UNDERCOLOR←REMOVAL ** ** This function (UCR) is used under the same circumstances as ** ** the black generation function, and takes the same input. ** ** The output is in the range -1 to +1, and says how much ** ** colorant to remove from each of the cyan, magenta, and ** ** yellow components. ** ** A NIL UCR lookupTable corresponds to the constant zero ** ** function. ** ** ** ** Note that this form of specification of BG and UCR functions is ** ** quite limited; some devices may benefit from functions that use ** ** more information than just MIN(C,M,Y). Such functions might be ** ** expressed as part of (device-dependent) data passed to ** ** SetColorTable. A device that recognizes this situation may end ** ** up effectively ignoring the BG and UCR lookup tables, because ** ** the color correction intrinsically generates CMYK. ** ** ** **********************************************************************/ typedef enum {CII←RED←TRANSFER, CII←GREEN←TRANSFER, CII←BLUE←TRANSFER, CII←GRAY←TRANSFER, CII←BLACK←GENERATION, CII←UNDERCOLOR←REMOVAL} CII←ColorLookupTableType; /********************************************************************** ** CII←SetColorLookupTable: METHOD ** ** ** ** Sets one of the color lookup tables. Refer to comments above ** ** for details. ** **********************************************************************/ #define CII←SetColorLookupTable(h, which, lookupTable) \ (((h)->SetColorLookupTable)(h, which, lookupTable)) typedef CII←RES PROC←CII←SetColorLookupTable( CII←Handle h, CII←ColorLookupTableType which, CII←LookupTable lookupTable ); /********************************************************************** ** CII←GetColorLookupTable: METHOD ** ** ** ** Gets one of the color lookup tables. ** **********************************************************************/ #define CII←GetColorLookupTable(h, which, lookupTableResult) \ (((h)->GetColorLookupTable)(h, which, lookupTableResult)) typedef CII←RES PROC←CII←GetColorLookupTable( CII←Handle h, CII←ColorLookupTableType which, CII←LookupTable* lookupTableResult ); /********************************************************************** ** CII←Sync: METHOD ** ** ** ** There may be a situation where the further processing of the ** ** output of a device requires the cooperation of the cii layer; ** ** for instance it may be necessary to complete processing of ** ** requests that have been internally buffered or that are being ** ** processed in parallel. The Sync method allows for this; the ** ** parameters allow for additional (device-dependent) data to be ** ** passed as appropriate. The interpretation of the data, if any, ** ** is not specified by this interface. The operation named ** ** "sync", with a null dataFormat and no data, will mean to ** ** complete all outstanding imaging requests. ** ** ** ** operationName: a null-terminated alphanumeric string naming ** ** the synchonization operation to be performed. An ** ** unrecognized operation will yield a return code of ** ** CII←RES←notImplemented. ** ** ** ** format: a null-terminated alphanumeric string identifying ** ** the format of the data. ** ** ** ** dataPointer: a pointer to any data the operation may require; ** ** devices might have operations that place results here, but ** ** they must respect the dataByteLength. ** ** ** ** dataByteLength: the length, in bytes, of the data area. ** **********************************************************************/ #define CII←Sync(h, operationName, format, dataPointer, dataByteLength) \ (((h)->Sync)(h, operationName, format, dataPointer, dataByteLength)) typedef CII←RES PROC←CII←Sync( CII←Handle h, char* operationName, char* format, void* dataPointer, unsigned int dataByteLength ); /********************************************************************** ** CII←CleanupObject: TYPE ** ** ** ** A CleanupObject, when registered with a given handle, will be ** ** invoked prior to the destruction of the handle. ** **********************************************************************/ typedef struct CII←CleanupObjectRep * CII←CleanupObject; /********************************************************************** ** CII←RegisterCleanupObject: METHOD ** ** ** ** Registers the client-supplied cleanupObject with the handle. ** ** Upon handle destruction, the cleanupObject will be ** ** unregistered, then sent the cleanup message. There may be more ** ** than one cleanupObject object registered with a given handle. ** ** RegisterCleanupObject does not check for duplicates; if there ** ** is a chance that the client has registered the cleanupObject ** ** already, it may call CII←UnRegisterCleanupObject first to ** ** eliminate any duplicates. The cleanup objects are called in ** ** reverse order of registration. ** **********************************************************************/ #define CII←RegisterCleanupObject(h, cleanupObject) \ (((h)->RegisterCleanupObject)(h, cleanupObject)) typedef CII←RES PROC←CII←RegisterCleanupObject( CII←Handle h, CII←CleanupObject cleanupObject ); /********************************************************************** ** CII←UnRegisterCleanupObject: METHOD ** ** ** ** Unregisters the cleanupObject, if it had previously been ** ** registered. In the case that cleanupObject got registered ** ** multiple times, this will only remove one registration, the ** ** most recently registered one. The match is done by pointer ** ** comparison of the cleanupObject. ** ** CII←RES←accessError => cleanupObject was not registered. ** **********************************************************************/ #define CII←UnRegisterCleanupObject(h, cleanupObject) \ (((h)->UnRegisterCleanupObject)(h, cleanupObject)) typedef CII←RES PROC←CII←UnRegisterCleanupObject( CII←Handle h, CII←CleanupObject cleanupObject ); /********************************************************************** ** CII←Cleanup: METHOD ** ** ** ** Invokes a CleanupObject ** **********************************************************************/ #define CII←Cleanup(self, h) \ (((self)->Cleanup)(self, h)) typedef CII←RES PROC←CII←Cleanup( CII←CleanupObject self, CII←Handle h ); /********************************************************************** ** CII←PathGeneratorObjectRep: OBJECT ** ** ** **********************************************************************/ typedef struct CII←PathGeneratorObjectRep { void* data; PROC←CII←GeneratePath* GeneratePath; } CII←PathGeneratorObjectRep; /********************************************************************** ** CII←CleanupObjectRep: OBJECT ** ** ** **********************************************************************/ typedef struct CII←CleanupObjectRep { void* data; PROC←CII←Cleanup* Cleanup; } CII←CleanupObjectRep; /********************************************************************** ** CII←PathSinkObjectRep: OBJECT ** ** ** **********************************************************************/ typedef struct CII←PathSinkObjectRep { void* data; PROC←CII←MoveTo* MoveTo; PROC←CII←LineTo* LineTo; PROC←CII←CurveTo* CurveTo; PROC←CII←ConicTo* ConicTo; } CII←PathSinkObjectRep; /********************************************************************** ** CII←ObjectRep: OBJECT ** ** ** **********************************************************************/ typedef struct CII←ObjectRep { void* data; PROC←CII←Destroy* Destroy; PROC←CII←DestroyColor* DestroyColor; PROC←CII←DestroyColorOperator* DestroyColorOperator; PROC←CII←DestroyClipper* DestroyClipper; PROC←CII←DestroyFont* DestroyFont; PROC←CII←SetMatrix* SetMatrix; PROC←CII←GetMatrix* GetMatrix; PROC←CII←GetInitialMatrix* GetInitialMatrix; PROC←CII←SetInitialMatrix* SetInitialMatrix; PROC←CII←MakeGrayColorOperator* MakeGrayColorOperator; PROC←CII←MakeRGBColorOperator* MakeRGBColorOperator; PROC←CII←MakeCMYKColorOperator* MakeCMYKColorOperator; PROC←CII←MakeHighlightColorOperator* MakeHighlightColorOperator; PROC←CII←MakeColor* MakeColor; PROC←CII←MakeSampledBlack* MakeSampledBlack; PROC←CII←SetColor* SetColor; PROC←CII←SetGray* SetGray; PROC←CII←SetRGB* SetRGB; PROC←CII←SetHSV* SetHSV; PROC←CII←SetCMYK* SetCMYK; PROC←CII←GetColor* GetColor; PROC←CII←MaskRectangle* MaskRectangle; PROC←CII←MaskFill* MaskFill; PROC←CII←Clip* Clip; PROC←CII←GetClipper* GetClipper; PROC←CII←SetClipper* SetClipper; PROC←CII←BuildClipperBegin* BuildClipperBegin; PROC←CII←BuildClipperEnd* BuildClipperEnd; PROC←CII←MaskStroke* MaskStroke; PROC←CII←MaskBitmap* MaskBitmap; PROC←CII←MaskDeviceTrapezoid* MaskDeviceTrapezoid; PROC←CII←DestroyMaskProgram* DestroyMaskProgram; PROC←CII←MakeMaskProgram* MakeMaskProgram; PROC←CII←MaskDeviceBoxes* MaskDeviceBoxes; PROC←CII←FindFont* FindFont; PROC←CII←ModifyFont* ModifyFont; PROC←CII←MakeFontAtom* MakeFontAtom; PROC←CII←DoHardChar* DoHardChar; PROC←CII←DoHardMetrics* DoHardMetrics; PROC←CII←Show* Show; PROC←CII←BufferedSeparationImage* BufferedSeparationImage; PROC←CII←BufferedInterleavedImage* BufferedInterleavedImage; PROC←CII←StreamImage* StreamImage; PROC←CII←MaskStreamBits* MaskStreamBits; PROC←CII←ApplyCCITTFacsimileDecompressionFilter* ApplyCCITTFacsimileDecompressionFilter; PROC←CII←MakeHalftoneProperties* MakeHalftoneProperties; PROC←CII←SetHalftoneProperties* SetHalftoneProperties; PROC←CII←GetHalftoneProperties* GetHalftoneProperties; PROC←CII←DestroyHalftoneProperties* DestroyHalftoneProperties; PROC←CII←SetSeparation* SetSeparation; PROC←CII←SetOutputBuffers* SetOutputBuffers; PROC←CII←SetColorTable* SetColorTable; PROC←CII←MakeLookupTable* MakeLookupTable; PROC←CII←DestroyLookupTable* DestroyLookupTable; PROC←CII←SetColorLookupTable* SetColorLookupTable; PROC←CII←GetColorLookupTable* GetColorLookupTable; PROC←CII←Sync* Sync; PROC←CII←RegisterCleanupObject* RegisterCleanupObject; PROC←CII←UnRegisterCleanupObject* UnRegisterCleanupObject; } CII←ObjectRep; /********************************************************************** ** CII←ImageSourceObjectRep: OBJECT ** ** ** **********************************************************************/ typedef struct CII←ImageSourceObjectRep { void* data; PROC←CII←ImageSourceRead* ImageSourceRead; PROC←CII←ImageSourceDestroy* ImageSourceDestroy; } CII←ImageSourceObjectRep; #endif /* cii←h */