1 /* dvipng.h */
2 
3 /************************************************************************
4 
5   Part of the dvipng distribution
6 
7   This program is free software: you can redistribute it and/or modify
8   it under the terms of the GNU Lesser General Public License as
9   published by the Free Software Foundation, either version 3 of the
10   License, or (at your option) any later version.
11 
12   This program is distributed in the hope that it will be useful, but
13   WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15   Lesser General Public License for more details.
16 
17   You should have received a copy of the GNU Lesser General Public
18   License along with this program. If not, see
19   <http://www.gnu.org/licenses/>.
20 
21   Copyright (C) 2002-2015 Jan-�ke Larsson
22 
23 ************************************************************************/
24 
25 #ifndef DVIPNG_H
26 #define DVIPNG_H
27 #include "config.h"
28 
29 #define  STRSIZE         255     /* stringsize for file specifications  */
30 
31 #define  FIRSTFNTCHAR  0
32 #define  LASTFNTCHAR   255
33 #define  NFNTCHARS     LASTFNTCHAR+1
34 
35 #define  STACK_SIZE      100     /* DVI-stack size                     */
36 
37 #define DEFAULT_GAMMA 1.0
38 
39 /* Name of the program which is called to generate missing pk files */
40 #define MAKETEXPK "mktexpk"
41 
42 #ifdef HAVE_INTTYPES_H
43 #  include <inttypes.h>
44 #else /* HAVE_INTTYPES_H */
45 # ifndef __sgi
46 /* IRIX has the following types typedef'd in sys/types.h already,
47  * i.e., _old_ IRIX systems; newer ones have a working inttypes.h */
48 typedef signed char               int8_t;
49 typedef short                    int16_t;
50 typedef int                      int32_t;
51 #endif /* ! __sgi */
52 typedef unsigned char            uint8_t;
53 typedef unsigned short          uint16_t;
54 typedef unsigned int            uint32_t;
55 typedef long long                int64_t;
56 typedef unsigned long long      uint64_t;
57 #endif /* HAVE_INTTYPES_H */
58 
59 #ifndef INT32_MIN
60 #define INT32_MIN   (-2147483647-1)
61 #endif
62 #ifndef INT32_MAX
63 #define INT32_MAX   (2147483647)
64 #endif
65 
66 #include <gd.h>
67 
68 #ifdef HAVE_KPATHSEA_KPATHSEA_H
69 # include <kpathsea/kpathsea.h>
70 #else
71 # error: kpathsea/kpathsea.h is missing from your system
72 #endif
73 
74 #ifdef HAVE_FT2
75 #include <ft2build.h>
76 #include FT_FREETYPE_H
77 #endif
78 
79 #ifdef HAVE_STDBOOL_H
80 # include <stdbool.h>
81 #else
82 # ifdef HAVE_KPATHSEA_KPATHSEA_H
83 /* boolean is an enum type from kpathsea/types.h loaded in
84    kpathsea/kpathsea.h, use it as fallback */
85 #  define bool boolean
86 # else
87 typedef int bool;
88 #  define true (bool) 1
89 #  define false (bool) 0
90 # endif
91 #endif
92 
93 #ifndef HAVE_VPRINTF
94 # ifdef HAVE_DOPRNT
95 #  define   vfprintf(stream, message, args)  _doprnt(message, args, stream)
96 # else
97 #  error: vfprintf AND _doprnt are missing!!!
98    /* If we have neither, should fall back to fprintf with fixed args.  */
99 # endif
100 #endif
101 
102 /*************************************************************/
103 /*************************  protos.h  ************************/
104 /*************************************************************/
105 
106 typedef int pixels;
107 typedef int32_t subpixels;
108 typedef int32_t dviunits;
109 
110 #define  MM_TO_PXL(x)   (int)(((x)*resolution*10)/254)
111 #define  PT_TO_PXL(x)   (int)((int32_t)((x)*resolution*100l)/7224)
112 #define  PT_TO_DVI(x)   (int32_t)((x)*65536l)
113 
114 /*#define PIXROUND(x,c) ((((double)x+(double)(c>>1))/(double)c)+0.5)*/
115 /*#define PIXROUND(x,c) (((x)+c)/(c))*/
116 /*#define PIXROUND(x,c) ((x+c-1)/(c))*/
117 /*#define PIXROUND(x,c) ((x)/(c))*/
118 /* integer round to the nearest number, not towards zero */
119 #define PIXROUND(num,den) ((num)>0 ? ((num)+(den)/2)/(den) : -(((den)/2-(num))/(den)))
120 
121 
122 /********************************************************/
123 /***********************  dvi.h  ************************/
124 /********************************************************/
125 
126 #define DVI_TYPE            0
127 struct dvi_data {    /* dvi entry */
128   int          type;            /* This is a DVI                    */
129   struct dvi_data *next;
130   uint32_t     num, den, mag;   /* PRE command parameters            */
131   int32_t      conv;            /* computed from num and den         */
132   /* divide dvi units (sp) with conv to get mf device resolution */
133   /* divide further with shrinkfactor to get true resolution */
134   char *       name;            /* full name of DVI file             */
135   char *       outname;         /* output filename (basename)        */
136   FILE *       filep;           /* file pointer                      */
137   time_t       mtime;           /* modification time                 */
138   struct font_num  *fontnump;   /* DVI font numbering                */
139   struct page_list *pagelistp;  /* DVI page list                     */
140 #define DVI_PREVIEW_LATEX_TIGHTPAGE  1
141 #define DVI_PREVIEW_BOP_HOOK         (1<<1)
142   uint32_t     flags;           /* Preview-latex flags               */
143 };
144 
145 #define PAGE_POST      INT32_MAX
146 #define PAGE_LASTPAGE  INT32_MAX-1
147 #define PAGE_MAXPAGE   INT32_MAX-2    /* assume no pages out of this range */
148 #define PAGE_FIRSTPAGE INT32_MIN
149 #define PAGE_MINPAGE   INT32_MIN+1    /* assume no pages out of this range */
150 
151 struct dvi_color {
152   int red,green,blue;
153 };
154 
155 struct page_list {
156   struct page_list* next;
157   int               offset;           /* file offset to BOP */
158   int32_t           count[11];        /* 10 dvi counters + absolute pagenum in file */
159   int               csp;              /* color stack pointer at BOP */
160   struct dvi_color  cstack[2];        /* color stack at BOP, may be longer */
161 };
162 
163 
164 
165 
166 struct dvi_data* DVIOpen(char*,char*);
167 void             DVIClose(struct dvi_data*);
168 bool             DVIReOpen(struct dvi_data*);
169 struct page_list*FindPage(struct dvi_data*, int32_t, bool);
170 struct page_list*NextPage(struct dvi_data*, struct page_list*);
171 struct page_list*PrevPage(struct dvi_data*, struct page_list*);
172 int              SeekPage(struct dvi_data*, struct page_list*);
173 bool             DVIFollowToggle(void);
174 unsigned char*   DVIGetCommand(struct dvi_data*);
175 bool             DVIIsNextPSSpecial(struct dvi_data*);
176 uint32_t         CommandLength(unsigned char*);
177 void             ClearPSHeaders(void);
178 
179 /********************************************************/
180 /**********************  misc.h  ************************/
181 /********************************************************/
182 
183 struct filemmap {
184 #ifdef WIN32
185   HANDLE hFile;
186   HANDLE hMap;
187 #else  /* WIN32 */
188   int fd;
189 #endif	/* WIN32 */
190   char* data;
191   size_t size;
192 };
193 
194 bool    DecodeArgs(int, char *[]);
195 void    DecodeString(char *);
196 bool    MmapFile (char *filename,struct filemmap *fmmap);
197 void    UnMmapFile(struct filemmap* fmmap);
198 
199 void    Message(int, const char *fmt, ...);
200 void    Warning(const char *fmt, ...);
201 void    Fatal(const char *fmt, ...);
202 
203 int32_t   SNumRead(unsigned char*, register int);
204 uint32_t   UNumRead(unsigned char*, register int);
205 
206 bool MmapFile (char *filename,struct filemmap *fmmap);
207 void UnMmapFile(struct filemmap* fmmap);
208 
209 
210 /********************************************************/
211 /***********************  font.h  ***********************/
212 /********************************************************/
213 struct encoding {
214   struct encoding* next;
215   char*            name;
216   char*            charname[257];
217 };
218 
219 struct subfont {
220   struct subfont* next;
221   char*           name;
222   char*           infix;
223   int             encoding;
224   int32_t         charindex[256];
225 };
226 
227 #ifdef HAVE_FT2
228 struct psfontmap {
229   struct psfontmap *next;
230   char *line,*psfile,*tfmname,*encname,*end;
231   struct encoding* encoding;
232   FT_Matrix* ft_transformp;
233   FT_Matrix ft_transform;
234   struct subfont* subfont;
235 };
236 #endif
237 
238 #define FONT_TYPE_PK            1
239 #define FONT_TYPE_VF            2
240 #define FONT_TYPE_FT            3
241 struct char_entry {                /* PK/FT Glyph/VF Macro                */
242   dviunits       tfmw;             /* TFM width                           */
243   unsigned char *data;             /* glyph data, either pixel data
244 				    * (0=transp, 255=max ink) or VF macro */
245   uint32_t       length;           /* Length of PK data or VF macro       */
246   /* Only used in pixel fonts */
247   pixels         w,h;              /* width and height in pixels          */
248   subpixels      xOffset, yOffset; /* x offset and y offset in subpixels  */
249   /* Only used in PK fonts */
250   unsigned char *pkdata;           /* Points to beginning of PK data      */
251   unsigned char  flag_byte;        /* PK flagbyte                         */
252 };
253 
254 struct font_entry {    /* font entry */
255   int          type;            /* PK/VF/Type1 ...                   */
256   struct font_entry *next;
257   uint32_t     c, s, d;
258   uint8_t      a, l;
259   char         n[STRSIZE];      /* FNT_DEF command parameters        */
260   int          dpi;             /* computed from s and d             */
261   char *       name;            /* full name of PK/VF file           */
262   struct filemmap fmmap;        /* file memory map                   */
263   uint32_t     magnification;   /* magnification read from font file */
264   uint32_t     designsize;      /* design size read from font file   */
265   void *       chr[NFNTCHARS];  /* character information             */
266 #ifdef HAVE_FT2
267   FT_Face      face;            /* Freetype2 face                    */
268   struct psfontmap* psfontmap;  /* Font transformation               */
269 #endif
270   struct font_num *vffontnump;  /* VF local font numbering           */
271   int32_t      defaultfont;     /* VF default font number            */
272 };
273 
274 struct font_num {    /* Font number. Different for VF/DVI, and several
275 			font_num can point to one font_entry */
276   struct font_num   *next;
277   int32_t            k;
278   struct font_entry *fontp;
279 };
280 
281 void    CheckChecksum(uint32_t, uint32_t, const char*);
282 void    InitPK (struct font_entry *newfontp);
283 void    DonePK(struct font_entry *oldfontp);
284 void    InitVF (struct font_entry *newfontp);
285 void    DoneVF(struct font_entry *oldfontp);
286 
287 void    FontDef(unsigned char*, void* /* dvi/vf */);
288 void    ClearFonts(void);
289 void    SetFntNum(int32_t, void* /* dvi/vf */);
290 void    FreeFontNumP(struct font_num *hfontnump);
291 
292 #ifdef HAVE_FT2
293 char*   copyword(char* orig);
294 struct psfontmap *NewPSFont(struct psfontmap* copyfrom);
295 void    InitPSFontMap(void);
296 void    ClearPSFontMap(void);
297 struct psfontmap* FindPSFontMap(char*);
298 struct encoding* FindEncoding(char*);
299 void    ClearEncoding(void);
300 bool    ReadTFM(struct font_entry *, char*);
301 bool    InitFT(struct font_entry *);
302 void    DoneFT(struct font_entry *tfontp);
303 void    LoadFT(int32_t, struct char_entry *);
304 struct psfontmap* FindSubFont(struct psfontmap* entry, char* fontname);
305 void    ClearSubfont(void);
306 #endif
307 
308 /********************************************************/
309 /*********************  ppagelist.h  ********************/
310 /********************************************************/
311 
312 bool    ParsePages(const char*);
313 void    FirstPage(int32_t,bool);
314 void    LastPage(int32_t,bool);
315 void    ClearPpList(void);
316 void    Reverse(bool);
317 struct page_list*   NextPPage(void* /* dvi */, struct page_list*);
318 
319 
320 
321 
322 #ifdef MAIN
323 #define EXTERN
324 #define INIT(x) =x
325 #else
326 #define EXTERN extern
327 #define INIT(x)
328 #endif
329 
330 /********************************************************/
331 /**********************  draw.h  ************************/
332 /********************************************************/
333 #include "commands.h"
334 
335 void      CreateImage(pixels width, pixels height);
336 void      DestroyImage(void);
337 void      DrawCommand(unsigned char*, void* /* dvi/vf */);
338 void      DrawPages(void);
339 void      WriteImage(char*, int);
340 void      LoadPK(int32_t, register struct char_entry *);
341 int32_t   SetChar(int32_t);
342 dviunits  SetGlyph(struct char_entry *ptr, int32_t hh,int32_t vv);
343 void      Gamma(double gamma);
344 int32_t   SetVF(struct char_entry *ptr);
345 int32_t   SetRule(int32_t, int32_t, int32_t, int32_t);
346 void      SetSpecial(char *, char *, int32_t, int32_t);
347 void      BeginVFMacro(struct font_entry*);
348 void      EndVFMacro(void);
349 
350 /**************************************************/
351 void handlepapersize(const char*,int32_t*,int32_t*);
352 
353 void stringrgb(const char* colorstring,int *r,int *g,int *b);
354 void background(const char *);
355 void initcolor(void);
356 void popcolor(void);
357 void pushcolor(const char *);
358 void resetcolorstack(const char *);
359 void StoreColorStack(struct page_list *tpagep);
360 void ReadColorStack(struct page_list *tpagep);
361 void StoreBackgroundColor(struct page_list *tpagep);
362 void ClearColorNames(void);
363 void InitXColorPrologue(const char* prologuename);
364 
365 /**********************************************************************/
366 /*************************  Global Variables  *************************/
367 /**********************************************************************/
368 
369 #ifdef MAKETEXPK
370 #ifdef HAVE_LIBKPATHSEA
371 EXTERN bool    makeTexPK INIT(MAKE_TEX_PK_BY_DEFAULT);
372 #else
373 EXTERN bool    makeTexPK INIT(_TRUE);
374 #endif
375 #endif
376 
377 EXTERN uint32_t    usermag INIT(0);     /* user specified magstep          */
378 EXTERN struct font_entry *hfontptr INIT(NULL); /* font list pointer        */
379 
380 EXTERN struct internal_state {
381   struct font_entry* currentfont;
382 } current_state;
383 
384 #define BE_NONQUIET                  1
385 #define BE_VERBOSE                   (1<<1)
386 #define PARSE_STDIN                  (1<<2)
387 #define EXPAND_BBOX                  (1<<3)
388 #define TIGHT_BBOX                   (1<<4)
389 #define FORCE_TRUECOLOR              (1<<5)
390 #define USE_FREETYPE                 (1<<6)
391 #define REPORT_HEIGHT                (1<<7)
392 #define REPORT_DEPTH                 (1<<8)
393 #define REPORT_WIDTH                 (1<<9)
394 #define DVI_PAGENUM                  (1<<10)
395 #define MODE_PICKY                   (1<<11)
396 #define GIF_OUTPUT                   (1<<12)
397 #define MODE_STRICT                  (1<<13)
398 #define NO_GHOSTSCRIPT               (1<<14)
399 #define NO_GSSAFER                   (1<<15)
400 #define BG_TRANSPARENT               (1<<16)
401 #define BG_TRANSPARENT_ALPHA         (1<<17)
402 #define FORCE_PALETTE                (1<<18)
403 #define NO_RAW_PS                    (1<<19)
404 EXTERN uint32_t option_flags INIT(BE_NONQUIET | USE_FREETYPE);
405 
406 #define PAGE_GAVE_WARN               1
407 #define PAGE_PREVIEW_BOP             (1<<1)
408 #define PAGE_TRUECOLOR               (1<<2)
409 EXTERN uint32_t page_flags INIT(0);
410 
411 
412 #ifdef DEBUG
413 EXTERN unsigned int debug INIT(0);
414 #define DEBUG_PRINT(a,b) if (debug & a) { printf b; fflush(stdout); }
415 #define DEBUG_DVI                    1
416 #define DEBUG_VF                     (1<<1)
417 #define DEBUG_PK                     (1<<2)
418 #define DEBUG_TFM                    (1<<3)
419 #define DEBUG_GLYPH                  (1<<4)
420 #define DEBUG_FT                     (1<<5)
421 #define DEBUG_ENC                    (1<<6)
422 #define DEBUG_COLOR                  (1<<7)
423 #define DEBUG_GS                     (1<<8)
424 #define LASTDEBUG                    DEBUG_GS
425 #define DEBUG_DEFAULT                DEBUG_DVI
426 #else
427 #define DEBUG_PRINT(a,b)
428 #endif
429 
430 /************************timing stuff*********************/
431 #ifdef TIMING
432 # ifdef TIME_WITH_SYS_TIME
433 #  include <sys/time.h>
434 #  include <time.h>
435 # else
436 #  ifdef HAVE_SYS_TIME_H
437 #   include <sys/time.h>
438 #  else
439 #   include <time.h>
440 #  endif
441 # endif
442 EXTERN double timer INIT(0);
443 EXTERN double my_tic,my_toc INIT(0);
444 EXTERN int      ndone INIT(0);          /* number of pages converted       */
445 # ifdef HAVE_GETTIMEOFDAY
446 EXTERN struct timeval Tp;
447 #  define TIC { gettimeofday(&Tp, NULL); \
448     my_tic= Tp.tv_sec + Tp.tv_usec/1000000.0;}
449 #  define TOC { gettimeofday(&Tp, NULL); \
450     my_toc += Tp.tv_sec + Tp.tv_usec/1000000.0 - my_tic;}
451 # else
452 #  ifdef HAVE_FTIME
453 EXTERN struct timeb timebuffer;
454 #   define TIC() { ftime(&timebuffer); \
455  my_tic= timebuffer.time + timebuffer.millitm/1000.0;
456 #   define TOC() { ftime(&timebuffer); \
457  my_toc += timebuffer.time + timebuffer.millitm/1000.0 - my_tic;}
458 #  else
459 #   define TIC()
460 #   define TOC()
461 #  endif
462 # endif
463 #endif /* TIMING */
464 
465 EXTERN char*  user_mfmode          INIT(NULL);
466 EXTERN int    user_bdpi            INIT(0);
467 EXTERN int    dpi                  INIT(100);
468 
469 #ifdef HAVE_GDIMAGEPNGEX
470 EXTERN int   compression INIT(1);
471 #endif
472 #undef min
473 #undef max
474 # define  max(x,y)       if ((y)>(x)) x = y
475 # define  min(x,y)       if ((y)<(x)) x = y
476 
477 /* These are in pixels*/
478 EXTERN  int x_min INIT(0);
479 EXTERN  int y_min INIT(0);
480 EXTERN  int x_max INIT(0);
481 EXTERN  int y_max INIT(0);
482 
483 /* Page size: default set by -T */
484 EXTERN  int x_width_def INIT(0);
485 EXTERN  int y_width_def INIT(0);
486 
487 /* Offset: default set by -O and -T bbox */
488 EXTERN  int x_offset_def INIT(0);
489 EXTERN  int y_offset_def INIT(0);
490 
491 /* Preview-latex's tightpage */
492 EXTERN  int x_width_tightpage INIT(0);
493 EXTERN  int y_width_tightpage INIT(0);
494 EXTERN  int x_offset_tightpage INIT(0);
495 EXTERN  int y_offset_tightpage INIT(0);
496 
497 /* Paper size: set by -t, for cropmark purposes only */
498 /* This has yet to be written */
499 EXTERN  int x_pwidth INIT(0);
500 EXTERN  int y_pwidth INIT(0);
501 
502 /* The transparent border preview-latex desires */
503 EXTERN  int borderwidth INIT(0);
504 
505 /* fallback color for transparent background */
506 EXTERN bool userbordercolor INIT(FALSE); /* if true, use user-supplied color */
507 EXTERN struct dvi_color bordercolor;
508 
509 
510 EXTERN gdImagePtr page_imagep INIT(NULL);
511 EXTERN int32_t shrinkfactor INIT(4);
512 
513 EXTERN struct dvi_color cstack[STACK_SIZE];
514 EXTERN int csp INIT(1);
515 
516 EXTERN struct font_entry* currentfont;
517 EXTERN struct dvi_data* dvi INIT(NULL);
518 
519 #ifdef HAVE_FT2
520 EXTERN FT_Library libfreetype INIT(NULL);
521 #endif
522 
523 #define  EXIT_FATAL    EXIT_FAILURE+1
524 EXTERN int exitcode INIT(EXIT_SUCCESS);
525 
526 #endif /* DVIPNG_H */
527