
#ifndef BMEPSI_H_INCLUDED
#define BMEPSI_H_INCLUDED 1

#ifndef SYSCONFDIR
#define SYSCONFDIR "/etc"
#endif

#ifndef GROUPNAME
#define GROUPNAME "dvips"
#endif

#include <dk.h>

#if DK_HAVE_ZLIB_H
#include <zlib.h>
#if DK_HAVE_PNG_H
#include <png.h>
#endif
#endif
#if DK_HAVE_JPEGLIB_H
#include <jpeglib.h>
#endif
#if DK_HAVE_PNM_H
#include <pnm.h>
#endif
#if DK_HAVE_TIFF_H
#include <tiff.h>
#include <tiffio.h>
#endif

#include <stdio.h>
#if DK_HAVE_STDLIB_H
#include <stdlib.h>
#endif
#if DK_HAVE_UNISTD_H
#include <unistd.h>
#endif
#if DK_HAVE_MATH_H
#include <math.h>
#endif
#if DK_HAVE_STRING_H
#include <string.h>
#else
#if DK_HAVE_STRINGS_H
#include <strings.h>
#endif
#endif

#include <dkerror.h>
#include <dklogc.h>
#include <dkstr.h>
#include <dkmem.h>
#include <dkapp.h>
#include <dksto.h>
#include <dklic.h>
#include <dksf.h>
#include <dkstream.h>
#include <dkof.h>
#include <dkbifi.h>
#include <dkbif.h>
#include <dkcp.h>


typedef struct {
  unsigned long objno;	/* object number */
  unsigned long pos;	/* byte position in file */
} PDFOBJPOS;

/*
  draft info
*/
typedef struct {
  double d;
  double deltax;
  double deltay;
} DI;


typedef struct {
  double	px0;
  double	py0;
  double	px1;
  double	py1;
  double	bx0;
  double	by0;
  double	bx1;
  double	by1;
} MEDIASIZE;

typedef struct {
  char		*name;
  MEDIASIZE	ms;
} MSENTRY;

/*
  bmeps options
*/
typedef struct {
  int		ot;	/* output type BMEPS_OUTPUT_TYPE... */
  int		l;	/* EPS/PDF level */
  int		enc;	/* encodings BMEPS_ENCODING... */
  dk_bif_sof_t	jfif_s;	/* allowed JFIF SOF types */
  unsigned long	opt;	/* options */
  unsigned long pdfopt;	/* PDF-specific options */
  double	dbgr;	/* default background red */
  double	dbgg;	/* default background green */
  double	dbgb;	/* default background blue */
  double	mtl;	/* image mask trigger level */
  MEDIASIZE	ms;
} BO;

typedef struct {
	char	*n;	/* case-insensitive name */
	BO	*bo;
} BOENTRY;

/*
	bmeps job
*/
typedef struct {
  /*
  	used from b2dvips module
  */
  BO		*bo;
  BO		*bo2;
  dk_stream_t	*os;		/* output stream, writes to outf */
  FILE		*outf;		/* output file */
  FILE		*inf;		/* input file */
  char		*infname;	/* input file name */
  dk_app_t	*a;		
  long		frame_s;	/* start/end frame */
  long		frame_e;	/* -1=all frames, 0=first, 1=second... */
  long		frame_n;	/* number of frames */
  char		*tmp1;		/* temporary file to save standard input */
  char		*tmp2;		/* used to build page graphics instructions */
  char		*tmp3;		/* used to build image data stream (red/gray) */
  char		*tmp4;		/* ... green */
  char		*tmp5;		/* ... blue */
  char		*tmp6;		/* used to build alpha/mask data stream */
  char		*tmp7;		/* used for temporary copy of TIFF file */
  dk_bif_t	*bif;
  dk_storage_t	*pdfobjs;	/* PDF object positions */
  dk_storage_iterator_t	*pdfobjsi;	/* iterator */
  unsigned long	 nexto;		/* next object */
  unsigned long	 psp;		/* pages start position */
  unsigned long	 olo;		/* outlines object number */
  /*
  	used from bmeps application
	(and possibly the b2dvips module)
  */
  int		it;		/* image type */
  char		**msg;		/* Messages, the program prints */
  int		exval;
  int		cmd;
  char		*i1;		/* input file name from argv */
  char		*o1;		/* output file name from argv */
  char		*lang;		/* language from argv */
  unsigned char	mm;		/* make mode */
  unsigned char frame_c;	/* number of frames configured */
  struct {
    int must_rotate;
    int must_scale;
    double	sfx;	/* scale factor for x */
    double	sfy;	/* scale factor for y */
      struct {		/* specified by paper size */
        double x0;
        double y0;
        double x1;
        double y1;
      } hrbb;
      struct {		/* image area available */
        double x0;
        double y0;
        double x1;
        double y1;
      } ia;
      struct {		/* image area really used */
        double x0;
        double y0;
        double x1;
        double y1;
      } iu;
      struct {		/* bounding box */
        long x0;
        long y0;
        long x1;
        long y1;
      } bb;
  } trans;
  int	me;	/* math error */
  unsigned char	af;
  unsigned char alpha_channel_transferred;
  unsigned char suppress_alpha_info;
} BJ;

