diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/postscript_8c_source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/postscript_8c_source.html Tue Mar 30 16:16:55 2010 +0100 @@ -0,0 +1,1187 @@ + + +
+ +00001 /* +00002 * postscript.c +00003 * Copyright (C) 1999-2005 A.J. van Os; Released under GNU GPL +00004 * +00005 * Description: +00006 * Functions to deal with the PostScript format +00007 * +00008 *================================================================ +00009 * The function vImagePrologue is based on: +00010 * jpeg2ps - convert JPEG compressed images to PostScript Level 2 +00011 * Copyright (C) 1994-99 Thomas Merz (tm@muc.de) +00012 *================================================================ +00013 * The credit should go to him, but all the bugs are mine. +00014 */ +00015 +00016 #include <stdlib.h> +00017 #include <errno.h> +00018 #include <time.h> +00019 #include <string.h> +00020 #include "version.h" +00021 #include "antiword.h" +00022 +00023 /* The character set */ +00024 static encoding_type eEncoding = encoding_neutral; +00025 /* The image level */ +00026 static image_level_enum eImageLevel = level_default; +00027 /* The output must use landscape orientation */ +00028 static BOOL bUseLandscape = FALSE; +00029 /* The height and width of a PostScript page (in DrawUnits) */ +00030 static long lPageHeight = LONG_MAX; +00031 static long lPageWidth = LONG_MAX; +00032 /* The height of the footer on the current page (in DrawUnits) */ +00033 static long lFooterHeight = 0; +00034 /* Inside a footer (to prevent an infinite loop when the footer is too big) */ +00035 static BOOL bInFtrSpace = FALSE; +00036 /* Current time for a PS header */ +00037 static const char *szCreationDate = NULL; +00038 /* Current creator for a PS header */ +00039 static const char *szCreator = NULL; +00040 /* Current font information */ +00041 static drawfile_fontref tFontRefCurr = (drawfile_fontref)-1; +00042 static USHORT usFontSizeCurr = 0; +00043 static int iFontColorCurr = -1; +00044 /* Current vertical position information */ +00045 static long lYtopCurr = -1; +00046 /* PostScript page counter */ +00047 static int iPageCount = 0; +00048 /* Image counter */ +00049 static int iImageCount = 0; +00050 /* Section index */ +00051 static int iSectionIndex = 0; +00052 /* Are we on the first page of the section? */ +00053 static BOOL bFirstInSection = TRUE; +00054 +00055 static void vMoveTo(diagram_type *, long); +00056 +00057 static const char *iso_8859_1_data[] = { +00058 "/newcodes % ISO-8859-1 character encodings", +00059 "[", +00060 "140/ellipsis 141/trademark 142/perthousand 143/bullet", +00061 "144/quoteleft 145/quoteright 146/guilsinglleft 147/guilsinglright", +00062 "148/quotedblleft 149/quotedblright 150/quotedblbase 151/endash 152/emdash", +00063 "153/minus 154/OE 155/oe 156/dagger 157/daggerdbl 158/fi 159/fl", +00064 "160/space 161/exclamdown 162/cent 163/sterling 164/currency", +00065 "165/yen 166/brokenbar 167/section 168/dieresis 169/copyright", +00066 "170/ordfeminine 171/guillemotleft 172/logicalnot 173/hyphen 174/registered", +00067 "175/macron 176/degree 177/plusminus 178/twosuperior 179/threesuperior", +00068 "180/acute 181/mu 182/paragraph 183/periodcentered 184/cedilla", +00069 "185/onesuperior 186/ordmasculine 187/guillemotright 188/onequarter", +00070 "189/onehalf 190/threequarters 191/questiondown 192/Agrave 193/Aacute", +00071 "194/Acircumflex 195/Atilde 196/Adieresis 197/Aring 198/AE 199/Ccedilla", +00072 "200/Egrave 201/Eacute 202/Ecircumflex 203/Edieresis 204/Igrave 205/Iacute", +00073 "206/Icircumflex 207/Idieresis 208/Eth 209/Ntilde 210/Ograve 211/Oacute", +00074 "212/Ocircumflex 213/Otilde 214/Odieresis 215/multiply 216/Oslash", +00075 "217/Ugrave 218/Uacute 219/Ucircumflex 220/Udieresis 221/Yacute 222/Thorn", +00076 "223/germandbls 224/agrave 225/aacute 226/acircumflex 227/atilde", +00077 "228/adieresis 229/aring 230/ae 231/ccedilla 232/egrave 233/eacute", +00078 "234/ecircumflex 235/edieresis 236/igrave 237/iacute 238/icircumflex", +00079 "239/idieresis 240/eth 241/ntilde 242/ograve 243/oacute 244/ocircumflex", +00080 "245/otilde 246/odieresis 247/divide 248/oslash 249/ugrave 250/uacute", +00081 "251/ucircumflex 252/udieresis 253/yacute 254/thorn 255/ydieresis", +00082 "] bind def", +00083 "", +00084 "/reencdict 12 dict def", +00085 "", +00086 }; +00087 +00088 static const char *iso_8859_2_data[] = { +00089 "/newcodes % ISO-8859-2 character encodings", +00090 "[", +00091 "160/space 161/Aogonek 162/breve 163/Lslash 164/currency 165/Lcaron", +00092 "166/Sacute 167/section 168/dieresis 169/Scaron 170/Scommaaccent", +00093 "171/Tcaron 172/Zacute 173/hyphen 174/Zcaron 175/Zdotaccent 176/degree", +00094 "177/aogonek 178/ogonek 179/lslash 180/acute 181/lcaron 182/sacute", +00095 "183/caron 184/cedilla 185/scaron 186/scommaaccent 187/tcaron", +00096 "188/zacute 189/hungarumlaut 190/zcaron 191/zdotaccent 192/Racute", +00097 "193/Aacute 194/Acircumflex 195/Abreve 196/Adieresis 197/Lacute", +00098 "198/Cacute 199/Ccedilla 200/Ccaron 201/Eacute 202/Eogonek", +00099 "203/Edieresis 204/Ecaron 205/Iacute 206/Icircumflex 207/Dcaron", +00100 "208/Dcroat 209/Nacute 210/Ncaron 211/Oacute 212/Ocircumflex", +00101 "213/Ohungarumlaut 214/Odieresis 215/multiply 216/Rcaron 217/Uring", +00102 "218/Uacute 219/Uhungarumlaut 220/Udieresis 221/Yacute 222/Tcommaaccent", +00103 "223/germandbls 224/racute 225/aacute 226/acircumflex 227/abreve", +00104 "228/adieresis 229/lacute 230/cacute 231/ccedilla 232/ccaron 233/eacute", +00105 "234/eogonek 235/edieresis 236/ecaron 237/iacute 238/icircumflex", +00106 "239/dcaron 240/dcroat 241/nacute 242/ncaron 243/oacute 244/ocircumflex", +00107 "245/ohungarumlaut 246/odieresis 247/divide 248/rcaron 249/uring", +00108 "250/uacute 251/uhungarumlaut 252/udieresis 253/yacute 254/tcommaaccent", +00109 "255/dotaccent", +00110 "] bind def", +00111 "", +00112 "/reencdict 12 dict def", +00113 "", +00114 }; +00115 +00116 static const char *iso_8859_5_data[] = { +00117 "/newcodes % ISO-8859-5 character encodings", +00118 "[", +00119 "160/space 161/afii10023 162/afii10051 163/afii10052 164/afii10053", +00120 "165/afii10054 166/afii10055 167/afii10056 168/afii10057 169/afii10058", +00121 "170/afii10059 171/afii10060 172/afii10061 173/hyphen 174/afii10062", +00122 "175/afii10145 176/afii10017 177/afii10018 178/afii10019 179/afii10020", +00123 "180/afii10021 181/afii10022 182/afii10024 183/afii10025 184/afii10026", +00124 "185/afii10027 186/afii10028 187/afii10029 188/afii10030 189/afii10031", +00125 "190/afii10032 191/afii10033 192/afii10034 193/afii10035 194/afii10036", +00126 "195/afii10037 196/afii10038 197/afii10039 198/afii10040 199/afii10041", +00127 "200/afii10042 201/afii10043 202/afii10044 203/afii10045 204/afii10046", +00128 "205/afii10047 206/afii10048 207/afii10049 208/afii10065 209/afii10066", +00129 "210/afii10067 211/afii10068 212/afii10069 213/afii10070 214/afii10072", +00130 "215/afii10073 216/afii10074 217/afii10075 218/afii10076 219/afii10077", +00131 "220/afii10078 221/afii10079 222/afii10080 223/afii10081 224/afii10082", +00132 "225/afii10083 226/afii10084 227/afii10085 228/afii10086 229/afii10087", +00133 "230/afii10088 231/afii10089 232/afii10090 233/afii10091 234/afii10092", +00134 "235/afii10093 236/afii10094 237/afii10095 238/afii10096 239/afii10097", +00135 "240/afii61352 241/afii10071 242/afii10099 243/afii10100 244/afii10101", +00136 "245/afii10102 246/afii10103 247/afii10104 248/afii10105 249/afii10106", +00137 "250/afii10107 251/afii10108 252/afii10109 253/section 254/afii10110", +00138 "255/afii10193", +00139 "] bind def", +00140 "", +00141 "/reencdict 12 dict def", +00142 "", +00143 }; +00144 +00145 static const char *iso_8859_x_func[] = { +00146 "% change fonts using ISO-8859-x characters", +00147 "/ChgFnt % size psname natname => font", +00148 "{", +00149 " dup FontDirectory exch known % is re-encoded name known?", +00150 " { exch pop } % yes, get rid of long name", +00151 " { dup 3 1 roll ReEncode } ifelse % no, re-encode it", +00152 " findfont exch scalefont setfont", +00153 "} bind def", +00154 "", +00155 "/ReEncode", +00156 "{", +00157 "reencdict begin", +00158 " /newname exch def", +00159 " /basename exch def", +00160 " /basedict basename findfont def", +00161 " /newfont basedict maxlength dict def", +00162 " basedict", +00163 " { exch dup /FID ne", +00164 " { dup /Encoding eq", +00165 " { exch dup length array copy newfont 3 1 roll put }", +00166 " { exch newfont 3 1 roll put } ifelse", +00167 " }", +00168 " { pop pop } ifelse", +00169 " } forall", +00170 " newfont /FontName newname put", +00171 " newcodes aload pop newcodes length 2 idiv", +00172 " { newfont /Encoding get 3 1 roll put } repeat", +00173 " newname newfont definefont pop", +00174 "end", +00175 "} bind def", +00176 "", +00177 }; +00178 +00179 static const char *misc_func[] = { +00180 "% draw a line and show the string", +00181 "/LineShow % string linewidth movement", +00182 "{", +00183 " gsave", +00184 " 0 exch rmoveto", +00185 " setlinewidth", +00186 " dup", +00187 " stringwidth pop", +00188 " 0 rlineto stroke", +00189 " grestore", +00190 " show", +00191 "} bind def", +00192 "", +00193 "% begin an EPS file (level 2 and up)", +00194 "/BeginEPSF", +00195 "{", +00196 " /b4_Inc_state save def", +00197 " /dict_count countdictstack def", +00198 " /op_count count 1 sub def", +00199 " userdict begin", +00200 " /showpage { } def", +00201 " 0 setgray 0 setlinecap", +00202 " 1 setlinewidth 0 setlinejoin", +00203 " 10 setmiterlimit [ ] 0 setdash newpath", +00204 " false setstrokeadjust false setoverprint", +00205 "} bind def", +00206 "", +00207 "% end an EPS file", +00208 "/EndEPSF {", +00209 " count op_count sub { pop } repeat", +00210 " countdictstack dict_count sub { end } repeat", +00211 " b4_Inc_state restore", +00212 "} bind def", +00213 "", +00214 }; +00215 +00216 +00217 /* +00218 * vAddPageSetup - add the page setup +00219 */ +00220 static void +00221 vAddPageSetup(FILE *pOutFile) +00222 { +00223 if (bUseLandscape) { +00224 fprintf(pOutFile, "%%%%BeginPageSetup\n"); +00225 fprintf(pOutFile, "90 rotate\n"); +00226 fprintf(pOutFile, "0.00 %.2f translate\n", +00227 -dDrawUnits2Points(lPageHeight)); +00228 fprintf(pOutFile, "%%%%EndPageSetup\n"); +00229 } +00230 } /* end of vAddPageSetup */ +00231 +00232 /* +00233 * vAddHdrFtr - add a header or footer +00234 */ +00235 static void +00236 vAddHdrFtr(diagram_type *pDiag, const hdrftr_block_type *pHdrFtrInfo) +00237 { +00238 output_type *pStart, *pPrev, *pNext; +00239 +00240 fail(pDiag == NULL); +00241 fail(pHdrFtrInfo == NULL); +00242 +00243 vStartOfParagraphPS(pDiag, 0); +00244 pStart = pHdrFtrInfo->pText; +00245 while (pStart != NULL) { +00246 pNext = pStart; +00247 while (pNext != NULL && +00248 (pNext->tNextFree != 1 || +00249 (pNext->szStorage[0] != PAR_END && +00250 pNext->szStorage[0] != HARD_RETURN))) { +00251 pNext = pNext->pNext; +00252 } +00253 if (pNext == NULL) { +00254 if (bOutputContainsText(pStart)) { +00255 vAlign2Window(pDiag, pStart, +00256 lChar2MilliPoints(DEFAULT_SCREEN_WIDTH), +00257 ALIGNMENT_LEFT); +00258 } else { +00259 vMove2NextLinePS(pDiag, pStart->usFontSize); +00260 } +00261 break; +00262 } +00263 fail(pNext->tNextFree != 1); +00264 fail(pNext->szStorage[0] != PAR_END && +00265 pNext->szStorage[0] != HARD_RETURN); +00266 +00267 if (pStart != pNext) { +00268 /* There is something to print */ +00269 pPrev = pNext->pPrev; +00270 fail(pPrev->pNext != pNext); +00271 /* Cut the chain */ +00272 pPrev->pNext = NULL; +00273 if (bOutputContainsText(pStart)) { +00274 /* Print it */ +00275 vAlign2Window(pDiag, pStart, +00276 lChar2MilliPoints(DEFAULT_SCREEN_WIDTH), +00277 ALIGNMENT_LEFT); +00278 } else { +00279 /* Just an empty line */ +00280 vMove2NextLinePS(pDiag, pStart->usFontSize); +00281 } +00282 /* Repair the chain */ +00283 pPrev->pNext = pNext; +00284 } +00285 if (pNext->szStorage[0] == PAR_END) { +00286 vEndOfParagraphPS(pDiag, pNext->usFontSize, +00287 (long)pNext->usFontSize * 200); +00288 } +00289 pStart = pNext->pNext; +00290 } +00291 } /* end of vAddHdrFtr */ +00292 +00293 /* +00294 * vAddHeader - add a page header +00295 */ +00296 static void +00297 vAddHeader(diagram_type *pDiag) +00298 { +00299 const hdrftr_block_type *pHdrInfo; +00300 const hdrftr_block_type *pFtrInfo; +00301 +00302 fail(pDiag == NULL); +00303 +00304 NO_DBG_MSG("vAddHeader"); +00305 +00306 pHdrInfo = pGetHdrFtrInfo(iSectionIndex, TRUE, +00307 odd(iPageCount), bFirstInSection); +00308 pFtrInfo = pGetHdrFtrInfo(iSectionIndex, FALSE, +00309 odd(iPageCount), bFirstInSection); +00310 /* Set the height of the footer of this page */ +00311 lFooterHeight = pFtrInfo == NULL ? 0 : pFtrInfo->lHeight; +00312 fail(lFooterHeight < 0); +00313 +00314 if (pHdrInfo == NULL || +00315 pHdrInfo->pText == NULL || +00316 pHdrInfo->lHeight <= 0) { +00317 fail(pHdrInfo != NULL && pHdrInfo->lHeight < 0); +00318 fail(pHdrInfo != NULL && +00319 pHdrInfo->pText != NULL && +00320 pHdrInfo->lHeight == 0); +00321 return; +00322 } +00323 +00324 vAddHdrFtr(pDiag, pHdrInfo); +00325 +00326 DBG_DEC_C(pHdrInfo->lHeight != +00327 lPageHeight - PS_TOP_MARGIN - pDiag->lYtop, +00328 pHdrInfo->lHeight); +00329 DBG_DEC_C(pHdrInfo->lHeight != +00330 lPageHeight - PS_TOP_MARGIN - pDiag->lYtop, +00331 lPageHeight - PS_TOP_MARGIN - pDiag->lYtop); +00332 +00333 #if 0 /* defined(DEBUG) */ +00334 fprintf(pDiag->pOutFile, +00335 "(HEADER: FileOffset 0x%04lx-0x%04lx; Height %ld-%ld) show\n", +00336 ulCharPos2FileOffset(pHdrInfo->ulCharPosStart), +00337 ulCharPos2FileOffset(pHdrInfo->ulCharPosNext), +00338 pHdrInfo->lHeight, +00339 lPageHeight - PS_TOP_MARGIN - pDiag->lYtop); +00340 #endif +00341 } /* end of vAddHeader */ +00342 +00343 /* +00344 * vAddFooter - add a page footer +00345 */ +00346 static void +00347 vAddFooter(diagram_type *pDiag) +00348 { +00349 const hdrftr_block_type *pFtrInfo; +00350 +00351 fail(pDiag == NULL); +00352 +00353 NO_DBG_MSG("vAddFooter"); +00354 pFtrInfo = pGetHdrFtrInfo(iSectionIndex, FALSE, +00355 odd(iPageCount), bFirstInSection); +00356 bFirstInSection = FALSE; +00357 if (pFtrInfo == NULL || +00358 pFtrInfo->pText == NULL || +00359 pFtrInfo->lHeight <= 0) { +00360 fail(pFtrInfo != NULL && pFtrInfo->lHeight < 0); +00361 fail(pFtrInfo != NULL && +00362 pFtrInfo->pText != NULL && +00363 pFtrInfo->lHeight == 0); +00364 return; +00365 } +00366 +00367 bInFtrSpace = TRUE; +00368 +00369 DBG_DEC_C(pFtrInfo->lHeight != lFooterHeight, pFtrInfo->lHeight); +00370 DBG_DEC_C(pFtrInfo->lHeight != lFooterHeight, lFooterHeight); +00371 DBG_DEC_C(pDiag->lYtop < lFooterHeight + PS_BOTTOM_MARGIN, +00372 pDiag->lYtop); +00373 DBG_DEC_C(pDiag->lYtop < lFooterHeight + PS_BOTTOM_MARGIN, +00374 lFooterHeight + PS_BOTTOM_MARGIN); +00375 +00376 if (pDiag->lYtop > lFooterHeight + PS_BOTTOM_MARGIN) { +00377 /* Move down to the start of the footer */ +00378 pDiag->lYtop = lFooterHeight + PS_BOTTOM_MARGIN; +00379 vMoveTo(pDiag, 0); +00380 } else if (pDiag->lYtop < lFooterHeight + PS_BOTTOM_MARGIN / 2) { +00381 DBG_FIXME(); +00382 /* +00383 * Move up to the start of the footer, to prevent moving +00384 * of the bottom edge of the paper +00385 */ +00386 pDiag->lYtop = lFooterHeight + PS_BOTTOM_MARGIN; +00387 vMoveTo(pDiag, 0); +00388 } +00389 +00390 DBG_FLT_C(pDiag->lYtop < lFooterHeight + PS_BOTTOM_MARGIN, +00391 dDrawUnits2Points(lFooterHeight + PS_BOTTOM_MARGIN - pDiag->lYtop)); +00392 +00393 #if 0 /* defined(DEBUG) */ +00394 fprintf(pDiag->pOutFile, +00395 "(FOOTER: FileOffset 0x%04lx-0x%04lx; Bottom %ld-%ld) show\n", +00396 ulCharPos2FileOffset(pFtrInfo->ulCharPosStart), +00397 ulCharPos2FileOffset(pFtrInfo->ulCharPosNext), +00398 pDiag->lYtop, +00399 pFtrInfo->lHeight + PS_BOTTOM_MARGIN); +00400 #endif +00401 vAddHdrFtr(pDiag, pFtrInfo); +00402 bInFtrSpace = FALSE; +00403 } /* end of vAddFooter */ +00404 +00405 /* +00406 * vMove2NextPage - move to the start of the next page +00407 */ +00408 static void +00409 vMove2NextPage(diagram_type *pDiag, BOOL bNewSection) +00410 { +00411 fail(pDiag == NULL); +00412 +00413 vAddFooter(pDiag); +00414 fprintf(pDiag->pOutFile, "showpage\n"); +00415 iPageCount++; +00416 fprintf(pDiag->pOutFile, "%%%%Page: %d %d\n", iPageCount, iPageCount); +00417 if (bNewSection) { +00418 iSectionIndex++; +00419 bFirstInSection = TRUE; +00420 } +00421 vAddPageSetup(pDiag->pOutFile); +00422 pDiag->lYtop = lPageHeight - PS_TOP_MARGIN; +00423 lYtopCurr = -1; +00424 vAddHeader(pDiag); +00425 } /* end of vMove2NextPage */ +00426 +00427 /* +00428 * vMoveTo - move to the specified X,Y coordinates +00429 * +00430 * Move the current position of the specified diagram to its X,Y coordinates, +00431 * start on a new page if needed +00432 */ +00433 static void +00434 vMoveTo(diagram_type *pDiag, long lLastVerticalMovement) +00435 { +00436 fail(pDiag == NULL); +00437 fail(pDiag->pOutFile == NULL); +00438 +00439 if (pDiag->lYtop <= lFooterHeight + PS_BOTTOM_MARGIN && !bInFtrSpace) { +00440 vMove2NextPage(pDiag, FALSE); +00441 /* Repeat the last vertical movement on the new page */ +00442 pDiag->lYtop -= lLastVerticalMovement; +00443 } +00444 +00445 fail(pDiag->lYtop < lFooterHeight + PS_BOTTOM_MARGIN && !bInFtrSpace); +00446 DBG_DEC_C(pDiag->lYtop < PS_BOTTOM_MARGIN, pDiag->lYtop); +00447 fail(pDiag->lYtop < PS_BOTTOM_MARGIN / 3); +00448 +00449 if (pDiag->lYtop != lYtopCurr) { +00450 fprintf(pDiag->pOutFile, "%.2f %.2f moveto\n", +00451 dDrawUnits2Points(pDiag->lXleft + PS_LEFT_MARGIN), +00452 dDrawUnits2Points(pDiag->lYtop)); +00453 lYtopCurr = pDiag->lYtop; +00454 } +00455 } /* end of vMoveTo */ +00456 +00457 /* +00458 * vProloguePS - set options and perform the PostScript initialization +00459 */ +00460 void +00461 vProloguePS(diagram_type *pDiag, +00462 const char *szTask, const char *szFilename, +00463 const options_type *pOptions) +00464 { +00465 FILE *pOutFile; +00466 const char *szTmp; +00467 time_t tTime; +00468 +00469 fail(pDiag == NULL); +00470 fail(pDiag->pOutFile == NULL); +00471 fail(szTask == NULL || szTask[0] == '\0'); +00472 fail(pOptions == NULL); +00473 +00474 pOutFile = pDiag->pOutFile; +00475 +00476 bUseLandscape = pOptions->bUseLandscape; +00477 eEncoding = pOptions->eEncoding; +00478 eImageLevel = pOptions->eImageLevel; +00479 +00480 if (pOptions->iPageHeight == INT_MAX) { +00481 lPageHeight = LONG_MAX; +00482 } else { +00483 lPageHeight = lPoints2DrawUnits(pOptions->iPageHeight); +00484 } +00485 DBG_DEC(lPageHeight); +00486 if (pOptions->iPageWidth == INT_MAX) { +00487 lPageWidth = LONG_MAX; +00488 } else { +00489 lPageWidth = lPoints2DrawUnits(pOptions->iPageWidth); +00490 } +00491 DBG_DEC(lPageWidth); +00492 lFooterHeight = 0; +00493 bInFtrSpace = FALSE; +00494 +00495 tFontRefCurr = (drawfile_fontref)-1; +00496 usFontSizeCurr = 0; +00497 iFontColorCurr = -1; +00498 lYtopCurr = -1; +00499 iPageCount = 0; +00500 iImageCount = 0; +00501 iSectionIndex = 0; +00502 bFirstInSection = TRUE; +00503 pDiag->lXleft = 0; +00504 pDiag->lYtop = lPageHeight - PS_TOP_MARGIN; +00505 +00506 szCreator = szTask; +00507 +00508 fprintf(pOutFile, "%%!PS-Adobe-2.0\n"); +00509 fprintf(pOutFile, "%%%%Title: %s\n", szBasename(szFilename)); +00510 fprintf(pOutFile, "%%%%Creator: %s %s\n", szCreator, VERSIONSTRING); +00511 szTmp = getenv("LOGNAME"); +00512 if (szTmp == NULL || szTmp[0] == '\0') { +00513 szTmp = getenv("USER"); +00514 if (szTmp == NULL || szTmp[0] == '\0') { +00515 szTmp = "unknown"; +00516 } +00517 } +00518 fprintf(pOutFile, "%%%%For: %.50s\n", szTmp); +00519 errno = 0; +00520 tTime = time(NULL); +00521 if (tTime == (time_t)-1 && errno != 0) { +00522 szCreationDate = NULL; +00523 } else { +00524 szCreationDate = ctime(&tTime); +00525 } +00526 if (szCreationDate == NULL || szCreationDate[0] == '\0') { +00527 szCreationDate = "unknown\n"; +00528 } +00529 fprintf(pOutFile, "%%%%CreationDate: %s", szCreationDate); +00530 if (bUseLandscape) { +00531 fprintf(pOutFile, "%%%%Orientation: Landscape\n"); +00532 fprintf(pOutFile, "%%%%BoundingBox: 0 0 %.0f %.0f\n", +00533 dDrawUnits2Points(lPageHeight), +00534 dDrawUnits2Points(lPageWidth)); +00535 } else { +00536 fprintf(pOutFile, "%%%%Orientation: Portrait\n"); +00537 fprintf(pOutFile, "%%%%BoundingBox: 0 0 %.0f %.0f\n", +00538 dDrawUnits2Points(lPageWidth), +00539 dDrawUnits2Points(lPageHeight)); +00540 } +00541 } /* end of vProloguePS */ +00542 +00543 /* +00544 * vEpiloguePS - clean up after everything is done +00545 */ +00546 void +00547 vEpiloguePS(diagram_type *pDiag) +00548 { +00549 fail(pDiag == NULL); +00550 fail(pDiag->pOutFile == NULL); +00551 +00552 if (pDiag->lYtop < lPageHeight - PS_TOP_MARGIN) { +00553 vAddFooter(pDiag); +00554 fprintf(pDiag->pOutFile, "showpage\n"); +00555 } +00556 fprintf(pDiag->pOutFile, "%%%%Trailer\n"); +00557 fprintf(pDiag->pOutFile, "%%%%Pages: %d\n", iPageCount); +00558 fprintf(pDiag->pOutFile, "%%%%EOF\n"); +00559 szCreationDate = NULL; +00560 szCreator = NULL; +00561 } /* end of vEpiloguePS */ +00562 +00563 /* +00564 * vPrintPalette - print a postscript palette +00565 */ +00566 static void +00567 vPrintPalette(FILE *pOutFile, const imagedata_type *pImg) +00568 { +00569 int iIndex; +00570 +00571 fail(pOutFile == NULL); +00572 fail(pImg == NULL); +00573 fail(pImg->iColorsUsed < 2); +00574 fail(pImg->iColorsUsed > 256); +00575 +00576 fprintf(pOutFile, "[ /Indexed\n"); +00577 fprintf(pOutFile, "\t/Device%s %d\n", +00578 pImg->bColorImage ? "RGB" : "Gray", pImg->iColorsUsed - 1); +00579 fprintf(pOutFile, "<"); +00580 for (iIndex = 0; iIndex < pImg->iColorsUsed; iIndex++) { +00581 fprintf(pOutFile, "%02x", +00582 (unsigned int)pImg->aucPalette[iIndex][0]); +00583 if (pImg->bColorImage) { +00584 fprintf(pOutFile, "%02x%02x", +00585 (unsigned int)pImg->aucPalette[iIndex][1], +00586 (unsigned int)pImg->aucPalette[iIndex][2]); +00587 } +00588 if (iIndex % 8 == 7) { +00589 fprintf(pOutFile, "\n"); +00590 } else { +00591 fprintf(pOutFile, " "); +00592 } +00593 } +00594 fprintf(pOutFile, ">\n"); +00595 fprintf(pOutFile, "] setcolorspace\n"); +00596 } /* end of vPrintPalette */ +00597 +00598 /* +00599 * vImageProloguePS - perform the Encapsulated PostScript initialization +00600 */ +00601 void +00602 vImageProloguePS(diagram_type *pDiag, const imagedata_type *pImg) +00603 { +00604 FILE *pOutFile; +00605 +00606 fail(pDiag == NULL); +00607 fail(pDiag->pOutFile == NULL); +00608 fail(pImg == NULL); +00609 +00610 if (pImg->iVerSizeScaled <= 0 || pImg->iHorSizeScaled <= 0) { +00611 return; +00612 } +00613 +00614 fail(szCreationDate == NULL); +00615 fail(szCreator == NULL); +00616 fail(eImageLevel == level_no_images); +00617 +00618 iImageCount++; +00619 +00620 DBG_DEC_C(pDiag->lXleft != 0, pDiag->lXleft); +00621 +00622 pDiag->lYtop -= lPoints2DrawUnits(pImg->iVerSizeScaled); +00623 vMoveTo(pDiag, lPoints2DrawUnits(pImg->iVerSizeScaled)); +00624 +00625 pOutFile = pDiag->pOutFile; +00626 +00627 fprintf(pOutFile, "BeginEPSF\n"); +00628 fprintf(pOutFile, "%%%%BeginDocument: image%03d.eps\n", iImageCount); +00629 fprintf(pOutFile, "%%!PS-Adobe-2.0 EPSF-2.0\n"); +00630 fprintf(pOutFile, "%%%%Creator: %s %s\n", szCreator, VERSIONSTRING); +00631 fprintf(pOutFile, "%%%%Title: Image %03d\n", iImageCount); +00632 fprintf(pOutFile, "%%%%CreationDate: %s", szCreationDate); +00633 fprintf(pOutFile, "%%%%BoundingBox: 0 0 %d %d\n", +00634 pImg->iHorSizeScaled, pImg->iVerSizeScaled); +00635 fprintf(pOutFile, "%%%%DocumentData: Clean7Bit\n"); +00636 fprintf(pOutFile, "%%%%LanguageLevel: 2\n"); +00637 fprintf(pOutFile, "%%%%EndComments\n"); +00638 fprintf(pOutFile, "%%%%BeginProlog\n"); +00639 fprintf(pOutFile, "%%%%EndProlog\n"); +00640 fprintf(pOutFile, "%%%%Page: 1 1\n"); +00641 +00642 fprintf(pOutFile, "save\n"); +00643 +00644 switch (pImg->eImageType) { +00645 case imagetype_is_jpeg: +00646 fprintf(pOutFile, "/Data1 currentfile "); +00647 fprintf(pOutFile, "/ASCII85Decode filter def\n"); +00648 fprintf(pOutFile, "/Data Data1 << "); +00649 fprintf(pOutFile, ">> /DCTDecode filter def\n"); +00650 switch (pImg->iComponents) { +00651 case 1: +00652 fprintf(pOutFile, "/DeviceGray setcolorspace\n"); +00653 break; +00654 case 3: +00655 fprintf(pOutFile, "/DeviceRGB setcolorspace\n"); +00656 break; +00657 case 4: +00658 fprintf(pOutFile, "/DeviceCMYK setcolorspace\n"); +00659 break; +00660 default: +00661 DBG_DEC(pImg->iComponents); +00662 break; +00663 } +00664 break; +00665 case imagetype_is_png: +00666 if (eImageLevel == level_gs_special) { +00667 fprintf(pOutFile, +00668 "/Data2 currentfile /ASCII85Decode filter def\n"); +00669 fprintf(pOutFile, +00670 "/Data1 Data2 << >> /FlateDecode filter def\n"); +00671 fprintf(pOutFile, "/Data Data1 <<\n"); +00672 fprintf(pOutFile, "\t/Colors %d\n", pImg->iComponents); +00673 fprintf(pOutFile, "\t/BitsPerComponent %u\n", +00674 pImg->uiBitsPerComponent); +00675 fprintf(pOutFile, "\t/Columns %d\n", pImg->iWidth); +00676 fprintf(pOutFile, +00677 ">> /PNGPredictorDecode filter def\n"); +00678 } else { +00679 fprintf(pOutFile, +00680 "/Data1 currentfile /ASCII85Decode filter def\n"); +00681 fprintf(pOutFile, +00682 "/Data Data1 << >> /FlateDecode filter def\n"); +00683 } +00684 if (pImg->iComponents == 3 || pImg->iComponents == 4) { +00685 fprintf(pOutFile, "/DeviceRGB setcolorspace\n"); +00686 } else if (pImg->iColorsUsed > 0) { +00687 vPrintPalette(pOutFile, pImg); +00688 } else { +00689 fprintf(pOutFile, "/DeviceGray setcolorspace\n"); +00690 } +00691 break; +00692 case imagetype_is_dib: +00693 fprintf(pOutFile, "/Data currentfile "); +00694 fprintf(pOutFile, "/ASCII85Decode filter def\n"); +00695 if (pImg->uiBitsPerComponent <= 8) { +00696 vPrintPalette(pOutFile, pImg); +00697 } else { +00698 fprintf(pOutFile, "/DeviceRGB setcolorspace\n"); +00699 } +00700 break; +00701 default: +00702 fprintf(pOutFile, "/Data currentfile "); +00703 fprintf(pOutFile, "/ASCIIHexDecode filter def\n"); +00704 fprintf(pOutFile, "/Device%s setcolorspace\n", +00705 pImg->bColorImage ? "RGB" : "Gray"); +00706 break; +00707 } +00708 +00709 /* Translate to lower left corner of image */ +00710 fprintf(pOutFile, "%.2f %.2f translate\n", +00711 dDrawUnits2Points(pDiag->lXleft + PS_LEFT_MARGIN), +00712 dDrawUnits2Points(pDiag->lYtop)); +00713 +00714 fprintf(pOutFile, "%d %d scale\n", +00715 pImg->iHorSizeScaled, pImg->iVerSizeScaled); +00716 +00717 fprintf(pOutFile, "{ <<\n"); +00718 fprintf(pOutFile, "\t/ImageType 1\n"); +00719 fprintf(pOutFile, "\t/Width %d\n", pImg->iWidth); +00720 fprintf(pOutFile, "\t/Height %d\n", pImg->iHeight); +00721 if (pImg->eImageType == imagetype_is_dib) { +00722 /* Scanning from left to right and bottom to top */ +00723 fprintf(pOutFile, "\t/ImageMatrix [ %d 0 0 %d 0 0 ]\n", +00724 pImg->iWidth, pImg->iHeight); +00725 } else { +00726 /* Scanning from left to right and top to bottom */ +00727 fprintf(pOutFile, "\t/ImageMatrix [ %d 0 0 %d 0 %d ]\n", +00728 pImg->iWidth, -pImg->iHeight, pImg->iHeight); +00729 } +00730 fprintf(pOutFile, "\t/DataSource Data\n"); +00731 +00732 switch (pImg->eImageType) { +00733 case imagetype_is_jpeg: +00734 fprintf(pOutFile, "\t/BitsPerComponent 8\n"); +00735 switch (pImg->iComponents) { +00736 case 1: +00737 fprintf(pOutFile, "\t/Decode [0 1]\n"); +00738 break; +00739 case 3: +00740 fprintf(pOutFile, "\t/Decode [0 1 0 1 0 1]\n"); +00741 break; +00742 case 4: +00743 if (pImg->bAdobe) { +00744 /* +00745 * Adobe-conforming CMYK file +00746 * applying workaround for color inversion +00747 */ +00748 fprintf(pOutFile, +00749 "\t/Decode [1 0 1 0 1 0 1 0]\n"); +00750 } else { +00751 fprintf(pOutFile, +00752 "\t/Decode [0 1 0 1 0 1 0 1]\n"); +00753 } +00754 break; +00755 default: +00756 DBG_DEC(pImg->iComponents); +00757 break; +00758 } +00759 break; +00760 case imagetype_is_png: +00761 if (pImg->iComponents == 3) { +00762 fprintf(pOutFile, "\t/BitsPerComponent 8\n"); +00763 fprintf(pOutFile, "\t/Decode [0 1 0 1 0 1]\n"); +00764 } else if (pImg->iColorsUsed > 0) { +00765 fail(pImg->uiBitsPerComponent > 8); +00766 fprintf(pOutFile, "\t/BitsPerComponent %u\n", +00767 pImg->uiBitsPerComponent); +00768 fprintf(pOutFile, "\t/Decode [0 %d]\n", +00769 (1 << pImg->uiBitsPerComponent) - 1); +00770 } else { +00771 fprintf(pOutFile, "\t/BitsPerComponent 8\n"); +00772 fprintf(pOutFile, "\t/Decode [0 1]\n"); +00773 } +00774 break; +00775 case imagetype_is_dib: +00776 fprintf(pOutFile, "\t/BitsPerComponent 8\n"); +00777 if (pImg->uiBitsPerComponent <= 8) { +00778 fprintf(pOutFile, "\t/Decode [0 255]\n"); +00779 } else { +00780 fprintf(pOutFile, "\t/Decode [0 1 0 1 0 1]\n"); +00781 } +00782 break; +00783 default: +00784 fprintf(pOutFile, "\t/BitsPerComponent 8\n"); +00785 if (pImg->bColorImage) { +00786 fprintf(pOutFile, "\t/Decode [0 1 0 1 0 1]\n"); +00787 } else { +00788 fprintf(pOutFile, "\t/Decode [0 1]\n"); +00789 } +00790 break; +00791 } +00792 +00793 fprintf(pOutFile, " >> image\n"); +00794 fprintf(pOutFile, " Data closefile\n"); +00795 fprintf(pOutFile, " showpage\n"); +00796 fprintf(pOutFile, " restore\n"); +00797 fprintf(pOutFile, "} exec\n"); +00798 } /* end of vImageProloguePS */ +00799 +00800 /* +00801 * vImageEpiloguePS - clean up after Encapsulated PostScript +00802 */ +00803 void +00804 vImageEpiloguePS(diagram_type *pDiag) +00805 { +00806 FILE *pOutFile; +00807 +00808 fail(pDiag == NULL); +00809 fail(pDiag->pOutFile == NULL); +00810 +00811 pOutFile = pDiag->pOutFile; +00812 +00813 fprintf(pOutFile, "%%%%EOF\n"); +00814 fprintf(pOutFile, "%%%%EndDocument\n"); +00815 fprintf(pOutFile, "EndEPSF\n"); +00816 +00817 pDiag->lXleft = 0; +00818 } /* end of vImageEpiloguePS */ +00819 +00820 /* +00821 * bAddDummyImagePS - add a dummy image +00822 * +00823 * return TRUE when successful, otherwise FALSE +00824 */ +00825 BOOL +00826 bAddDummyImagePS(diagram_type *pDiag, const imagedata_type *pImg) +00827 { +00828 FILE *pOutFile; +00829 +00830 fail(pDiag == NULL); +00831 fail(pDiag->pOutFile == NULL); +00832 fail(pImg == NULL); +00833 +00834 if (pImg->iVerSizeScaled <= 0 || pImg->iHorSizeScaled <= 0) { +00835 return FALSE; +00836 } +00837 +00838 iImageCount++; +00839 +00840 DBG_DEC_C(pDiag->lXleft != 0, pDiag->lXleft); +00841 +00842 pDiag->lYtop -= lPoints2DrawUnits(pImg->iVerSizeScaled); +00843 vMoveTo(pDiag, lPoints2DrawUnits(pImg->iVerSizeScaled)); +00844 +00845 pOutFile = pDiag->pOutFile; +00846 +00847 fprintf(pOutFile, "gsave %% Image %03d\n", iImageCount); +00848 fprintf(pOutFile, "\tnewpath\n"); +00849 fprintf(pOutFile, "\t%.2f %.2f moveto\n", +00850 dDrawUnits2Points(pDiag->lXleft + PS_LEFT_MARGIN), +00851 dDrawUnits2Points(pDiag->lYtop)); +00852 fprintf(pOutFile, "\t1.0 setlinewidth\n"); +00853 fprintf(pOutFile, "\t0.3 setgray\n"); +00854 fprintf(pOutFile, "\t0 %d rlineto\n", pImg->iVerSizeScaled); +00855 fprintf(pOutFile, "\t%d 0 rlineto\n", pImg->iHorSizeScaled); +00856 fprintf(pOutFile, "\t0 %d rlineto\n", -pImg->iVerSizeScaled); +00857 fprintf(pOutFile, "\tclosepath\n"); +00858 fprintf(pOutFile, "\tstroke\n"); +00859 fprintf(pOutFile, "grestore\n"); +00860 +00861 pDiag->lXleft = 0; +00862 +00863 return TRUE; +00864 } /* end of bAddDummyImagePS */ +00865 +00866 /* +00867 * vAddFontsPS - add the list of fonts and complete the prologue +00868 */ +00869 void +00870 vAddFontsPS(diagram_type *pDiag) +00871 { +00872 FILE *pOutFile; +00873 const font_table_type *pTmp, *pTmp2; +00874 size_t tIndex; +00875 int iLineLen, iOurFontnameLen; +00876 BOOL bFound; +00877 +00878 fail(pDiag == NULL); +00879 fail(pDiag->pOutFile == NULL); +00880 +00881 pOutFile = pDiag->pOutFile; +00882 iLineLen = fprintf(pOutFile, "%%%%DocumentFonts:"); +00883 +00884 if (tGetFontTableLength() == 0) { +00885 iLineLen += fprintf(pOutFile, " Courier"); +00886 } else { +00887 pTmp = NULL; +00888 while ((pTmp = pGetNextFontTableRecord(pTmp)) != NULL) { +00889 /* Print the document fonts */ +00890 bFound = FALSE; +00891 pTmp2 = NULL; +00892 while ((pTmp2 = pGetNextFontTableRecord(pTmp2)) +00893 != NULL && pTmp2 < pTmp) { +00894 bFound = STREQ(pTmp2->szOurFontname, +00895 pTmp->szOurFontname); +00896 if (bFound) { +00897 break; +00898 } +00899 } +00900 iOurFontnameLen = (int)strlen(pTmp->szOurFontname); +00901 if (bFound || iOurFontnameLen <= 0) { +00902 continue; +00903 } +00904 if (iLineLen + iOurFontnameLen > 76) { +00905 fprintf(pOutFile, "\n%%%%+"); +00906 iLineLen = 3; +00907 } +00908 iLineLen += fprintf(pOutFile, +00909 " %s", pTmp->szOurFontname); +00910 } +00911 } +00912 fprintf(pOutFile, "\n"); +00913 fprintf(pOutFile, "%%%%Pages: (atend)\n"); +00914 fprintf(pOutFile, "%%%%EndComments\n"); +00915 fprintf(pOutFile, "%%%%BeginProlog\n"); +00916 +00917 switch (eEncoding) { +00918 case encoding_latin_1: +00919 for (tIndex = 0; +00920 tIndex < elementsof(iso_8859_1_data); +00921 tIndex++) { +00922 fprintf(pOutFile, "%s\n", iso_8859_1_data[tIndex]); +00923 } +00924 fprintf(pOutFile, "\n"); +00925 for (tIndex = 0; +00926 tIndex < elementsof(iso_8859_x_func); +00927 tIndex++) { +00928 fprintf(pOutFile, "%s\n", iso_8859_x_func[tIndex]); +00929 } +00930 break; +00931 case encoding_latin_2: +00932 for (tIndex = 0; +00933 tIndex < elementsof(iso_8859_2_data); +00934 tIndex++) { +00935 fprintf(pOutFile, "%s\n", iso_8859_2_data[tIndex]); +00936 } +00937 fprintf(pOutFile, "\n"); +00938 for (tIndex = 0; +00939 tIndex < elementsof(iso_8859_x_func); +00940 tIndex++) { +00941 fprintf(pOutFile, "%s\n", iso_8859_x_func[tIndex]); +00942 } +00943 break; +00944 case encoding_cyrillic: +00945 for (tIndex = 0; +00946 tIndex < elementsof(iso_8859_5_data); +00947 tIndex++) { +00948 fprintf(pOutFile, "%s\n", iso_8859_5_data[tIndex]); +00949 } +00950 fprintf(pOutFile, "\n"); +00951 for (tIndex = 0; +00952 tIndex < elementsof(iso_8859_x_func); +00953 tIndex++) { +00954 fprintf(pOutFile, "%s\n", iso_8859_x_func[tIndex]); +00955 } +00956 break; +00957 case encoding_utf_8: +00958 werr(1, +00959 "The combination PostScript and UTF-8 is not supported"); +00960 break; +00961 default: +00962 DBG_DEC(eEncoding); +00963 break; +00964 } +00965 +00966 /* The rest of the functions */ +00967 for (tIndex = 0; tIndex < elementsof(misc_func); tIndex++) { +00968 fprintf(pOutFile, "%s\n", misc_func[tIndex]); +00969 } +00970 fprintf(pOutFile, "%%%%EndProlog\n"); +00971 iPageCount = 1; +00972 fprintf(pDiag->pOutFile, "%%%%Page: %d %d\n", iPageCount, iPageCount); +00973 vAddPageSetup(pDiag->pOutFile); +00974 vAddHeader(pDiag); +00975 } /* end of vAddFontsPS */ +00976 +00977 /* +00978 * vPrintPS - print a PostScript string +00979 */ +00980 static void +00981 vPrintPS(FILE *pFile, const char *szString, size_t tStringLength, +00982 USHORT usFontstyle) +00983 { +00984 double dSuperscriptMove, dSubscriptMove; +00985 const UCHAR *ucBytes; +00986 size_t tCount; +00987 +00988 fail(szString == NULL); +00989 +00990 if (szString == NULL || szString[0] == '\0' || tStringLength == 0) { +00991 return; +00992 } +00993 DBG_DEC_C(usFontSizeCurr < MIN_FONT_SIZE, usFontSizeCurr); +00994 +00995 dSuperscriptMove = 0.0; +00996 dSubscriptMove = 0.0; +00997 +00998 /* Up for superscript */ +00999 if (bIsSuperscript(usFontstyle) && usFontSizeCurr != 0) { +01000 dSuperscriptMove = (double)((usFontSizeCurr + 1) / 2) * 0.375; +01001 fprintf(pFile, "0 %.2f rmoveto\n", dSuperscriptMove); +01002 } +01003 +01004 /* Down for subscript */ +01005 if (bIsSubscript(usFontstyle) && usFontSizeCurr != 0) { +01006 dSubscriptMove = (double)usFontSizeCurr * 0.125; +01007 fprintf(pFile, "0 %.2f rmoveto\n", -dSubscriptMove); +01008 } +01009 +01010 /* Generate and print the PostScript output */ +01011 ucBytes = (UCHAR *)szString; +01012 (void)putc('(', pFile); +01013 for (tCount = 0; tCount < tStringLength ; tCount++) { +01014 switch (ucBytes[tCount]) { +01015 case '(': +01016 case ')': +01017 case '\\': +01018 (void)putc('\\', pFile); +01019 (void)putc(szString[tCount], pFile); +01020 break; +01021 default: +01022 if (ucBytes[tCount] < 0x20 || +01023 (ucBytes[tCount] >= 0x7f && +01024 ucBytes[tCount] < 0x8c)) { +01025 DBG_HEX(ucBytes[tCount]); +01026 (void)putc(' ', pFile); +01027 } else if (ucBytes[tCount] >= 0x80) { +01028 fprintf(pFile, "\\%03o", (UINT)ucBytes[tCount]); +01029 } else { +01030 (void)putc(szString[tCount], pFile); +01031 } +01032 break; +01033 } +01034 } +01035 fprintf(pFile, ") "); +01036 if ((bIsStrike(usFontstyle) || bIsMarkDel(usFontstyle)) && +01037 usFontSizeCurr != 0) { +01038 fprintf(pFile, "%.2f %.2f LineShow\n", +01039 (double)usFontSizeCurr * 0.02, +01040 (double)usFontSizeCurr * 0.12); +01041 } else if (bIsUnderline(usFontstyle) && usFontSizeCurr != 0) { +01042 fprintf(pFile, "%.2f %.2f LineShow\n", +01043 (double)usFontSizeCurr * 0.02, +01044 (double)usFontSizeCurr * -0.06); +01045 } else { +01046 fprintf(pFile, "show\n"); +01047 } +01048 +01049 /* Undo the superscript move */ +01050 if (bIsSuperscript(usFontstyle) && usFontSizeCurr != 0) { +01051 fprintf(pFile, "0 %.2f rmoveto\n", -dSuperscriptMove); +01052 } +01053 +01054 /* Undo the subscript move */ +01055 if (bIsSubscript(usFontstyle) && usFontSizeCurr != 0) { +01056 fprintf(pFile, "0 %.2f rmoveto\n", dSubscriptMove); +01057 } +01058 } /* end of vPrintPS */ +01059 +01060 /* +01061 * vSetColor - move to the specified color +01062 */ +01063 static void +01064 vSetColor(FILE *pFile, UCHAR ucFontColor) +01065 { +01066 ULONG ulTmp, ulRed, ulGreen, ulBlue; +01067 +01068 ulTmp = ulColor2Color(ucFontColor); +01069 ulRed = (ulTmp & 0x0000ff00) >> 8; +01070 ulGreen = (ulTmp & 0x00ff0000) >> 16; +01071 ulBlue = (ulTmp & 0xff000000) >> 24; +01072 fprintf(pFile, "%.3f %.3f %.3f setrgbcolor\n", +01073 ulRed / 255.0, ulGreen / 255.0, ulBlue / 255.0); +01074 } /* end of vSetColor */ +01075 +01076 /* +01077 * vMove2NextLinePS - move to the next line +01078 */ +01079 void +01080 vMove2NextLinePS(diagram_type *pDiag, USHORT usFontSize) +01081 { +01082 fail(pDiag == NULL); +01083 fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE); +01084 +01085 pDiag->lYtop -= lComputeLeading(usFontSize); +01086 } /* end of vMove2NextLinePS */ +01087 +01088 /* +01089 * vSubstringPS - print a sub string +01090 */ +01091 void +01092 vSubstringPS(diagram_type *pDiag, +01093 char *szString, size_t tStringLength, long lStringWidth, +01094 UCHAR ucFontColor, USHORT usFontstyle, drawfile_fontref tFontRef, +01095 USHORT usFontSize, USHORT usMaxFontSize) +01096 { +01097 const char *szOurFontname; +01098 +01099 fail(pDiag == NULL || szString == NULL); +01100 fail(pDiag->pOutFile == NULL); +01101 fail(pDiag->lXleft < 0); +01102 fail(tStringLength != strlen(szString)); +01103 fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE); +01104 fail(usMaxFontSize < MIN_FONT_SIZE || usMaxFontSize > MAX_FONT_SIZE); +01105 fail(usFontSize > usMaxFontSize); +01106 +01107 if (szString[0] == '\0' || tStringLength == 0) { +01108 return; +01109 } +01110 +01111 if (tFontRef != tFontRefCurr || usFontSize != usFontSizeCurr) { +01112 szOurFontname = szGetFontname(tFontRef); +01113 fail(szOurFontname == NULL); +01114 fprintf(pDiag->pOutFile, +01115 "%.1f /%s /%s-ISO-8859-x ChgFnt\n", +01116 (double)usFontSize / 2.0, +01117 szOurFontname, szOurFontname); +01118 tFontRefCurr = tFontRef; +01119 usFontSizeCurr = usFontSize; +01120 } +01121 if ((int)ucFontColor != iFontColorCurr) { +01122 vSetColor(pDiag->pOutFile, ucFontColor); +01123 iFontColorCurr = (int)ucFontColor; +01124 } +01125 vMoveTo(pDiag, lComputeLeading(usMaxFontSize)); +01126 vPrintPS(pDiag->pOutFile, szString, tStringLength, usFontstyle); +01127 pDiag->lXleft += lStringWidth; +01128 } /* end of vSubstringPS */ +01129 +01130 /* +01131 * Create an start of paragraph by moving the y-top mark +01132 */ +01133 void +01134 vStartOfParagraphPS(diagram_type *pDiag, long lBeforeIndentation) +01135 { +01136 fail(pDiag == NULL); +01137 fail(lBeforeIndentation < 0); +01138 +01139 pDiag->lXleft = 0; +01140 pDiag->lYtop -= lMilliPoints2DrawUnits(lBeforeIndentation); +01141 } /* end of vStartOfParagraphPS */ +01142 +01143 /* +01144 * Create an end of paragraph by moving the y-top mark +01145 */ +01146 void +01147 vEndOfParagraphPS(diagram_type *pDiag, +01148 USHORT usFontSize, long lAfterIndentation) +01149 { +01150 fail(pDiag == NULL); +01151 fail(pDiag->pOutFile == NULL); +01152 fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE); +01153 fail(lAfterIndentation < 0); +01154 +01155 if (pDiag->lXleft > 0) { +01156 /* To the start of the line */ +01157 vMove2NextLinePS(pDiag, usFontSize); +01158 } +01159 +01160 pDiag->lXleft = 0; +01161 pDiag->lYtop -= lMilliPoints2DrawUnits(lAfterIndentation); +01162 } /* end of vEndOfParagraphPS */ +01163 +01164 /* +01165 * Create an end of page +01166 */ +01167 void +01168 vEndOfPagePS(diagram_type *pDiag, BOOL bNewSection) +01169 { +01170 vMove2NextPage(pDiag, bNewSection); +01171 } /* end of vEndOfPagePS */ +