[BACK]Return to term_ps.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/term_ps.c between version 1.37 and 1.38

version 1.37, 2010/07/25 11:44:31 version 1.38, 2010/07/25 19:37:38
Line 391  pdf_alloc(char *outopts)
Line 391  pdf_alloc(char *outopts)
 {  {
         struct termp    *p;          struct termp    *p;
   
         if (NULL == (p = pspdf_alloc(outopts)))          if (NULL != (p = pspdf_alloc(outopts)))
                 return(p);                  p->type = TERMTYPE_PDF;
   
         p->type = TERMTYPE_PDF;  
         return(p);          return(p);
 }  }
   
Line 404  ps_alloc(char *outopts)
Line 403  ps_alloc(char *outopts)
 {  {
         struct termp    *p;          struct termp    *p;
   
         if (NULL == (p = pspdf_alloc(outopts)))          if (NULL != (p = pspdf_alloc(outopts)))
                 return(p);                  p->type = TERMTYPE_PS;
   
         p->type = TERMTYPE_PS;  
         return(p);          return(p);
 }  }
   
Line 593  static void
Line 591  static void
 ps_closepage(struct termp *p)  ps_closepage(struct termp *p)
 {  {
         int              i;          int              i;
         size_t           len;          size_t           len, base;
   
           /*
            * Close out a page that we've already flushed to output.  In
            * PostScript, we simply note that the page must be showed.  In
            * PDF, we must now create the Length, Resource, and Page node
            * for the page contents.
            */
   
         assert(p->engine.ps.psmarg && p->engine.ps.psmarg[0]);          assert(p->engine.ps.psmarg && p->engine.ps.psmarg[0]);
         ps_printf(p, "%s", p->engine.ps.psmarg);          ps_printf(p, "%s", p->engine.ps.psmarg);
   
         if (TERMTYPE_PS == p->type) {          if (TERMTYPE_PS != p->type) {
                 ps_printf(p, "showpage\n");  
         } else {  
                 ps_printf(p, "ET\n");                  ps_printf(p, "ET\n");
   
                 len = p->engine.ps.pdfbytes - p->engine.ps.pdflastpg;                  len = p->engine.ps.pdfbytes - p->engine.ps.pdflastpg;
                 ps_printf(p, "endstream\n");                  base = p->engine.ps.pages * 4 + p->engine.ps.pdfbody;
                 ps_printf(p, "endobj\n");  
                 ps_printf(p, "%zu 0 obj\n",                  ps_printf(p, "endstream\nendobj\n");
                                 p->engine.ps.pdfbody +  
                                 (p->engine.ps.pages + 1) * 4 + 1);                  /* Length of content. */
                 ps_printf(p, "%zu\n", len);                  ps_printf(p, "%zu 0 obj\n", base + 1);
                 ps_printf(p, "endobj\n");                  ps_printf(p, "%zu\nendobj\n", len);
                 ps_printf(p, "%zu 0 obj\n",  
                                 p->engine.ps.pdfbody +                  /* Resource for content. */
                                 (p->engine.ps.pages + 1) * 4 + 2);                  ps_printf(p, "%zu 0 obj\n", base + 2);
                 ps_printf(p, "<<\n");                  ps_printf(p, "<<\n/ProcSet [/PDF /Text]\n");
                 ps_printf(p, "/ProcSet [/PDF /Text]\n");  
                 ps_printf(p, "/Font <<\n");                  ps_printf(p, "/Font <<\n");
                 for (i = 0; i < (int)TERMFONT__MAX; i++)                  for (i = 0; i < TERMFONT__MAX; i++)
                         ps_printf(p, "/F%d %d 0 R\n", i, 3 + i);                          ps_printf(p, "/F%d %d 0 R\n", i, 3 + i);
                 ps_printf(p, ">>\n");                  ps_printf(p, ">>\n>>\n");
                 ps_printf(p, ">>\n");  
                 ps_printf(p, "%zu 0 obj\n",                  /* Page node. */
                                 p->engine.ps.pdfbody +                  ps_printf(p, "%zu 0 obj\n<<\n", base + 3);
                                 (p->engine.ps.pages + 1) * 4 + 3);  
                 ps_printf(p, "<<\n");  
                 ps_printf(p, "/Type /Page\n");                  ps_printf(p, "/Type /Page\n");
                 ps_printf(p, "/Parent 2 0 R\n");                  ps_printf(p, "/Parent 2 0 R\n");
                 ps_printf(p, "/Resources %zu 0 R\n",                  ps_printf(p, "/Resources %zu 0 R\n", base + 2);
                                 p->engine.ps.pdfbody +                  ps_printf(p, "/Contents %zu 0 R\n", base);
                                 (p->engine.ps.pages + 1) * 4 + 2);                  ps_printf(p, ">>\nendobj\n");
                 ps_printf(p, "/Contents %zu 0 R\n",          } else
                                 p->engine.ps.pdfbody +                  ps_printf(p, "showpage\n");
                                 (p->engine.ps.pages + 1) * 4);  
                 ps_printf(p, ">>\n");  
                 ps_printf(p, "endobj\n");  
         }  
   
         p->engine.ps.pages++;          p->engine.ps.pages++;
         p->engine.ps.psrow = p->engine.ps.top;          p->engine.ps.psrow = p->engine.ps.top;
Line 647  ps_closepage(struct termp *p)
Line 644  ps_closepage(struct termp *p)
 static void  static void
 ps_end(struct termp *p)  ps_end(struct termp *p)
 {  {
         size_t           i, xref;          size_t           i, xref, base;
   
         /*          /*
          * At the end of the file, do one last showpage.  This is the           * At the end of the file, do one last showpage.  This is the
Line 668  ps_end(struct termp *p)
Line 665  ps_end(struct termp *p)
                 return;                  return;
         }          }
   
         ps_printf(p, "2 0 obj\n");          ps_printf(p, "2 0 obj\n<<\n/Type /Pages\n");
         ps_printf(p, "<<\n");  
         ps_printf(p, "/Type /Pages\n");  
         ps_printf(p, "/MediaBox [0 0 %zu %zu]\n",          ps_printf(p, "/MediaBox [0 0 %zu %zu]\n",
                         (size_t)AFM2PNT(p, p->engine.ps.width),                          (size_t)AFM2PNT(p, p->engine.ps.width),
                         (size_t)AFM2PNT(p, p->engine.ps.height));                          (size_t)AFM2PNT(p, p->engine.ps.height));
Line 679  ps_end(struct termp *p)
Line 674  ps_end(struct termp *p)
         ps_printf(p, "/Kids [");          ps_printf(p, "/Kids [");
   
         for (i = 0; i < p->engine.ps.pages; i++)          for (i = 0; i < p->engine.ps.pages; i++)
                 ps_printf(p, " %zu 0 R",                  ps_printf(p, " %zu 0 R", i * 4 +
                                 p->engine.ps.pdfbody +                                  p->engine.ps.pdfbody + 3);
                                 (i + 1) * 4 + 3);  
         ps_printf(p, "]\n");          base = (p->engine.ps.pages - 1) * 4 +
         ps_printf(p, ">>\n");                  p->engine.ps.pdfbody + 4;
         ps_printf(p, "endobj\n");  
         ps_printf(p, "%zu 0 obj\n",          ps_printf(p, "]\n>>\nendobj\n");
                         p->engine.ps.pdfbody +          ps_printf(p, "%zu 0 obj\n", base);
                         (p->engine.ps.pages * 4) + 4);  
         ps_printf(p, "<<\n");          ps_printf(p, "<<\n");
         ps_printf(p, "/Type /Catalog\n");          ps_printf(p, "/Type /Catalog\n");
         ps_printf(p, "/Pages 2 0 R\n");          ps_printf(p, "/Pages 2 0 R\n");
         ps_printf(p, ">>\n");          ps_printf(p, ">>\n");
         xref = p->engine.ps.pdfbytes;          xref = p->engine.ps.pdfbytes;
         ps_printf(p, "xref\n");          ps_printf(p, "xref\n");
         ps_printf(p, "0 %zu\n",          ps_printf(p, "0 %zu\n", base + 1);
                         p->engine.ps.pdfbody +  
                         (p->engine.ps.pages * 4) + 5);  
         ps_printf(p, "0000000000 65535 f\n");          ps_printf(p, "0000000000 65535 f\n");
         ps_printf(p, "trailer\n");          ps_printf(p, "trailer\n");
         ps_printf(p, "<<\n");          ps_printf(p, "<<\n");
         ps_printf(p, "/Size %zu\n",          ps_printf(p, "/Size %zu\n", base + 1);
                         p->engine.ps.pdfbody +          ps_printf(p, "/Root %zu 0 R\n", base);
                         (p->engine.ps.pages * 4) + 5);  
         ps_printf(p, "/Root %zu 0 R\n",  
                         p->engine.ps.pdfbody +  
                         (p->engine.ps.pages * 4) + 4);  
         ps_printf(p, "/Info 1 0 R\n");          ps_printf(p, "/Info 1 0 R\n");
         ps_printf(p, ">>\n");          ps_printf(p, ">>\n");
         ps_printf(p, "startxref\n");          ps_printf(p, "startxref\n");
Line 826  ps_pletter(struct termp *p, int c)
Line 814  ps_pletter(struct termp *p, int c)
                 } else {                  } else {
                         ps_printf(p, "%zu 0 obj\n",                          ps_printf(p, "%zu 0 obj\n",
                                         p->engine.ps.pdfbody +                                          p->engine.ps.pdfbody +
                                         (p->engine.ps.pages + 1) * 4);                                          p->engine.ps.pages * 4);
                         ps_printf(p, "<<\n");                          ps_printf(p, "<<\n");
                         ps_printf(p, "/Length %zu 0 R\n",                          ps_printf(p, "/Length %zu 0 R\n",
                                         p->engine.ps.pdfbody +                                          p->engine.ps.pdfbody + 1 +
                                         (p->engine.ps.pages + 1) * 4 + 1);                                          p->engine.ps.pages * 4);
                         ps_printf(p, ">>\nstream\n");                          ps_printf(p, ">>\nstream\n");
                 }                  }
                 p->engine.ps.pdflastpg = p->engine.ps.pdfbytes;                  p->engine.ps.pdflastpg = p->engine.ps.pdfbytes;

Legend:
Removed from v.1.37  
changed lines
  Added in v.1.38

CVSweb