typedef struct {
  unsigned long number;
  char *contents;
} OPTENTRY;

typedef struct {
  int t;
  char *s;
} INPUTTYPEENTRY;

typedef char *PCHAR;



#define BMEPS_OUTPUT_TYPE_EPS	0
#define BMEPS_OUTPUT_TYPE_PDF	1
#define BMEPS_OUTPUT_TYPE_BB	2

#define BMEPS_ENCODING_ASCII85		1
#define BMEPS_ENCODING_RUNLENGTH	2
#define BMEPS_ENCODING_DCT		4
#define BMEPS_ENCODING_FLATE		16

#define BMEPS_PS_LEVEL_1		1
#define BMEPS_PS_LEVEL_2		2
#define BMEPS_PS_LEVEL_3		3

#define BMEPS_PDF_LEVEL_12		11
#define BMEPS_PDF_LEVEL_13		12
#define BMEPS_PDF_LEVEL_14		13

#define BMEPS_OPT_OPERATOR_DICTIONARY	1UL
#define BMEPS_OPT_SEPARATED_DATA	2UL
#define BMEPS_OPT_COLOR_OUTPUT		4UL
#define BMEPS_OPT_ALPHA_MIX		8UL
#define BMEPS_OPT_PREFER_SPEC_BG	16UL
#define BMEPS_OPT_IMAGE_MASK		32UL
#define BMEPS_OPT_DSC			64UL
#define BMEPS_OPT_SHOWPAGE		128UL
#define BMEPS_OPT_RESOLUTION		256UL
#define BMEPS_OPT_DICTIONARY		512UL
#define BMEPS_OPT_VMRECLAIM		1024UL
#define BMEPS_OPT_TRANSFER_ALPHA	2048UL
#define BMEPS_OPT_PAPER_SIZE		4096UL
#define BMEPS_OPT_DRAFT			8192UL
#define BMEPS_OPT_INTERPOLATE		16384UL
#define BMEPS_OPT_JPEG_INTERPOLATE	32768UL


#define BMEPS_PDFOPT_FIT_WIDTH			1UL
#define BMEPS_PDFOPT_FIT_HEIGHT			2UL
#define BMEPS_PDFOPT_FIT_PAGE	(BMEPS_PDFOPT_FIT_WIDTH | BMEPS_PDFOPT_FIT_HEIGHT)
#define BMEPS_PDFOPT_FIT_MASK	(BMEPS_PDFOPT_FIT_WIDTH | BMEPS_PDFOPT_FIT_HEIGHT)
#define BMEPS_PDFOPT_ALLOW_PDF_PAGE_ATTRIBUTES	4UL

#define BMEPS_CMD_RUN			0
#define BMEPS_CMD_HELP			1
#define BMEPS_CMD_VERSION		2
#define BMEPS_CMD_CONFIGURE		4
#define BMEPS_CMD_UNCONFIGURE		8
#define BMEPS_CMD_SHOWCONF		16
#define BMEPS_CMD_ERROR			32
#define BMEPS_CMD_CONFIGURATION_FILE	64
#define BMEPS_CMD_WRITE_CONFIGURATION_FILE	128

#define BMEPS_CMD_APP (BMEPS_CMD_HELP\
|BMEPS_CMD_VERSION\
|BMEPS_CMD_CONFIGURE\
|BMEPS_CMD_UNCONFIGURE\
|BMEPS_CMD_SHOWCONF\
|BMEPS_CMD_CONFIGURATION_FILE\
|BMEPS_CMD_WRITE_CONFIGURATION_FILE\
)

#ifdef EXTERN
#undef EXTERN
#endif

