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