diff -r 59758314f811 -r d4524d6a4472 Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/postscript_8c_source.html --- a/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/postscript_8c_source.html Fri Jun 11 15:24:34 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1187 +0,0 @@ - - - - -TB9.2 Example Applications: examples/PIPS/antiword/src/postscript.c Source File - - - - - -

examples/PIPS/antiword/src/postscript.c

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 */
-
-
Generated by  - -doxygen 1.6.2
- -