/* b2bj module */
#if B2BJ_C
#define EXTERN /* nix */
#else
#if DK_HAVE_PROTOTYPES
#define EXTERN /* nix */
#else
#define EXTERN extern
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
EXTERN void
bmeps_bo_get_defaults DK_PR((BO *bo));
EXTERN void
bmeps_bj_init DK_PR((BJ *bj));
EXTERN int
bmeps_bo_add_line DK_PR((BJ *bj, BO *bo, char *s));
#ifdef __cplusplus
}
#endif

/* b2dc module */
#if B2DC_C
#define EXTERN /* nix */
#else
#if DK_HAVE_PROTOTYPES
#define EXTERN /* nix */
#else
#define EXTERN extern
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif


/* b2bo module */
#if B2BO_C
#define EXTERN /* nix */
#else
#if DK_HAVE_PROTOTYPES
#define EXTERN /* nix */
#else
#define EXTERN extern
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
EXTERN void bmeps_bo_get_configuration DK_PR((BJ *bj, char *langdef));
EXTERN int bmeps_bo_get_pref_lang DK_PR((BJ *bj, char *buffer, size_t sz));
EXTERN int bmeps_bo_show_configuration_file DK_PR((BJ *bj));
EXTERN int bmeps_bo_write_configuration_file DK_PR((BJ *bj));
#ifdef __cplusplus
}
#endif

/* b2str module */
#if B2STR_C
#define EXTERN /* nix */
#else
#if DK_HAVE_PROTOTYPES
#define EXTERN /* nix */
#else
#define EXTERN extern
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
EXTERN char *bmeps_str_get DK_PR((size_t s));
EXTERN size_t bmeps_get_num DK_PR((void));
EXTERN char **bmeps_str_base DK_PR((void));
#ifdef __cplusplus
}
#endif


/* b2conv module */
#if B2CONV_C
#define EXTERN /* nix */
#else
#if DK_HAVE_PROTOTYPES
#define EXTERN /* nix */
#else
#define EXTERN extern
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
EXTERN void bmeps_convert DK_PR((BJ *bj));
#ifdef __cplusplus
}
#endif



/* b2eps module */
#if B2EPS_C
#define EXTERN /* nix */
#else
#if DK_HAVE_PROTOTYPES
#define EXTERN /* nix */
#else
#define EXTERN extern
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
EXTERN void
bmeps_eps_conventional DK_PR((BJ *bj));
EXTERN void
bmeps_eps_dct DK_PR((BJ *bj));
EXTERN void
bmeps_eps_draft DK_PR((BJ *bj));
EXTERN void
bmeps_eps_bb DK_PR((BJ *bj));
#ifdef __cplusplus
}
#endif

/* b2eps module */
#if B2EPS_C
#define EXTERN /* nix */
#else
#if DK_HAVE_PROTOTYPES
#define EXTERN /* nix */
#else
#define EXTERN extern
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
EXTERN void
bmeps_pdf DK_PR((BJ *bj, int how));
#ifdef __cplusplus
}
#endif


/* b2tool1 module */
#if B2TOOL1_C
#define EXTERN /* nix */
#else
#if DK_HAVE_PROTOTYPES
#define EXTERN /* nix */
#else
#define EXTERN extern
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
EXTERN int
bmeps_tool_how_to_handle_bb DK_PR((BJ *bj));
EXTERN unsigned short
bmeps_tool_eps_output_bits DK_PR((unsigned short b));
EXTERN unsigned short
bmeps_tool_pdf_output_bits DK_PR((unsigned short b));
EXTERN void
bmeps_tool_correct_bo DK_PR((BO *bo));
EXTERN int
bmeps_tool_interpolate DK_PR((BJ *bj));
EXTERN char *
bmeps_tool_suffix_for_output_type DK_PR((int t));
EXTERN int
bmeps_tool_calc_di DK_PR((BJ *bj, DI *d1, DI *d2, double f1, double f2));
EXTERN void
bmeps_tool_calculate_areas DK_PR((BJ *bj));
EXTERN void
bmeps_tool_error_memory DK_PR((BJ *bj));
EXTERN void
bmeps_tool_msg_1 DK_PR((BJ *bj, int ll, size_t n));
EXTERN void
bmeps_tool_msg_3 DK_PR((BJ *bj, int ll, size_t n1, size_t n2, char *s));
EXTERN void
bmeps_tool_msg_5 DK_PR((BJ *bj, int ll, size_t n1, size_t n2, size_t n3, char *s1, char *s2));
#ifdef __cplusplus
}
#endif



#define NAME_BUFFER_SIZE	128
#define CONFIG_LINE_SIZE	1024
#define DPI_EPSILON		0.00001

#endif
/* BMEPS_H_INCLUDED */

