[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.30 and 1.36

version 1.30, 2010/07/04 19:57:26 version 1.36, 2010/07/21 08:24:39
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *   *
  * Permission to use, copy, modify, and distribute this software for any   * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above   * purpose with or without fee is hereby granted, provided that the above
Line 33 
Line 33 
 #include "main.h"  #include "main.h"
 #include "term.h"  #include "term.h"
   
 #define MINMARGIN_MM    20      /* Minimum 2cm margins. */  
 #define MINMARGIN_PNT   56.68  
 #define DEFPAGEX_MM     216     /* Default page size is US-letter. */  
 #define DEFPAGEY_MM     279  
   
 /* Convert PostScript point "x" to an AFM unit. */  /* Convert PostScript point "x" to an AFM unit. */
 #define PNT2AFM(p, x) /* LINTED */ \  #define PNT2AFM(p, x) /* LINTED */ \
         (size_t)((double)(x) * (1000.0 / (double)(p)->engine.ps.scale))          (size_t)((double)(x) * (1000.0 / (double)(p)->engine.ps.scale))
   
 /* Convert an AFM unit "x" to a PostScript points */  /* Convert an AFM unit "x" to a PostScript points */
 #define AFM2PNT(p, x) /* LINTED */ \  #define AFM2PNT(p, x) /* LINTED */ \
         (size_t)((double)(x) / (1000.0 / (double)(p)->engine.ps.scale))          ((double)(x) / (1000.0 / (double)(p)->engine.ps.scale))
   
 struct  glyph {  struct  glyph {
         size_t            wx; /* WX in AFM */          unsigned short    wx; /* WX in AFM */
 };  };
   
 struct  font {  struct  font {
Line 426  ps_alloc(char *outopts)
Line 421  ps_alloc(char *outopts)
   
         /* Default to US letter (millimetres). */          /* Default to US letter (millimetres). */
   
         pagex = DEFPAGEX_MM;          pagex = 216;
         pagey = DEFPAGEY_MM;          pagey = 279;
   
         /*          /*
          * The ISO-269 paper sizes can be calculated automatically, but           * The ISO-269 paper sizes can be calculated automatically, but
Line 454  ps_alloc(char *outopts)
Line 449  ps_alloc(char *outopts)
         } else if (NULL == pp)          } else if (NULL == pp)
                 pp = "letter";                  pp = "letter";
   
         /* Enforce minimum page size >= (2 times) min-margin. */  
   
         if ((2 * MINMARGIN_MM) >= pagex) {  
                 fprintf(stderr, "%s: Insufficient page width\n", pp);  
                 pagex = DEFPAGEX_MM;  
         } else if ((2 * MINMARGIN_MM >= pagey)) {  
                 fprintf(stderr, "%s: Insufficient page length\n", pp);  
                 pagey = DEFPAGEY_MM;  
         }  
   
         /*          /*
          * This MUST be defined before any PNT2AFM or AFM2PNT           * This MUST be defined before any PNT2AFM or AFM2PNT
          * calculations occur.           * calculations occur.
Line 483  ps_alloc(char *outopts)
Line 468  ps_alloc(char *outopts)
         marginy = /* LINTED */          marginy = /* LINTED */
                 (size_t)((double)pagey / 9.0);                  (size_t)((double)pagey / 9.0);
   
         lineheight = PNT2AFM(p, 16);          /* Line-height is 1.4em. */
   
           lineheight = PNT2AFM(p, ((double)p->engine.ps.scale * 1.4));
   
         p->engine.ps.width = pagex;          p->engine.ps.width = pagex;
         p->engine.ps.height = pagey;          p->engine.ps.height = pagey;
         p->engine.ps.header = pagey - (marginy / 2) - (lineheight / 2);          p->engine.ps.header = pagey - (marginy / 2) - (lineheight / 2);
Line 648  ps_begin(struct termp *p)
Line 635  ps_begin(struct termp *p)
         printf("%%%%Pages: (atend)\n");          printf("%%%%Pages: (atend)\n");
         printf("%%%%PageOrder: Ascend\n");          printf("%%%%PageOrder: Ascend\n");
         printf("%%%%DocumentMedia: Default %zu %zu 0 () ()\n",          printf("%%%%DocumentMedia: Default %zu %zu 0 () ()\n",
                         AFM2PNT(p, p->engine.ps.width),                          (size_t)AFM2PNT(p, p->engine.ps.width),
                         AFM2PNT(p, p->engine.ps.height));                          (size_t)AFM2PNT(p, p->engine.ps.height));
         printf("%%%%DocumentNeededResources: font");          printf("%%%%DocumentNeededResources: font");
         for (i = 0; i < (int)TERMFONT__MAX; i++)          for (i = 0; i < (int)TERMFONT__MAX; i++)
                 printf(" %s", fonts[i].name);                  printf(" %s", fonts[i].name);
         printf("\n%%%%EndComments\n");          printf("\n%%%%EndComments\n");
   
         printf("%%%%Page: %zu %zu\n",  
                         p->engine.ps.pages + 1,  
                         p->engine.ps.pages + 1);  
   
         ps_setfont(p, TERMFONT_NONE);  
         p->engine.ps.pscol = p->engine.ps.left;          p->engine.ps.pscol = p->engine.ps.left;
         p->engine.ps.psrow = p->engine.ps.top;          p->engine.ps.psrow = p->engine.ps.top;
         p->engine.ps.flags |= PS_NEWPAGE;          p->engine.ps.flags |= PS_NEWPAGE;
           ps_setfont(p, TERMFONT_NONE);
 }  }
   
   
Line 670  static void
Line 653  static void
 ps_pletter(struct termp *p, int c)  ps_pletter(struct termp *p, int c)
 {  {
         int              f;          int              f;
   
         /*          /*
          * If we're not in a PostScript "word" context, then open one           * If we haven't opened a page context, then output that we're
          * now at the current cursor.           * in a new page and make sure the font is correctly set.
          */           */
   
         if (PS_NEWPAGE & p->engine.ps.flags)          if (PS_NEWPAGE & p->engine.ps.flags) {
                 printf("%%%%Page: %zu %zu\n",                  printf("%%%%Page: %zu %zu\n",
                                 p->engine.ps.pages + 1,                                  p->engine.ps.pages + 1,
                                 p->engine.ps.pages + 1);                                  p->engine.ps.pages + 1);
                   ps_printf(p, "/%s %zu selectfont\n",
                                   fonts[(int)p->engine.ps.lastf].name,
                                   p->engine.ps.scale);
                   p->engine.ps.flags &= ~PS_NEWPAGE;
           }
   
           /*
            * If we're not in a PostScript "word" context, then open one
            * now at the current cursor.
            */
   
         if ( ! (PS_INLINE & p->engine.ps.flags)) {          if ( ! (PS_INLINE & p->engine.ps.flags)) {
                 ps_printf(p, "%zu %zu moveto\n(",                  ps_printf(p, "%.3f %.3f moveto\n(",
                                 AFM2PNT(p, p->engine.ps.pscol),                                  AFM2PNT(p, p->engine.ps.pscol),
                                 AFM2PNT(p, p->engine.ps.psrow));                                  AFM2PNT(p, p->engine.ps.psrow));
                 p->engine.ps.flags |= PS_INLINE;                  p->engine.ps.flags |= PS_INLINE;
                 p->engine.ps.flags &= ~PS_NEWPAGE;  
         }          }
   
         assert( ! (PS_NEWPAGE & p->engine.ps.flags));          assert( ! (PS_NEWPAGE & p->engine.ps.flags));
Line 716  ps_pletter(struct termp *p, int c)
Line 708  ps_pletter(struct termp *p, int c)
   
         if (c <= 32 || (c - 32 > MAXCHAR)) {          if (c <= 32 || (c - 32 > MAXCHAR)) {
                 ps_putchar(p, ' ');                  ps_putchar(p, ' ');
                 p->engine.ps.pscol += fonts[f].gly[0].wx;                  p->engine.ps.pscol += (size_t)fonts[f].gly[0].wx;
                 return;                  return;
         }          }
   
         ps_putchar(p, (char)c);          ps_putchar(p, (char)c);
         c -= 32;          c -= 32;
         p->engine.ps.pscol += fonts[f].gly[c].wx;          p->engine.ps.pscol += (size_t)fonts[f].gly[c].wx;
 }  }
   
   
Line 888  ps_setfont(struct termp *p, enum termfont f)
Line 880  ps_setfont(struct termp *p, enum termfont f)
 {  {
   
         assert(f < TERMFONT__MAX);          assert(f < TERMFONT__MAX);
           p->engine.ps.lastf = f;
   
           /*
            * If we're still at the top of the page, let the font-setting
            * be delayed until we actually have stuff to print.
            */
   
           if (PS_NEWPAGE & p->engine.ps.flags)
                   return;
   
         ps_printf(p, "/%s %zu selectfont\n",          ps_printf(p, "/%s %zu selectfont\n",
                         fonts[(int)f].name, p->engine.ps.scale);                          fonts[(int)f].name, p->engine.ps.scale);
         p->engine.ps.lastf = f;  
 }  }
   
   
Line 900  ps_width(const struct termp *p, char c)
Line 901  ps_width(const struct termp *p, char c)
 {  {
   
         if (c <= 32 || c - 32 >= MAXCHAR)          if (c <= 32 || c - 32 >= MAXCHAR)
                 return(fonts[(int)TERMFONT_NONE].gly[0].wx);                  return((size_t)fonts[(int)TERMFONT_NONE].gly[0].wx);
   
         c -= 32;          c -= 32;
         return(fonts[(int)TERMFONT_NONE].gly[(int)c].wx);          return((size_t)fonts[(int)TERMFONT_NONE].gly[(int)c].wx);
 }  }
   
   
Line 931  ps_hspan(const struct termp *p, const struct roffsu *s
Line 932  ps_hspan(const struct termp *p, const struct roffsu *s
                 r = PNT2AFM(p, su->scale * 100);                  r = PNT2AFM(p, su->scale * 100);
                 break;                  break;
         case (SCALE_EM):          case (SCALE_EM):
                 r = su->scale *                  r = su->scale *
                         fonts[(int)TERMFONT_NONE].gly[109 - 32].wx;                          fonts[(int)TERMFONT_NONE].gly[109 - 32].wx;
                 break;                  break;
         case (SCALE_MM):          case (SCALE_MM):
                 r = PNT2AFM(p, su->scale * 2.834);                  r = PNT2AFM(p, su->scale * 2.834);
                 break;                  break;
         case (SCALE_EN):          case (SCALE_EN):
                 r = su->scale *                  r = su->scale *
                         fonts[(int)TERMFONT_NONE].gly[110 - 32].wx;                          fonts[(int)TERMFONT_NONE].gly[110 - 32].wx;
                 break;                  break;
         case (SCALE_VS):          case (SCALE_VS):

Legend:
Removed from v.1.30  
changed lines
  Added in v.1.36

CVSweb