|
|
1.1 ! root 1: .bp ! 2: .sh 1 "Creating \*(IP masters from C Programs" ! 3: .lp ! 4: A series of C macros and subroutines have been incorporated into a flexible ! 5: software interface for use in the creation of Interpress masters. This ! 6: interface provides a facility for higher level software to create Interpress ! 7: masters and eliminates the need for knowledge of the actual encoding of ! 8: the file. The set of routines resembles the proposal for an Interpress ! 9: procedural interface outlined in the ! 10: .i ! 11: Introduction to Interpress, ! 12: .r ! 13: \s8XSIG\s0 038404 Section 7 "Creating masters: procedural interfaces". ! 14: .lp ! 15: Since this document makes references to the actual Interpress ! 16: encoding form, it is assumed that the reader has knowledge of ! 17: the encoding of Interpress within a file as described in the ! 18: .i ! 19: Interpress Electronic Printing Standard, ! 20: .r ! 21: \s8XSIS\s0 048404, Section 2.5. ! 22: .sh 2 Basics ! 23: .lp ! 24: The Interpress procedure interface described is organized as that described ! 25: in Section 7 of the ! 26: .i ! 27: Introduction to Interpress, ! 28: .r ! 29: \s8XSIG\s0 038404. ! 30: .lp ! 31: There are two levels of interfaces: ! 32: .RS ! 33: .ip \(bu ! 34: The ! 35: .i Literal ! 36: interface which provides procedures for creating the various Interpress tokens ! 37: (i.e., operators, numbers, identifiers, etc.) ! 38: .ip \(bu ! 39: The ! 40: .i Operator ! 41: interface which provides procedures for the creation of specific operators ! 42: with an associated value or values. ! 43: .RE ! 44: .lp ! 45: The following conventions are used in the descriptions of these interfaces: ! 46: .RS ! 47: .RS ! 48: .ip n: ! 49: floating point numbers represented by the C type double (32 bits) ! 50: .ip i: ! 51: integers represented by the C type long (32 bits) ! 52: .ip s: ! 53: character strings which are null terminated ! 54: .ip p: ! 55: pointer to pixels (unsigned char *) ! 56: .RE ! 57: .RE ! 58: .sh 2 "Literal Interface" ! 59: .lp ! 60: The literal interface is a series of routines which append ! 61: the various Interpress types to the output file. These routines ! 62: perform the actual encoding dependent upon the literal type. ! 63: .lp ! 64: The routines which comprise the literal interface are: ! 65: .RS ! 66: .ip \fIip_select\fR(i:\ fd) 35 ! 67: select the output file represented by the file descriptor fd and append an ! 68: Interpress header ! 69: .ip \fIres_select\fR(i:\ fd) 35 ! 70: select the output file represented by the file descriptor fd and append a ! 71: R.E.S. header ! 72: .ip \fIip_raw_select\fR(i:\ fd) 35 ! 73: select the output file represented by the file descriptor fd (does not append ! 74: an Interpress header) ! 75: .ip \fIip_close\fR() 35 ! 76: close an output file ! 77: .ip \fIip_flush\fR() 35 ! 78: flush current output buffer to the file ! 79: .pp ! 80: .pp ! 81: .ip \fIAppendOp\fR(i:\ operator) 35 ! 82: append operator in its proper form (either a Short Op or a Long Op) ! 83: .ip \fIAppendNumber\fR(n:\ number) 35 ! 84: append the number in its proper form (either as a Short Number, a sequence of ! 85: type sequenceInteger or a sequence of type sequenceRational) ! 86: .ip \fIAppendInteger\fR(i:\ integer) 35 ! 87: append the integer in its proper form (either as a Short Number or a sequence ! 88: of type sequenceInteger) ! 89: .ip \fIAppendRational\fR(n:\ num,\ n:\ denom) 35 ! 90: append value and divisor as a sequence of type sequenceRational ! 91: .ip \fIAppendIdentifier\fR(s:\ string) 35 ! 92: append string as a sequence of type sequenceIdentifier ! 93: .ip \fIAppendComment\fR(s:\ string) 35 ! 94: append string as a sequence of type sequenceComment ! 95: .ip \fIAppendString\fR(s:\ string) 35 ! 96: append string as a sequence of type sequenceString ! 97: .ip \fIAppendStringX\fR(s:\ string) 35 ! 98: append string with possible escapes as a sequence of type sequenceString ! 99: .ip \fIAppendInsertFile\fR(s:\ string) 35 ! 100: append string as a sequence of type sequenceInsertFile ! 101: .RE ! 102: .sh 2 "Operator Interface" ! 103: .lp ! 104: Many of the common Interpress primitive operators have a corresponding routine ! 105: in the operator interface which appends the operator and a series of value(s) ! 106: to the output file. ! 107: .lp ! 108: Interpress operators vary in their use in that several options are available: ! 109: .RS ! 110: .ip \(bu ! 111: the operators may not require any values to be associated with it ! 112: .ip \(bu ! 113: values may be provided explicitly and a resulting value left on the stack ! 114: .ip \(bu ! 115: any or all values may be taken from the stack (left by a previous operation) ! 116: and the result of the operator may then be left on the stack in place of ! 117: the values ! 118: .ip \(bu ! 119: the values provided may in fact be a larger body of values composed of many ! 120: numbers or integers ! 121: .RE ! 122: .lp ! 123: .i ! 124: Operators with no values: ! 125: .r ! 126: Operators which require no values may be output with the literal interface ! 127: routines \fIAppendOp\fR or \fIOp\fR. ! 128: .lp ! 129: .i ! 130: Operators with explicit values: ! 131: .r ! 132: The following routines append the named operator along with the values ! 133: specified: ! 134: .RS ! 135: .lp ! 136: .b ! 137: Arithmetic Operators ! 138: .RS ! 139: .ip \fIAbs\|(n:\ value)\fR ! 140: .ip \fIAdd\|(n:\ value1,\ n:\ value2)\fR ! 141: .ip \fICeiling\|(n:\ value)\fR ! 142: .ip \fIDiv\|(n:\ dividend,\ n:\ divisor)\fR ! 143: .ip \fIFloor\|(n:\ value)\fR ! 144: .ip \fIMod\|(n:\ value,\ n:\ divisor)\fR ! 145: .ip \fIMul\|(n:\ value1,\ n:\ value2)\fR ! 146: .ip \fINeg\|(n:\ value)\fR ! 147: .ip \fIRem\|(n:\ value,\ n:\ divisor)\fR ! 148: .ip \fIRound\|(n:\ value)\fR ! 149: .ip \fISub\|(n:\ minuend,\ n:\ subtrahend)\fR ! 150: .ip \fITrunc\|(n:\ value)\fR ! 151: .RE ! 152: .lp ! 153: .b ! 154: Color Operators ! 155: .RS ! 156: .ip \fIMakeGray\|(n:\ colorshade)\fR ! 157: .ip \fIMakeSampledBlack\|(i:\ clear)\fR ! 158: .ip \fISetGray\|(n:\ colorshade)\fR ! 159: .RE ! 160: .lp ! 161: .b ! 162: Correction Operators ! 163: .RS ! 164: .ip \fICorrectSpace\|(n:\ x,\ n:\ y)\fR ! 165: .ip \fISetcorrectMeasure\|(n:\ x,\ n:\ y)\fR ! 166: .ip \fISetCorrectTolerance\|(n:\ x,\ n:\ y)\fR ! 167: .ip \fISpace\|(n:\ x)\fR ! 168: .RE ! 169: .lp ! 170: .b ! 171: Font Operators ! 172: .RS ! 173: .ip \fISetFont(i:\ font)\fR ! 174: .RE ! 175: .lp ! 176: .b ! 177: Frame Operators ! 178: .RS ! 179: .ip \fIFGet\|(i:\ framevariable)\fR ! 180: .RE ! 181: .lp ! 182: .b ! 183: Imager Operators ! 184: .RS ! 185: .ip \fIIGet\|(i:\ imagerVariable)\fR ! 186: .ip \fISetAmplifySpace\|(n:\ value)\fR ! 187: .ip \fISetCorrectPass\|(i:\ value)\fR ! 188: .ip \fISetCorreectShrink\|(n:\ number)\fR ! 189: .ip \fISetNoImage\|(i:\ integer)\fR ! 190: .ip \fISetPriorityImportant\|(i:\ integer)\fR ! 191: .ip \fISetStrokeEnd\|(i:\ integer)\fR ! 192: .ip \fISetStrokeWidth\|(n:\ number)\fR ! 193: .ip \fISetUnderlineStart\|(n:\ number)\fR ! 194: .RE ! 195: .lp ! 196: .b ! 197: Mask Operators ! 198: .r ! 199: .RS ! 200: .ip \fIMaskRectangle\|(n:\ x,\ n:\ y,\ n:\ width,\ n:\ height)\fR ! 201: .ip \fIMaskTrapezoidx\|(n:\ x1,\ n:\ y1,\ n:\ x2,\ n:\ x3,\ n:\ y3,\ n:\ x4)\fR ! 202: .ip \fIMaskTrapezoidy\|(n:\ x1,\ n:\ y1,\ n:\ y2,\ n:\ x3,\ n:\ y3,\ n:\ y4)\fR ! 203: .ip \fIMaskUnderline\|(n:\ dy,\ n:\ h)\fR ! 204: .ip \fIMaskVector\|(n:\ x1,\ n:\ y1,\ n:\ x2,\ n:\ y2)\fR ! 205: .RE ! 206: .lp ! 207: .b ! 208: Position Operators ! 209: .RS ! 210: .ip \fISetXY\|(n:\ x,\ n:\ y)\fR ! 211: .ip \fISetXYRel\|(n:\ dx,\ n:\ dy)\fR ! 212: .ip \fISetXRel\|(n:\ dx)\fR ! 213: .ip \fISetYRel\|(n:\ dy)\fR ! 214: .RE ! 215: .lp ! 216: .b ! 217: Test Operators ! 218: .RS ! 219: .ip \fIAnd\|(i:\ value1,\ i:\ value2)\fR ! 220: .ip \fIGe\|(n:\ value1,\ n:\ value2)\fR ! 221: .ip \fIGt\|(n:\ value2,\ n:\ value2)\fR ! 222: .ip \fINot\|(i:\ value)\fR ! 223: .ip \fIOr\|(i:\ value1,\ i:\ value2)\fR ! 224: .RE ! 225: .lp ! 226: .b ! 227: Transform Operators ! 228: .RS ! 229: .ip \fIRotate\|(n:\ angle)\fR ! 230: .ip \fIScale\|(n:\ s)\fR ! 231: .ip \fIScale2\|(n:\ sx,\ n:\ sy)\fR ! 232: .ip \fITranslate\|(n:\ x,\ n:\ y)\fR ! 233: .RE ! 234: .RE ! 235: .lp ! 236: .i ! 237: Operators with implicit values: ! 238: .r ! 239: The following routines append the named operator along with the values ! 240: specified, with the assumption that other values have been appended through ! 241: previous calls to the literal interface: ! 242: .RS ! 243: .lp ! 244: .b ! 245: Mask Operators ! 246: .RS ! 247: .ip \fILineTo\|(n:\ x,\ n:\ y)\fR ! 248: .ip \fILineToX\|(n:\ x)\fR ! 249: .ip \fILineToY\|(n:\ y)\fR ! 250: .ip \fIMakeOutline\|(i:\ count)\fR ! 251: .RE ! 252: .lp ! 253: .b ! 254: Stack Operators ! 255: .RS ! 256: .ip \fICopy\|(i:\ count)\fR ! 257: .ip \fIRoll\|(i:\ depth,\ i:\ movefirst)\fR ! 258: .ip \fIMark\|(i:\ count)\fR ! 259: .ip \fIUnmark\|(i:\ count)\fR ! 260: .RE ! 261: .lp ! 262: .b ! 263: Vector Operators ! 264: .RS ! 265: .ip \fIGet\|(n:\ index)\fR ! 266: .ip \fIMakeVec\|(I:\ upper)\fR ! 267: .ip \fIMakeVecLU\|(i:\ lower,\ i:\ upper)\fR ! 268: .RE ! 269: .RE ! 270: .lp ! 271: .i ! 272: Templates: ! 273: .r ! 274: Several procedures are provided for common Interpress operations which may ! 275: logically combine groups of operators and values. Those procedures are: ! 276: .RS ! 277: .ip \fISetupFont\|(s:\ name,\ i:\ size,\ i:\ fontnumber)\fR ! 278: .ip \fIShowString\|(s:\ string)\fR ! 279: .RE ! 280: .lp ! 281: .r ! 282: The following procedures append encoded pixel vectors. ! 283: .RS ! 284: .ip \fIAppendPPVector\|(i:\ length,\ i:\ bitsPerPixel,\ i:\ pixelsPerScanLine,\ p:\ data)\fR ! 285: .ip \fIAppendCPVector\|(i:\ length,\ i:\ breakTable,\ i:\ nRange,\ i:\ pixelsPerScanLine,\ p:\ data)\fR ! 286: .RE ! 287: .sh 2 "Using the Program Interface" ! 288: .lp ! 289: The software which uses these Interpress interfaces can find the ! 290: the desired subroutines in the Interpress library ! 291: .i libip.a ! 292: which exists in the directory ! 293: .i ${SRC}/lib ! 294: as distributed. ! 295: .lp ! 296: There are also several include files in the directory ! 297: .i ${SRC}/include ! 298: which contain the following utilities: ! 299: .RS ! 300: .ip iptokens.h ! 301: definitions for the Interpress encoding of tokens, sequence types and operators ! 302: .ip literal.h ! 303: macro definitions for portions of the literal interface ! 304: .ip operator.h ! 305: macro definitions for most of the operator interface ! 306: .RE ! 307: .lp ! 308: Note that ${SRC} above denotes the path in which the Interpress software was ! 309: loaded on the host system. ! 310: .sh 3 "An example using the program interfaces" ! 311: .lp ! 312: The following short C program demonstrates an Interpress ! 313: generation facility. This will produce an Interpress master on the file ! 314: descriptor stdout which will print the line "This is an Interpress test" ! 315: across the top of the page. ! 316: .in +5n ! 317: .lp ! 318: \f(TR#include "iptokens.h" ! 319: .br ! 320: #include "literal.h" ! 321: .br ! 322: #include "operator.h" ! 323: .br ! 324: main() ! 325: .br ! 326: { ! 327: .in +5n ! 328: ip_select(1); /* open stdout */ ! 329: .br ! 330: AppendOp(OP_beginBlock); ! 331: .br ! 332: AppendOp(OP_beginBody); ! 333: .br ! 334: /* establish default font */ ! 335: .br ! 336: SetupFont("Xerox/XC1-1-1/Classic",100.,1); ! 337: .br ! 338: AppendRational(353,10000000); /* scale of 1/10 point */ ! 339: .br ! 340: AppendOp(OP_scale); ! 341: .br ! 342: AppendInteger(2); ! 343: .br ! 344: AppendOp(OP_fset); /* save in frame variable 2 */ ! 345: .br ! 346: AppendOp(OP_endBody); /* end preamble */ ! 347: .br ! 348: AppendOp(OP_beginBody); /* start page 1 */ ! 349: .br ! 350: FGet(2); /* retrieve scale */ ! 351: .br ! 352: SetFont(1); /* retrieve default font */ ! 353: .br ! 354: SetXY((double)1440,(double)7200); ! 355: .br ! 356: ShowString("This is an Interpress test"); ! 357: .br ! 358: AppendOp(OP_endBody); ! 359: .br ! 360: AppendOp(OP_endBlock); ! 361: .br ! 362: ip_close(); /* close file */ ! 363: .in -5n ! 364: } ! 365: .in -5n ! 366: .lp ! 367: The text representation of the Interpress master produced by the above ! 368: program is shown below: ! 369: .(l I ! 370: \f(TRHeader: "Interpress/Xerox/2.1 " ! 371: BEGIN (block) ! 372: { ! 373: > Identifier: Xerox ! 374: > Identifier: XC1-1-1 ! 375: > Identifier: Classic ! 376: 3 ! 377: makevec ! 378: findfont ! 379: 100 ! 380: scale ! 381: modifyfont ! 382: 1 ! 383: fset ! 384: > Rational: 353/10000000 (0.000035) ! 385: scale ! 386: 2 ! 387: fset ! 388: } ! 389: { ! 390: 2 ! 391: fget ! 392: 1 ! 393: setfont ! 394: 1440 ! 395: 7200 ! 396: setxy ! 397: > String: "This is an Interpress test" ! 398: show ! 399: } ! 400: END (block) ! 401: .)l
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.