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

examples/PIPS/antiword/src/pdf.c

00001 /*
-00002  * pdf.c
-00003  * Copyright (C) 2003-2005 A.J. van Os; Released under GNU GPL
-00004  *
-00005  * Description:
-00006  * Functions to deal with the Adobe Portable Document Format (pdf)
-00007  *
-00008  */
-00009 
-00010 #include <stdarg.h>
-00011 #include <string.h>
-00012 #include "version.h"
-00013 #include "antiword.h"
-00014 
-00015 
-00016 /* Constants for the file positions */
-00017 #define INITIAL_LOCATION_SIZE   20
-00018 #define INITIAL_PAGEOBJECT_SIZE  5
-00019 #if defined(DEBUG)
-00020 #define EXTENSION_ARRAY_SIZE    10
-00021 #else
-00022 #define EXTENSION_ARRAY_SIZE    30
-00023 #endif /* DEBUG */
-00024 
-00025 /* The character set */
-00026 static encoding_type    eEncoding = encoding_neutral;
-00027 /* Current creator for a PDF header */
-00028 static const char       *szProducer = NULL;
-00029 /* The height and width of a PDF 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 font information */
-00037 static drawfile_fontref tFontRefCurr = (drawfile_fontref)-1;
-00038 static USHORT           usFontSizeCurr = 0;
-00039 static int              iFontColorCurr = -1;
-00040 /* Current vertical position information */
-00041 static long             lYtopCurr = -1;
-00042 /* Image counter */
-00043 static int              iImageCount = 0;
-00044 /* Section index */
-00045 static int              iSectionIndex = 0;
-00046 /* Are we on the first page of the section? */
-00047 static BOOL             bFirstInSection = TRUE;
-00048 /* File positions */
-00049 static long             lFilePosition = 0;
-00050 static long             *alLocation = NULL;
-00051 static size_t           tLocations = 0;
-00052 static int              iMaxLocationNumber = 0;
-00053 /* File position at the start of a page */
-00054 static long             lStreamStart = -1;
-00055 /* Page objects */
-00056 static int              *aiPageObject = NULL;
-00057 static int              iPageCount = 0;
-00058 static size_t           tMaxPageObjects = 0;
-00059 /* Current object number */
-00060 /* 1 = root; 2 = info; 3 = pages; 4 = encoding; 5-16 = fonts; 17 = resources */
-00061 static int              iObjectNumberCurr = 17;
-00062 
-00063 static void             vMoveTo(diagram_type *, long);
-00064 
-00065 static const struct {
-00066         const char      *szPDFname;
-00067         const char      *szPSname;
-00068 } atFontname[] = {
-00069         { "Courier",                    FONT_MONOSPACED_PLAIN },
-00070         { "Courier-Bold",               FONT_MONOSPACED_BOLD },
-00071         { "Courier-Oblique",            FONT_MONOSPACED_ITALIC },
-00072         { "Courier-BoldOblique",        FONT_MONOSPACED_BOLDITALIC },
-00073         { "Helvetica",                  FONT_SANS_SERIF_PLAIN },
-00074         { "Helvetica-Bold",             FONT_SANS_SERIF_BOLD },
-00075         { "Helvetica-Oblique",          FONT_SANS_SERIF_ITALIC },
-00076         { "Helvetica-BoldOblique",      FONT_SANS_SERIF_BOLDITALIC },
-00077         { "Times-Roman",                FONT_SERIF_PLAIN },
-00078         { "Times-Bold",                 FONT_SERIF_BOLD },
-00079         { "Times-Italic",               FONT_SERIF_ITALIC },
-00080         { "Times-BoldItalic",           FONT_SERIF_BOLDITALIC },
-00081 };
-00082 
-00083 static const char *iso_8859_1[] = {
-00084 "128 /Euro",
-00085 "140 /ellipsis /trademark /perthousand /bullet",
-00086 "    /quoteleft /quoteright /guilsinglleft /guilsinglright",
-00087 "    /quotedblleft /quotedblright /quotedblbase /endash /emdash",
-00088 "    /minus /OE /oe /dagger /daggerdbl /fi /fl",
-00089 "160 /space /exclamdown /cent /sterling /currency",
-00090 "    /yen /brokenbar /section /dieresis /copyright",
-00091 "    /ordfeminine /guillemotleft /logicalnot /hyphen /registered",
-00092 "    /macron /degree /plusminus /twosuperior /threesuperior",
-00093 "    /acute /mu /paragraph /periodcentered /cedilla",
-00094 "    /onesuperior /ordmasculine /guillemotright /onequarter",
-00095 "    /onehalf /threequarters /questiondown /Agrave /Aacute",
-00096 "    /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla",
-00097 "    /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute",
-00098 "    /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute",
-00099 "    /Ocircumflex /Otilde /Odieresis /multiply /Oslash",
-00100 "    /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn",
-00101 "    /germandbls /agrave /aacute /acircumflex /atilde",
-00102 "    /adieresis /aring /ae /ccedilla /egrave /eacute",
-00103 "    /ecircumflex /edieresis /igrave /iacute /icircumflex",
-00104 "    /idieresis /eth /ntilde /ograve /oacute /ocircumflex",
-00105 "    /otilde /odieresis /divide /oslash /ugrave /uacute",
-00106 "    /ucircumflex /udieresis /yacute /thorn /ydieresis",
-00107 };
-00108 
-00109 static const char *iso_8859_2[] = {
-00110 "160 /space /Aogonek /breve /Lslash /currency /Lcaron",
-00111 "    /Sacute /section /dieresis /Scaron /Scommaaccent",
-00112 "    /Tcaron /Zacute /hyphen /Zcaron /Zdotaccent /degree",
-00113 "    /aogonek /ogonek /lslash /acute /lcaron /sacute",
-00114 "    /caron /cedilla /scaron /scommaaccent /tcaron",
-00115 "    /zacute /hungarumlaut /zcaron /zdotaccent /Racute",
-00116 "    /Aacute /Acircumflex /Abreve /Adieresis /Lacute",
-00117 "    /Cacute /Ccedilla /Ccaron /Eacute /Eogonek",
-00118 "    /Edieresis /Ecaron /Iacute /Icircumflex /Dcaron",
-00119 "    /.notdef /Nacute /Ncaron /Oacute /Ocircumflex",
-00120 "    /Ohungarumlaut /Odieresis /multiply /Rcaron /Uring",
-00121 "    /Uacute /Uhungarumlaut /Udieresis /Yacute /Tcommaaccent",
-00122 "    /germandbls /racute /aacute /acircumflex /abreve",
-00123 "    /adieresis /lacute /cacute /ccedilla /ccaron /eacute",
-00124 "    /eogonek /edieresis /ecaron /iacute /icircumflex",
-00125 "    /dcaron /.notdef /nacute /ncaron /oacute /ocircumflex",
-00126 "    /ohungarumlaut /odieresis /divide /rcaron /uring",
-00127 "    /uacute /uhungarumlaut /udieresis /yacute /tcommaaccent",
-00128 "    /dotaccent",
-00129 };
-00130 
-00131 
-00132 /*
-00133  * tGetFontIndex - get the font index
-00134  */
-00135 static size_t
-00136 tGetFontIndex(drawfile_fontref tFontRef)
-00137 {
-00138         const char      *szFontname;
-00139         size_t          tIndex;
-00140 
-00141         /* Get the font name */
-00142         szFontname = szGetFontname(tFontRef);
-00143         fail(szFontname == NULL);
-00144         if (szFontname == NULL) {
-00145                 return 0;
-00146         }
-00147 
-00148         /* Find the name in the table */
-00149         for (tIndex = 0; tIndex < elementsof(atFontname); tIndex++) {
-00150                 if (STRCEQ(atFontname[tIndex].szPSname, szFontname)) {
-00151                         return tIndex;
-00152                 }
-00153         }
-00154         /* Not found */
-00155         DBG_DEC(tFontRef);
-00156         DBG_MSG(szFontname);
-00157         return 0;
-00158 } /* end of tGetFontIndex */
-00159 
-00160 /*
-00161  * vSetLocation - store the location of objects
-00162  */
-00163 static void
-00164 vSetLocation(int iLocationNumber)
-00165 {
-00166         fail(iLocationNumber <= 0);
-00167 
-00168         if ((size_t)iLocationNumber >= tLocations) {
-00169                 /* Extend and set to zero */
-00170                 tLocations += EXTENSION_ARRAY_SIZE;
-00171                 alLocation = xrealloc(alLocation, tLocations * sizeof(long));
-00172                 memset(alLocation + tLocations - EXTENSION_ARRAY_SIZE,
-00173                         0,
-00174                         EXTENSION_ARRAY_SIZE * sizeof(long));
-00175                 DBG_DEC(tLocations);
-00176         }
-00177         if (iLocationNumber > iMaxLocationNumber) {
-00178                 iMaxLocationNumber = iLocationNumber;
-00179         }
-00180 
-00181         DBG_DEC_C((size_t)iLocationNumber >= tLocations, iLocationNumber);
-00182         DBG_DEC_C((size_t)iLocationNumber >= tLocations, tLocations);
-00183         fail((size_t)iLocationNumber >= tLocations);
-00184 
-00185         alLocation[iLocationNumber] = lFilePosition;
-00186 } /* end of vSetLocation */
-00187 
-00188 /*
-00189  * vFillNextPageObject - fil the next page object with the current object number
-00190  */
-00191 static void
-00192 vFillNextPageObject(void)
-00193 {
-00194         iPageCount++;
-00195         if ((size_t)iPageCount >= tMaxPageObjects) {
-00196                 /* Extend the array */
-00197                 tMaxPageObjects += EXTENSION_ARRAY_SIZE;
-00198                 aiPageObject = xrealloc(aiPageObject,
-00199                                         tMaxPageObjects * sizeof(int));
-00200                 DBG_DEC(tMaxPageObjects);
-00201         }
-00202         aiPageObject[iPageCount] = iObjectNumberCurr;
-00203 } /* end of vFillNextPageObject */
-00204 
-00205 /*
-00206  * vFPprintf - printf and update the fileposition
-00207  *
-00208  * called with arguments like fprintf(3)
-00209  */
-00210 static void
-00211 vFPprintf(FILE *pOutFile, const char *szFormat, ...)
-00212 {
-00213         va_list tArg;
-00214 
-00215         va_start(tArg, szFormat);
-00216         lFilePosition += vfprintf(pOutFile, szFormat, tArg);
-00217         va_end(tArg);
-00218 } /* end of vFPprintf */
-00219 
-00220 /*
-00221  * vCreateInfoDictionary - create the document information dictionary
-00222  */
-00223 void
-00224 vCreateInfoDictionary(diagram_type *pDiag, int iWordVersion)
-00225 {
-00226         FILE    *pOutFile;
-00227         const char      *szTitle, *szAuthor, *szSubject, *szCreator;
-00228         const char      *szCreationDate, *szModDate;
-00229 
-00230         fail(pDiag == NULL);
-00231         fail(pDiag->pOutFile == NULL);
-00232         fail(iWordVersion < 0);
-00233         fail(szProducer == NULL || szProducer[0] == '\0');
-00234 
-00235         szTitle = szGetTitle();
-00236         szAuthor = szGetAuthor();
-00237         szSubject = szGetSubject();
-00238         szCreationDate = szGetCreationDate();
-00239         szModDate = szGetModDate();
-00240 
-00241         switch (iWordVersion) {
-00242         case 0: szCreator = "Word for DOS"; break;
-00243         case 1: szCreator = "WinWord 1.x"; break;
-00244         case 2: szCreator = "WinWord 2.0"; break;
-00245         case 4: szCreator = "MacWord 4"; break;
-00246         case 5: szCreator = "MacWord 5"; break;
-00247         case 6: szCreator = "Word 6"; break;
-00248         case 7: szCreator = "Word 7/95"; break;
-00249         case 8: szCreator = "Word 97 or later"; break;
-00250         default: szCreator = NULL; break;
-00251         }
-00252 
-00253         pOutFile = pDiag->pOutFile;
-00254 
-00255         vSetLocation(2);
-00256         vFPprintf(pOutFile, "2 0 obj\n");
-00257         vFPprintf(pOutFile, "<<\n");
-00258         if (szTitle != NULL && szTitle[0] != '\0') {
-00259                 vFPprintf(pOutFile, "/Title (%s)\n", szTitle);
-00260         }
-00261         if (szAuthor != NULL && szAuthor[0] != '\0') {
-00262                 vFPprintf(pOutFile, "/Author (%s)\n", szAuthor);
-00263         }
-00264         if (szSubject != NULL && szSubject[0] != '\0') {
-00265                 vFPprintf(pOutFile, "/Subject (%s)\n", szSubject);
-00266         }
-00267         if (szCreator != NULL && szCreator[0] != '\0') {
-00268                 vFPprintf(pOutFile, "/Creator (%s)\n", szCreator);
-00269         }
-00270         vFPprintf(pOutFile, "/Producer (%s %s)\n", szProducer, VERSIONSTRING);
-00271         if (szCreationDate != NULL && szCreationDate[0] != '\0') {
-00272                 vFPprintf(pOutFile, "/CreationDate (%s)\n", szCreationDate);
-00273         }
-00274         if (szModDate != NULL && szModDate[0] != '\0') {
-00275                 vFPprintf(pOutFile, "/ModDate (%s)\n", szModDate);
-00276         }
-00277         vFPprintf(pOutFile, ">>\n");
-00278         vFPprintf(pOutFile, "endobj\n");
-00279 } /* end of vCreateInfoDictionary */
-00280 
-00281 /*
-00282  * vAddHdrFtr - add a header or footer
-00283  */
-00284 static void
-00285 vAddHdrFtr(diagram_type *pDiag, const hdrftr_block_type *pHdrFtrInfo)
-00286 {
-00287         output_type     *pStart, *pPrev, *pNext;
-00288 
-00289         fail(pDiag == NULL);
-00290         fail(pHdrFtrInfo == NULL);
-00291 
-00292         vStartOfParagraphPDF(pDiag, 0);
-00293         pStart = pHdrFtrInfo->pText;
-00294         while (pStart != NULL) {
-00295                 pNext = pStart;
-00296                 while (pNext != NULL &&
-00297                        (pNext->tNextFree != 1 ||
-00298                         (pNext->szStorage[0] != PAR_END &&
-00299                          pNext->szStorage[0] != HARD_RETURN))) {
-00300                         pNext = pNext->pNext;
-00301                 }
-00302                 if (pNext == NULL) {
-00303                         if (bOutputContainsText(pStart)) {
-00304                                 vAlign2Window(pDiag, pStart,
-00305                                         lChar2MilliPoints(DEFAULT_SCREEN_WIDTH),
-00306                                         ALIGNMENT_LEFT);
-00307                         } else {
-00308                                 vMove2NextLinePDF(pDiag, pStart->usFontSize);
-00309                         }
-00310                         break;
-00311                 }
-00312                 fail(pNext->tNextFree != 1);
-00313                 fail(pNext->szStorage[0] != PAR_END &&
-00314                         pNext->szStorage[0] != HARD_RETURN);
-00315 
-00316                 if (pStart != pNext) {
-00317                         /* There is something to print */
-00318                         pPrev = pNext->pPrev;
-00319                         fail(pPrev->pNext != pNext);
-00320                         /* Cut the chain */
-00321                         pPrev->pNext = NULL;
-00322                         if (bOutputContainsText(pStart)) {
-00323                                 /* Print it */
-00324                                 vAlign2Window(pDiag, pStart,
-00325                                         lChar2MilliPoints(DEFAULT_SCREEN_WIDTH),
-00326                                         ALIGNMENT_LEFT);
-00327                         } else {
-00328                                 /* Just an empty line */
-00329                                 vMove2NextLinePDF(pDiag, pStart->usFontSize);
-00330                         }
-00331                         /* Repair the chain */
-00332                         pPrev->pNext = pNext;
-00333                 }
-00334                 if (pNext->szStorage[0] == PAR_END) {
-00335                         vEndOfParagraphPDF(pDiag, pNext->usFontSize,
-00336                                         (long)pNext->usFontSize * 200);
-00337                 }
-00338                 pStart = pNext->pNext;
-00339         }
-00340 } /* end of vAddHdrFtr */
-00341 
-00342 /*
-00343  * vAddHeader - add a page header
-00344  */
-00345 static void
-00346 vAddHeader(diagram_type *pDiag)
-00347 {
-00348         const hdrftr_block_type *pHdrInfo;
-00349         const hdrftr_block_type *pFtrInfo;
-00350 
-00351         fail(pDiag == NULL);
-00352 
-00353         NO_DBG_MSG("vAddHeader");
-00354 
-00355         pHdrInfo = pGetHdrFtrInfo(iSectionIndex, TRUE,
-00356                                         odd(iPageCount), bFirstInSection);
-00357         pFtrInfo = pGetHdrFtrInfo(iSectionIndex, FALSE,
-00358                                         odd(iPageCount), bFirstInSection);
-00359         /* Set the height of the footer of this page */
-00360         lFooterHeight = pFtrInfo == NULL ? 0 : pFtrInfo->lHeight;
-00361         fail(lFooterHeight < 0);
-00362 
-00363         if (pHdrInfo == NULL ||
-00364             pHdrInfo->pText == NULL ||
-00365             pHdrInfo->lHeight <= 0) {
-00366                 fail(pHdrInfo != NULL && pHdrInfo->lHeight < 0);
-00367                 fail(pHdrInfo != NULL &&
-00368                         pHdrInfo->pText != NULL &&
-00369                         pHdrInfo->lHeight == 0);
-00370                 return;
-00371         }
-00372 
-00373         vAddHdrFtr(pDiag, pHdrInfo);
-00374 
-00375         DBG_DEC_C(pHdrInfo->lHeight !=
-00376                 lPageHeight - PS_TOP_MARGIN - pDiag->lYtop,
-00377                 pHdrInfo->lHeight);
-00378         DBG_DEC_C(pHdrInfo->lHeight !=
-00379                 lPageHeight - PS_TOP_MARGIN - pDiag->lYtop,
-00380                 lPageHeight - PS_TOP_MARGIN - pDiag->lYtop);
-00381 } /* end of vAddHeader */
-00382 
-00383 /*
-00384  * vAddFooter - add a page footer
-00385  */
-00386 static void
-00387 vAddFooter(diagram_type *pDiag)
-00388 {
-00389         const hdrftr_block_type *pFtrInfo;
-00390 
-00391         fail(pDiag == NULL);
-00392 
-00393         NO_DBG_MSG("vAddFooter");
-00394 
-00395         pFtrInfo = pGetHdrFtrInfo(iSectionIndex, FALSE,
-00396                                         odd(iPageCount), bFirstInSection);
-00397         bFirstInSection = FALSE;
-00398         if (pFtrInfo == NULL ||
-00399             pFtrInfo->pText == NULL ||
-00400             pFtrInfo->lHeight <= 0) {
-00401                 fail(pFtrInfo != NULL && pFtrInfo->lHeight < 0);
-00402                 fail(pFtrInfo != NULL &&
-00403                         pFtrInfo->pText != NULL &&
-00404                         pFtrInfo->lHeight == 0);
-00405                 return;
-00406         }
-00407 
-00408         bInFtrSpace = TRUE;
-00409 
-00410         DBG_DEC_C(pFtrInfo->lHeight != lFooterHeight, pFtrInfo->lHeight);
-00411         DBG_DEC_C(pFtrInfo->lHeight != lFooterHeight, lFooterHeight);
-00412         DBG_DEC_C(pDiag->lYtop < lFooterHeight + PS_BOTTOM_MARGIN,
-00413                         pDiag->lYtop);
-00414         DBG_DEC_C(pDiag->lYtop < lFooterHeight + PS_BOTTOM_MARGIN,
-00415                         lFooterHeight + PS_BOTTOM_MARGIN);
-00416 
-00417         if (pDiag->lYtop > lFooterHeight + PS_BOTTOM_MARGIN) {
-00418                 /* Move down to the start of the footer */
-00419                 pDiag->lYtop = lFooterHeight + PS_BOTTOM_MARGIN;
-00420                 vMoveTo(pDiag, 0);
-00421         } else if (pDiag->lYtop < lFooterHeight + PS_BOTTOM_MARGIN / 2) {
-00422                 DBG_FIXME();
-00423                 /*
-00424                  * Move up to the start of the footer, to prevent moving
-00425                  * of the bottom edge of the paper
-00426                  */
-00427                 pDiag->lYtop = lFooterHeight + PS_BOTTOM_MARGIN;
-00428                 vMoveTo(pDiag, 0);
-00429         }
-00430 
-00431         DBG_FLT_C(pDiag->lYtop < lFooterHeight + PS_BOTTOM_MARGIN,
-00432         dDrawUnits2Points(lFooterHeight + PS_BOTTOM_MARGIN - pDiag->lYtop));
-00433 
-00434         vAddHdrFtr(pDiag, pFtrInfo);
-00435         bInFtrSpace = FALSE;
-00436 } /* end of vAddFooter */
-00437 
-00438 /*
-00439  * vEndPageObject - end the current page object
-00440  */
-00441 static void
-00442 vEndPageObject(FILE *pOutFile)
-00443 {
-00444         long    lStreamEnd;
-00445 
-00446         if (lStreamStart < 0) {
-00447                 /* There is no current page object */
-00448                 return;
-00449         }
-00450 
-00451         vFPprintf(pOutFile, "ET\n");
-00452         lStreamEnd = lFilePosition;
-00453         vFPprintf(pOutFile, "endstream\n");
-00454         vFPprintf(pOutFile, "endobj\n");
-00455 
-00456         iObjectNumberCurr++;
-00457         vSetLocation(iObjectNumberCurr);
-00458         vFPprintf(pOutFile, "%d 0 obj\n", iObjectNumberCurr);
-00459         vFPprintf(pOutFile, "%lu\n", lStreamEnd - lStreamStart);
-00460         vFPprintf(pOutFile, "endobj\n");
-00461 } /* end of vEndPageObject */
-00462 
-00463 /*
-00464  * vMove2NextPage - move to the start of the next page
-00465  */
-00466 static void
-00467 vMove2NextPage(diagram_type *pDiag, BOOL bNewSection)
-00468 {
-00469         FILE    *pOutFile;
-00470 
-00471         fail(pDiag == NULL);
-00472         fail(pDiag->pOutFile == NULL);
-00473 
-00474         pOutFile = pDiag->pOutFile;
-00475 
-00476         vAddFooter(pDiag);
-00477         /* End the old page object */
-00478         vEndPageObject(pOutFile);
-00479         if (bNewSection) {
-00480                 iSectionIndex++;
-00481                 bFirstInSection = TRUE;
-00482         }
-00483 
-00484         /* Start the new page object */
-00485         iObjectNumberCurr++;
-00486         vSetLocation(iObjectNumberCurr);
-00487         vFillNextPageObject();
-00488         vFPprintf(pOutFile, "%d 0 obj\n", iObjectNumberCurr);
-00489         vFPprintf(pOutFile, "<<\n");
-00490         vFPprintf(pOutFile, "/Type /Page\n");
-00491         vFPprintf(pOutFile, "/Parent 3 0 R\n");
-00492         vFPprintf(pOutFile, "/Resources 17 0 R\n");
-00493         vFPprintf(pOutFile, "/Contents %d 0 R\n", iObjectNumberCurr + 1);
-00494         vFPprintf(pOutFile, ">>\n");
-00495         vFPprintf(pOutFile, "endobj\n");
-00496 
-00497         /* Start the new text object */
-00498         iObjectNumberCurr++;
-00499         vSetLocation(iObjectNumberCurr);
-00500         vFPprintf(pOutFile, "%d 0 obj\n", iObjectNumberCurr);
-00501         vFPprintf(pOutFile, "<<\n");
-00502         vFPprintf(pOutFile, "/Length %d 0 R\n", iObjectNumberCurr + 1);
-00503         vFPprintf(pOutFile, ">>\n");
-00504         vFPprintf(pOutFile, "stream\n");
-00505         lStreamStart = lFilePosition;
-00506         vFPprintf(pOutFile, "BT\n");
-00507 
-00508         /* Set variables to their start of page values */
-00509         pDiag->lYtop = lPageHeight - PS_TOP_MARGIN;
-00510         tFontRefCurr = (drawfile_fontref)-1;
-00511         usFontSizeCurr = 0;
-00512         iFontColorCurr = -1;
-00513         lYtopCurr = -1;
-00514         vAddHeader(pDiag);
-00515 } /* end of vMove2NextPage */
-00516 
-00517 /*
-00518  * vMoveTo - move to the specified X,Y coordinates
-00519  *
-00520  * Move the current position of the specified diagram to its X,Y coordinates,
-00521  * start on a new page if needed
-00522  */
-00523 static void
-00524 vMoveTo(diagram_type *pDiag, long lLastVerticalMovement)
-00525 {
-00526         fail(pDiag == NULL);
-00527         fail(pDiag->pOutFile == NULL);
-00528 
-00529         if (pDiag->lYtop <= lFooterHeight + PS_BOTTOM_MARGIN && !bInFtrSpace) {
-00530                 vMove2NextPage(pDiag, FALSE);
-00531                 /* Repeat the last vertical movement on the new page */
-00532                 pDiag->lYtop -= lLastVerticalMovement;
-00533         }
-00534 
-00535         fail(pDiag->lYtop < lFooterHeight + PS_BOTTOM_MARGIN && !bInFtrSpace);
-00536         DBG_DEC_C(pDiag->lYtop < PS_BOTTOM_MARGIN, pDiag->lYtop);
-00537         fail(pDiag->lYtop < PS_BOTTOM_MARGIN / 3);
-00538 
-00539         if (pDiag->lYtop != lYtopCurr) {
-00540                 vFPprintf(pDiag->pOutFile, "1 0 0 1 %.2f %.2f Tm\n",
-00541                         dDrawUnits2Points(pDiag->lXleft + PS_LEFT_MARGIN),
-00542                         dDrawUnits2Points(pDiag->lYtop));
-00543                 lYtopCurr = pDiag->lYtop;
-00544         }
-00545 } /* end of vMoveTo */
-00546 
-00547 /*
-00548  * vProloguePDF - set options and perform the PDF initialization
-00549  */
-00550 void
-00551 vProloguePDF(diagram_type *pDiag,
-00552         const char *szTask, const options_type *pOptions)
-00553 {
-00554         FILE    *pOutFile;
-00555 
-00556         fail(pDiag == NULL);
-00557         fail(pDiag->pOutFile == NULL);
-00558         fail(pOptions == NULL);
-00559 
-00560         pOutFile = pDiag->pOutFile;
-00561 
-00562         eEncoding = pOptions->eEncoding;
-00563 
-00564         /* Create an empty location array */
-00565         tLocations = INITIAL_LOCATION_SIZE;
-00566         alLocation = xcalloc(tLocations, sizeof(long));
-00567 
-00568         /* Create an empty pageobject array */
-00569         tMaxPageObjects = INITIAL_PAGEOBJECT_SIZE;
-00570         aiPageObject = xcalloc(tMaxPageObjects, sizeof(int));
-00571 
-00572         if (pOptions->iPageHeight == INT_MAX) {
-00573                 lPageHeight = LONG_MAX;
-00574         } else {
-00575                 lPageHeight = lPoints2DrawUnits(pOptions->iPageHeight);
-00576         }
-00577         DBG_DEC(lPageHeight);
-00578         if (pOptions->iPageWidth == INT_MAX) {
-00579                 lPageWidth = LONG_MAX;
-00580         } else {
-00581                 lPageWidth = lPoints2DrawUnits(pOptions->iPageWidth);
-00582         }
-00583         DBG_DEC(lPageWidth);
-00584         lFooterHeight = 0;
-00585         bInFtrSpace = FALSE;
-00586 
-00587         tFontRefCurr = (drawfile_fontref)-1;
-00588         usFontSizeCurr = 0;
-00589         iFontColorCurr = -1;
-00590         lYtopCurr = -1;
-00591         iPageCount = 0;
-00592         iImageCount = 0;
-00593         iSectionIndex = 0;
-00594         bFirstInSection = TRUE;
-00595         lFilePosition = 0;
-00596         iMaxLocationNumber = 0;
-00597         lStreamStart = -1;
-00598         iObjectNumberCurr = 17;
-00599         pDiag->lXleft = 0;
-00600         pDiag->lYtop = 0;
-00601 
-00602         szProducer = szTask;
-00603 
-00604         vFPprintf(pOutFile, "%%PDF-1.3\n");
-00605         vFPprintf(pOutFile, "%%%c%c%c%c\n", 0xe2, 0xe3, 0xcf, 0xd3);
-00606 
-00607         /* Root catalog */
-00608         vSetLocation(1);
-00609         vFPprintf(pOutFile, "1 0 obj\n");
-00610         vFPprintf(pOutFile, "<<\n");
-00611         vFPprintf(pOutFile, "/Type /Catalog\n");
-00612         vFPprintf(pOutFile, "/Pages 3 0 R\n");
-00613         vFPprintf(pOutFile, ">>\n");
-00614         vFPprintf(pOutFile, "endobj\n");
-00615 } /* end of vProloguePDF */
-00616 
-00617 /*
-00618  * vEpiloguePDF - clean up after everything is done
-00619  */
-00620 void
-00621 vEpiloguePDF(diagram_type *pDiag)
-00622 {
-00623         FILE    *pOutFile;
-00624         long    lXref;
-00625         int     iIndex;
-00626 
-00627         fail(pDiag == NULL);
-00628         fail(pDiag->pOutFile == NULL);
-00629 
-00630         pOutFile = pDiag->pOutFile;
-00631 
-00632         vAddFooter(pDiag);
-00633         /* End the old page object */
-00634         vEndPageObject(pOutFile);
-00635 
-00636         vSetLocation(3);
-00637         vFPprintf(pOutFile, "3 0 obj\n");
-00638         vFPprintf(pOutFile, "<<\n");
-00639         vFPprintf(pOutFile, "/Type /Pages\n");
-00640         vFPprintf(pOutFile, "/Count %d\n", iPageCount);
-00641         vFPprintf(pOutFile, "/MediaBox [ 0 0 %.0f %.0f ]\n",
-00642                         dDrawUnits2Points(lPageWidth),
-00643                         dDrawUnits2Points(lPageHeight));
-00644         vFPprintf(pOutFile, "/Kids [ ");
-00645         for (iIndex = 1; iIndex <= iPageCount; iIndex++) {
-00646                 vFPprintf(pOutFile, "\t%d 0 R\n", aiPageObject[iIndex]);
-00647         }
-00648         vFPprintf(pOutFile, "]\n");
-00649         vFPprintf(pOutFile, ">>\n");
-00650         vFPprintf(pOutFile, "endobj\n");
-00651 
-00652         lXref = lFilePosition;
-00653 
-00654         vFPprintf(pOutFile, "xref\n");
-00655         vFPprintf(pOutFile, "0 %d\n", iMaxLocationNumber + 1);
-00656         vFPprintf(pOutFile, "0000000000 65535 f \n");
-00657         for (iIndex = 1; iIndex <= iMaxLocationNumber; iIndex++) {
-00658                 vFPprintf(pOutFile, "%.10ld 00000 n \n", alLocation[iIndex]);
-00659         }
-00660 
-00661         vFPprintf(pOutFile, "trailer\n");
-00662         vFPprintf(pOutFile, "<<\n");
-00663         vFPprintf(pOutFile, "/Size %d\n", iMaxLocationNumber + 1);
-00664         vFPprintf(pOutFile, "/Root 1 0 R\n");
-00665         vFPprintf(pOutFile, "/Info 2 0 R\n");
-00666         vFPprintf(pOutFile, ">>\n");
-00667 
-00668         vFPprintf(pOutFile, "startxref\n");
-00669         vFPprintf(pOutFile, "%ld\n", lXref);
-00670         vFPprintf(pOutFile, "%%%%EOF\n");
-00671 
-00672         szProducer = NULL;
-00673         aiPageObject = xfree(aiPageObject);
-00674         alLocation = xfree(alLocation);
-00675 } /* end of vEpiloguePDF */
-00676 
-00677 /*
-00678  * vPrintPalette - print a pdf color space (palette)
-00679  */
-00680 static void
-00681 vPrintPalette(FILE *pOutFile, const imagedata_type *pImg)
-00682 {
-00683         int     iIndex;
-00684 
-00685         fail(pOutFile == NULL);
-00686         fail(pImg == NULL);
-00687         fail(pImg->iColorsUsed < 2);
-00688         fail(pImg->iColorsUsed > 256);
-00689 
-00690         vFPprintf(pOutFile, "\t/ColorSpace [ /Indexed\n");
-00691         vFPprintf(pOutFile, "\t/Device%s %d\n",
-00692                 pImg->bColorImage ? "RGB" : "Gray", pImg->iColorsUsed - 1);
-00693         vFPprintf(pOutFile, "<");
-00694         for (iIndex = 0; iIndex < pImg->iColorsUsed; iIndex++) {
-00695                 vFPprintf(pOutFile, "%02x",
-00696                                 (unsigned int)pImg->aucPalette[iIndex][0]);
-00697                 if (pImg->bColorImage) {
-00698                         vFPprintf(pOutFile, "%02x%02x",
-00699                                 (unsigned int)pImg->aucPalette[iIndex][1],
-00700                                 (unsigned int)pImg->aucPalette[iIndex][2]);
-00701                 }
-00702                 if (iIndex % 8 == 7) {
-00703                         vFPprintf(pOutFile, "\n");
-00704                 } else {
-00705                         vFPprintf(pOutFile, " ");
-00706                 }
-00707         }
-00708         vFPprintf(pOutFile, "> ]\n");
-00709 } /* end of vPrintPalette */
-00710 
-00711 /*
-00712  * vImageProloguePDF - perform the image initialization
-00713  */
-00714 void
-00715 vImageProloguePDF(diagram_type *pDiag, const imagedata_type *pImg)
-00716 {
-00717         FILE    *pOutFile;
-00718 
-00719         fail(pDiag == NULL);
-00720         fail(pDiag->pOutFile == NULL);
-00721         fail(pImg == NULL);
-00722 
-00723         if (pImg->iVerSizeScaled <= 0 || pImg->iHorSizeScaled <= 0) {
-00724                 return;
-00725         }
-00726 
-00727         iImageCount++;
-00728 
-00729         DBG_DEC_C(pDiag->lXleft != 0, pDiag->lXleft);
-00730 
-00731         pDiag->lYtop -= lPoints2DrawUnits(pImg->iVerSizeScaled);
-00732         vMoveTo(pDiag, lPoints2DrawUnits(pImg->iVerSizeScaled));
-00733 
-00734         pOutFile = pDiag->pOutFile;
-00735 
-00736         vFPprintf(pOutFile, "ET\n");
-00737         vFPprintf(pOutFile, "q %% Image %03d\n", iImageCount);
-00738         if (pImg->eImageType == imagetype_is_dib) {
-00739                 /* Scanning from left to right and bottom to top */
-00740                 vFPprintf(pOutFile, "%d 0 0 %d %.2f %.2f cm\n",
-00741                         pImg->iHorSizeScaled, -pImg->iVerSizeScaled,
-00742                         dDrawUnits2Points(pDiag->lXleft + PS_LEFT_MARGIN),
-00743                         dDrawUnits2Points(pDiag->lYtop) + pImg->iVerSizeScaled);
-00744         } else {
-00745                 /* Scanning from left to right and top to bottom */
-00746                 vFPprintf(pOutFile, "%d 0 0 %d %.2f %.2f cm\n",
-00747                         pImg->iHorSizeScaled, pImg->iVerSizeScaled,
-00748                         dDrawUnits2Points(pDiag->lXleft + PS_LEFT_MARGIN),
-00749                         dDrawUnits2Points(pDiag->lYtop));
-00750         }
-00751         vFPprintf(pOutFile, "BI\n");
-00752         vFPprintf(pOutFile, "\t/Width %d\n", pImg->iWidth);
-00753         vFPprintf(pOutFile, "\t/Height %d\n", pImg->iHeight);
-00754         switch (pImg->eImageType) {
-00755         case imagetype_is_jpeg:
-00756                 switch (pImg->iComponents) {
-00757                 case 1:
-00758                         vFPprintf(pOutFile, "\t/ColorSpace /DeviceGray\n");
-00759                         break;
-00760                 case 3:
-00761                         vFPprintf(pOutFile, "\t/ColorSpace /DeviceRGB\n");
-00762                         break;
-00763                 case 4:
-00764                         vFPprintf(pOutFile, "\t/ColorSpace /DeviceCMYK\n");
-00765                         if (pImg->bAdobe) {
-00766                                 /*
-00767                                  * Adobe-conforming CMYK file
-00768                                  * applying workaround for color inversion
-00769                                  */
-00770                                 vFPprintf(pOutFile,
-00771                                         "\t/Decode [1 0 1 0 1 0 1 0]\n");
-00772                         }
-00773                         break;
-00774                 default:
-00775                         DBG_DEC(pImg->iComponents);
-00776                         break;
-00777                 }
-00778                 vFPprintf(pOutFile, "\t/BitsPerComponent 8\n");
-00779                 vFPprintf(pOutFile,
-00780                         "\t/Filter [ /ASCII85Decode /DCTDecode ]\n");
-00781                 break;
-00782         case imagetype_is_png:
-00783                 if (pImg->iComponents == 3 || pImg->iComponents == 4) {
-00784                         vFPprintf(pOutFile, "\t/ColorSpace /DeviceRGB\n");
-00785                         vFPprintf(pOutFile, "\t/BitsPerComponent 8\n");
-00786                 } else if (pImg->iColorsUsed > 0) {
-00787                         vPrintPalette(pOutFile, pImg);
-00788                         fail(pImg->uiBitsPerComponent > 8);
-00789                         vFPprintf(pOutFile, "\t/BitsPerComponent %u\n",
-00790                                         pImg->uiBitsPerComponent);
-00791                 } else {
-00792                         vFPprintf(pOutFile, "\t/ColorSpace /DeviceGray\n");
-00793                         vFPprintf(pOutFile, "\t/BitsPerComponent 8\n");
-00794                 }
-00795                 vFPprintf(pOutFile,
-00796                         "\t/Filter [ /ASCII85Decode /FlateDecode ]\n");
-00797                 vFPprintf(pOutFile, "\t/DecodeParms [ null <<\n");
-00798                 vFPprintf(pOutFile, "\t\t/Predictor 10\n");
-00799                 vFPprintf(pOutFile, "\t\t/Colors %d\n", pImg->iComponents);
-00800                 vFPprintf(pOutFile, "\t\t/BitsPerComponent %u\n",
-00801                                                 pImg->uiBitsPerComponent);
-00802                 vFPprintf(pOutFile, "\t\t/Columns %d\n", pImg->iWidth);
-00803                 vFPprintf(pOutFile, "\t\t>> ]\n");
-00804                 break;
-00805         case imagetype_is_dib:
-00806                 if (pImg->uiBitsPerComponent <= 8) {
-00807                         vPrintPalette(pOutFile, pImg);
-00808                 } else {
-00809                         vFPprintf(pOutFile, "\t/ColorSpace /DeviceRGB\n");
-00810                 }
-00811                 vFPprintf(pOutFile, "\t/BitsPerComponent 8\n");
-00812                 vFPprintf(pOutFile, "\t/Filter /ASCII85Decode\n");
-00813                 break;
-00814         default:
-00815                 vFPprintf(pOutFile, "\t/ColorSpace /Device%s\n",
-00816                         pImg->bColorImage ? "RGB" : "Gray");
-00817                 vFPprintf(pOutFile, "\t/BitsPerComponent 8\n");
-00818                 vFPprintf(pOutFile, "\t/Filter /ASCIIHexDecode\n");
-00819                 break;
-00820         }
-00821         vFPprintf(pOutFile, "ID\n");
-00822 } /* end of vImageProloguePDF */
-00823 
-00824 /*
-00825  * vImageEpiloguePDF - clean up after the image
-00826  */
-00827 void
-00828 vImageEpiloguePDF(diagram_type *pDiag)
-00829 {
-00830         FILE    *pOutFile;
-00831 
-00832         fail(pDiag == NULL);
-00833         fail(pDiag->pOutFile == NULL);
-00834 
-00835         pOutFile = pDiag->pOutFile;
-00836 
-00837         /* Correction for the image bytes */
-00838         lFilePosition = ftell(pOutFile);
-00839 
-00840         vFPprintf(pOutFile, "EI\n");
-00841         vFPprintf(pOutFile, "Q\n");
-00842         vFPprintf(pOutFile, "BT\n");
-00843 
-00844         pDiag->lXleft = 0;
-00845 } /* end of vImageEpiloguePDF */
-00846 
-00847 /*
-00848  * bAddDummyImagePDF - add a dummy image
-00849  *
-00850  * return TRUE when successful, otherwise FALSE
-00851  */
-00852 BOOL
-00853 bAddDummyImagePDF(diagram_type *pDiag, const imagedata_type *pImg)
-00854 {
-00855         FILE    *pOutFile;
-00856 
-00857         fail(pDiag == NULL);
-00858         fail(pDiag->pOutFile == NULL);
-00859         fail(pImg == NULL);
-00860 
-00861         if (pImg->iVerSizeScaled <= 0 || pImg->iHorSizeScaled <= 0) {
-00862                 return FALSE;
-00863         }
-00864 
-00865         iImageCount++;
-00866 
-00867         DBG_DEC_C(pDiag->lXleft != 0, pDiag->lXleft);
-00868 
-00869         pDiag->lYtop -= lPoints2DrawUnits(pImg->iVerSizeScaled);
-00870         vMoveTo(pDiag, lPoints2DrawUnits(pImg->iVerSizeScaled));
-00871 
-00872         pOutFile = pDiag->pOutFile;
-00873 
-00874         vFPprintf(pOutFile, "ET\n");
-00875         vFPprintf(pOutFile, "q %% Image %03d\n", iImageCount);
-00876         vFPprintf(pOutFile, "\t1.0 w\n");
-00877         vFPprintf(pOutFile, "\t0.3 G\n");
-00878         vFPprintf(pOutFile, "\t%.2f %.2f %d %d re\n",
-00879                         dDrawUnits2Points(pDiag->lXleft + PS_LEFT_MARGIN),
-00880                         dDrawUnits2Points(pDiag->lYtop),
-00881                         pImg->iHorSizeScaled,
-00882                         pImg->iVerSizeScaled);
-00883         vFPprintf(pOutFile, "\tS\n");
-00884         vFPprintf(pOutFile, "Q\n");
-00885         vFPprintf(pOutFile, "BT\n");
-00886 
-00887         pDiag->lXleft = 0;
-00888 
-00889         return TRUE;
-00890 } /* end of bAddDummyImagePDF */
-00891 
-00892 /*
-00893  * vAddFontsPDF - add the font information
-00894  */
-00895 void
-00896 vAddFontsPDF(diagram_type *pDiag)
-00897 {
-00898         FILE    *pOutFile;
-00899         size_t  tIndex;
-00900 
-00901         fail(pDiag == NULL);
-00902         fail(pDiag->pOutFile == NULL);
-00903 
-00904         pOutFile = pDiag->pOutFile;
-00905 
-00906         /* The font encoding */
-00907         vSetLocation(4);
-00908         vFPprintf(pOutFile, "4 0 obj\n");
-00909         vFPprintf(pOutFile, "<<\n");
-00910         vFPprintf(pOutFile, "/Type /Encoding\n");
-00911         vFPprintf(pOutFile, "/BaseEncoding /StandardEncoding\n");
-00912         vFPprintf(pOutFile, "/Differences [\n");
-00913         switch (eEncoding) {
-00914         case encoding_latin_1:
-00915                 for (tIndex = 0;
-00916                      tIndex < elementsof(iso_8859_1);
-00917                      tIndex++) {
-00918                         vFPprintf(pOutFile, "%s\n", iso_8859_1[tIndex]);
-00919                 }
-00920                 break;
-00921         case encoding_latin_2:
-00922                 for (tIndex = 0;
-00923                      tIndex < elementsof(iso_8859_2);
-00924                      tIndex++) {
-00925                         vFPprintf(pOutFile, "%s\n", iso_8859_2[tIndex]);
-00926                 }
-00927                 break;
-00928         case encoding_cyrillic:
-00929                 werr(1,
-00930                 "The combination PDF and Cyrillic is not supported");
-00931                 break;
-00932         case encoding_utf_8:
-00933                 werr(1,
-00934                 "The combination PDF and UTF-8 is not supported");
-00935                 break;
-00936         default:
-00937                 DBG_DEC(eEncoding);
-00938                 break;
-00939         }
-00940         vFPprintf(pOutFile, "]\n");
-00941         vFPprintf(pOutFile, ">>\n");
-00942         vFPprintf(pOutFile, "endobj\n");
-00943 
-00944         /* Twelve of the standard type 1 fonts */
-00945         for (tIndex = 0; tIndex < 12; tIndex++) {
-00946                 vSetLocation(5 + tIndex);
-00947                 vFPprintf(pOutFile, "%u 0 obj\n", 5 + tIndex);
-00948                 vFPprintf(pOutFile, "<<\n");
-00949                 vFPprintf(pOutFile, "/Type /Font\n");
-00950                 vFPprintf(pOutFile, "/Subtype /Type1\n");
-00951                 vFPprintf(pOutFile, "/Name /F%u\n", 1 + tIndex);
-00952                 vFPprintf(pOutFile, "/BaseFont /%s\n",
-00953                                                 atFontname[tIndex].szPDFname);
-00954                 vFPprintf(pOutFile, "/Encoding 4 0 R\n");
-00955                 vFPprintf(pOutFile, ">>\n");
-00956                 vFPprintf(pOutFile, "endobj\n");
-00957         }
-00958 
-00959         /* The Resources */
-00960         vSetLocation(17);
-00961         vFPprintf(pOutFile, "17 0 obj\n");
-00962         vFPprintf(pOutFile, "<<\n");
-00963         vFPprintf(pOutFile, "/ProcSet [ /PDF /Text ]\n");
-00964         vFPprintf(pOutFile, "/Font <<\n");
-00965         for (tIndex = 0; tIndex < 12; tIndex++) {
-00966                 vFPprintf(pOutFile, "\t/F%u %u 0 R\n", 1 + tIndex, 5 + tIndex);
-00967         }
-00968         vFPprintf(pOutFile, "\t>>\n");
-00969         vFPprintf(pOutFile, ">>\n");
-00970         vFPprintf(pOutFile, "endobj\n");
-00971         vAddHeader(pDiag);
-00972 } /* end of vAddFontsPDF */
-00973 
-00974 /*
-00975  * vPrintPDF - print a PDF string
-00976  */
-00977 static void
-00978 vPrintPDF(FILE *pFile, const char *szString, size_t tStringLength,
-00979         USHORT usFontstyle)
-00980 {
-00981         const UCHAR     *aucBytes;
-00982         double  dMove;
-00983         size_t  tCount;
-00984 
-00985         fail(szString == NULL);
-00986 
-00987         if (szString == NULL || szString[0] == '\0' || tStringLength == 0) {
-00988                 return;
-00989         }
-00990         DBG_DEC_C(usFontSizeCurr < MIN_FONT_SIZE, usFontSizeCurr);
-00991 
-00992         dMove = 0.0;
-00993 
-00994         /* Up for superscript */
-00995         if (bIsSuperscript(usFontstyle) && usFontSizeCurr != 0) {
-00996                 dMove = (double)((usFontSizeCurr + 1) / 2) * 0.375;
-00997                 vFPprintf(pFile, "%.2f Ts\n", dMove);
-00998         }
-00999 
-01000         /* Down for subscript */
-01001         if (bIsSubscript(usFontstyle) && usFontSizeCurr != 0) {
-01002                 dMove = (double)usFontSizeCurr * 0.125;
-01003                 vFPprintf(pFile, "%.2f Ts\n", -dMove);
-01004         }
-01005 
-01006         /* Generate and print the PDF output */
-01007         aucBytes = (UCHAR *)szString;
-01008         vFPprintf(pFile, "(");
-01009         for (tCount = 0; tCount < tStringLength ; tCount++) {
-01010                 switch (aucBytes[tCount]) {
-01011                 case '(':
-01012                 case ')':
-01013                 case '\\':
-01014                         vFPprintf(pFile, "\\%c", szString[tCount]);
-01015                         break;
-01016                 default:
-01017                         if (aucBytes[tCount] < 0x20 ||
-01018                             aucBytes[tCount] == 0x7f ||
-01019                             (aucBytes[tCount] >= 0x81 &&
-01020                              aucBytes[tCount] < 0x8c)) {
-01021                                 DBG_HEX(aucBytes[tCount]);
-01022                                 vFPprintf(pFile, " ");
-01023                         } else if (aucBytes[tCount] >= 0x80) {
-01024                                 vFPprintf(pFile, "\\%03o",
-01025                                                 (UINT)aucBytes[tCount]);
-01026                         } else {
-01027                                 vFPprintf(pFile, "%c", szString[tCount]);
-01028                         }
-01029                         break;
-01030                 }
-01031         }
-01032         vFPprintf(pFile, ") Tj\n");
-01033 
-01034         /* Undo the superscript/subscript move */
-01035         if (dMove != 0.0) {
-01036                 vFPprintf(pFile, "0 Ts\n");
-01037         }
-01038 } /* end of vPrintPDF */
-01039 
-01040 /*
-01041  * vSetColor - move to the specified color
-01042  */
-01043 static void
-01044 vSetColor(FILE *pFile, UCHAR ucFontColor)
-01045 {
-01046         ULONG   ulTmp, ulRed, ulGreen, ulBlue;
-01047 
-01048         ulTmp = ulColor2Color(ucFontColor);
-01049         ulRed   = (ulTmp & 0x0000ff00) >> 8;
-01050         ulGreen = (ulTmp & 0x00ff0000) >> 16;
-01051         ulBlue  = (ulTmp & 0xff000000) >> 24;
-01052         vFPprintf(pFile, "%.3f %.3f %.3f rg\n",
-01053                         ulRed / 255.0, ulGreen / 255.0, ulBlue / 255.0);
-01054 } /* end of vSetColor */
-01055 
-01056 /*
-01057  * vMove2NextLinePDF - move to the next line
-01058  */
-01059 void
-01060 vMove2NextLinePDF(diagram_type *pDiag, USHORT usFontSize)
-01061 {
-01062         fail(pDiag == NULL);
-01063         fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE);
-01064 
-01065         pDiag->lYtop -= lComputeLeading(usFontSize);
-01066 } /* end of vMove2NextLinePDF */
-01067 
-01068 /*
-01069  * vSubstringPDF - print a sub string
-01070  */
-01071 void
-01072 vSubstringPDF(diagram_type *pDiag,
-01073         char *szString, size_t tStringLength, long lStringWidth,
-01074         UCHAR ucFontColor, USHORT usFontstyle, drawfile_fontref tFontRef,
-01075         USHORT usFontSize, USHORT usMaxFontSize)
-01076 {
-01077         size_t  tFontIndex;
-01078 
-01079         fail(pDiag == NULL || szString == NULL);
-01080         fail(pDiag->pOutFile == NULL);
-01081         fail(pDiag->lXleft < 0);
-01082         fail(tStringLength != strlen(szString));
-01083         fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE);
-01084         fail(usMaxFontSize < MIN_FONT_SIZE || usMaxFontSize > MAX_FONT_SIZE);
-01085         fail(usFontSize > usMaxFontSize);
-01086 
-01087         if (szString[0] == '\0' || tStringLength == 0) {
-01088                 return;
-01089         }
-01090 
-01091         vMoveTo(pDiag, lComputeLeading(usMaxFontSize));
-01092         if (tFontRef != tFontRefCurr || usFontSize != usFontSizeCurr) {
-01093                 tFontIndex = tGetFontIndex(tFontRef);
-01094                 vFPprintf(pDiag->pOutFile, "/F%u %.1f Tf\n",
-01095                          1 + tFontIndex, (double)usFontSize / 2.0);
-01096                 tFontRefCurr = tFontRef;
-01097                 usFontSizeCurr = usFontSize;
-01098         }
-01099         if ((int)ucFontColor != iFontColorCurr) {
-01100                 vSetColor(pDiag->pOutFile, ucFontColor);
-01101                 iFontColorCurr = (int)ucFontColor;
-01102         }
-01103         vPrintPDF(pDiag->pOutFile, szString, tStringLength, usFontstyle);
-01104         pDiag->lXleft += lStringWidth;
-01105 } /* end of vSubstringPDF */
-01106 
-01107 /*
-01108  * Create an start of paragraph by moving the y-top mark
-01109  */
-01110 void
-01111 vStartOfParagraphPDF(diagram_type *pDiag, long lBeforeIndentation)
-01112 {
-01113         fail(pDiag == NULL);
-01114         fail(lBeforeIndentation < 0);
-01115 
-01116         pDiag->lXleft = 0;
-01117         pDiag->lYtop -= lMilliPoints2DrawUnits(lBeforeIndentation);
-01118 } /* end of vStartOfParagraphPDF */
-01119 
-01120 /*
-01121  * Create an end of paragraph by moving the y-top mark
-01122  */
-01123 void
-01124 vEndOfParagraphPDF(diagram_type *pDiag,
-01125         USHORT usFontSize, long lAfterIndentation)
-01126 {
-01127         fail(pDiag == NULL);
-01128         fail(pDiag->pOutFile == NULL);
-01129         fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE);
-01130         fail(lAfterIndentation < 0);
-01131 
-01132         if (pDiag->lXleft > 0) {
-01133                 /* To the start of the line */
-01134                 vMove2NextLinePDF(pDiag, usFontSize);
-01135         }
-01136 
-01137         pDiag->lXleft = 0;
-01138         pDiag->lYtop -= lMilliPoints2DrawUnits(lAfterIndentation);
-01139 } /* end of vEndOfParagraphPDF */
-01140 
-01141 /*
-01142  * Create an end of page
-01143  */
-01144 void
-01145 vEndOfPagePDF(diagram_type *pDiag, BOOL bNewSection)
-01146 {
-01147         vMove2NextPage(pDiag, bNewSection);
-01148 } /* end of vEndOfPagePDF */
-
-
Generated by  - -doxygen 1.6.2
- -