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 @@ + + + + +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
+ +