#define B2PDF_C		1
#include "bmepsi.h"
#include "bmeps.h"

#line 4 "b2pdf.ctr"





static char *kw[] = {
  /*  0 */	"\r\n",
  /*  1 */	" ",
  /*  2 */	"%PDF-",
  /*  3 */	"1.2",
  /*  4 */	"1.3",
  /*  5 */	"1.4",
  /*  6 */	"<<",
  /*  7 */	">>",
  /*  8 */	"obj",
  /*  9 */	"endobj",
  /* 10 */	"[",
  /* 11 */	"]",
  /* 12 */	"xref",
  /* 13 */	"trailer",
  /* 14 */	"startxref",
  /* 15 */	"%%EOF",
  /* 16 */	"0000000000 65535 f",
  /* 17 */	"%010lu 00000 n",
  /* 18 */	"/Size",
  /* 19 */	"/Info 1 0 R /Root 2 0 R",
  /* 20 */	"/Producer (bmeps)",
  /* 21 */	"/Type /Catalog",
  /* 22 */	"/Pages",
  /* 23 */	"R",
  /* 24 */	"/Type /Pages",
  /* 25 */	"/Count",
  /* 26 */	"/Kids",
  /* 27 */	"/Type /Page",
  /* 28 */	"/MediaBox",
  /* 29 */	"/Parent",
  /* 30 */	"/Resources",
  /* 31 */	"/ProcSet",
  /* 32 */	"/XObject",
  /* 33 */	"/PDF",
  /* 34 */	"/ImageC",
  /* 35 */	"/ImageB",
  /* 36 */	"/Contents",
  /* 37 */	"/X",
  /* 38 */	"/Length",
  /* 39 */	"stream",
  /* 40 */	"endstream",
  /* 41 */	"/ASCIIHexDecode",
  /* 42 */	"/ASCII85Decode",
  /* 43 */	"/LZWDecode",		/* reserved for future use */
  /* 44 */	"/FlateDecode",
  /* 45 */	"/RunLengthDecode",
  /* 46 */	"/DCTDecode",
  /* 47 */	"/Type /XObject",
  /* 48 */	"/Subtype /Image",
  /* 49 */	"/Width",
  /* 50 */	"/Height",
  /* 51 */	"/ColorSpace",
  /* 52 */	"/DeviceRGB",
  /* 53 */	"/DeviceGray",
  /* 54 */	"/DeviceCMYK",
  /* 55 */	"/BitsPerComponent",
  /* 56 */	"/Length",
  /* 57 */	"/Filter",
  /* 58 */	"/Interpolate",
  /* 59 */	"true",
  /* 60 */	"false",
  /* 61 */	"/SMask",
  /* 62 */	"/Mask",
  /* 63 */	"/OpenAction",
  /* 64 */	"/Fit",
  /* 65 */	"/FitH",
  /* 66 */	"/FitV 0",
  /* 67 */	"q",
  /* 68 */	"Q",
  /* 69 */	"g",	/* gray for fill operations */
  /* 70 */	"rg",	/* set rgb for fill operations */
  /* 71 */	"m",	/* start path and moveto */
  /* 72 */	"l",	/* lineto */
  /* 73 */	"h",	/* closepath */
  /* 74 */	"f",	/* fill */
  /* 75 */	"re",	/* rectangle */
  /* 76 */	"/Type /Outlines",
  /* 77 */	"/First",
  /* 78 */	"/Last",
  /* 79 */	"/Title",
  /* 80 */	"/Prev",
  /* 81 */	"/Next",
  /* 82 */	"/Dest",
  /* 83 */	"(",
  /* 84 */	")",
  /* 85 */	"/Outlines",
  /* 86 */	"/Decode [1 0 1 0 1 0 1 0]",
  /* 87 */	"/Group <</S /Transparency /I true /CS /DeviceRGB>>",

  NULL
};
static size_t sz_kw = sizeof(kw)/sizeof(PCHAR);



#define pdf_open_dictionary(bj) kw_out(bj, 6)
#define pdf_close_dictionary(bj) kw_out(bj, 7)


static
void
kw_out DK_P2(BJ *,bj, size_t,i)
{
  if(i < sz_kw) {
    if(bj) {
      if(bj->os) {
        dkstream_puts(bj->os, kw[i]);
      }
    }
  }
}



static
void
pdf_write_reference DK_P2(BJ *,bj, unsigned long,n)
{
  dkstream_puts_ul(bj->os, n);
  kw_out(bj, 1);
  dkstream_puts_ul(bj->os, 0UL);
  kw_out(bj, 1);
  kw_out(bj, 23);
}



static
int
pdf_begin_object DK_P2(BJ *,bj, unsigned long,objno)
{
  int back = 0;
  PDFOBJPOS *pop;
  pop = dk_new(PDFOBJPOS,1);
  if(pop) {
    pop->objno = objno;
    pop->pos = dkstream_get_bytes_written(bj->os);
    if(dksto_add(bj->pdfobjs, (void *)pop)) {
      dkstream_puts_ul(bj->os, objno);
      kw_out(bj, 1);
      dkstream_puts_ul(bj->os, 0UL);
      kw_out(bj, 1); kw_out(bj, 8); kw_out(bj, 0);
      back = 1;
    } else {
      bmeps_tool_error_memory(bj); bj->exval = 1;
    }
  } else {
    bmeps_tool_error_memory(bj); bj->exval = 1;
  }
  return back;
}



static
void
pdf_end_object DK_P1(BJ *,bj)
{
  kw_out(bj, 9); kw_out(bj, 0);
}



static
int
compare_obj_pos DK_P3(void *,l, void *,r, int,cr)
{
  int back = 0;
  PDFOBJPOS *ptrl, *ptrr;
  unsigned long *ulptr;
  if(l) {
    if(r) {
      ptrl = (PDFOBJPOS *)l; ptrr = (PDFOBJPOS *)r;
      ulptr = (unsigned long *)r;
      switch(cr) {
        case 1: {
	  if(ptrl->objno > *ulptr) back = 1;
	  else {
	    if(ptrl->objno < *ulptr) back = -1;
	  }
	} break;
	default: {
          if(ptrl->objno > ptrr->objno) back = 1;
          else {
            if(ptrl->objno < ptrr->objno) back = -1;
          }
	} break;
      }
    } else  back = 1;
  } else {
    if(r) back = -1;
  }
  return back;
}


static
void
pdf_file_start DK_P2(BJ *,bj, int,how)
{
  long i = 0;
  dkbif_set_frame(bj->bif, bj->frame_s);
  bmeps_tool_calculate_areas(bj);
  kw_out(bj, 2);
  switch((bj->bo)->l) {
    case BMEPS_PDF_LEVEL_12: { kw_out(bj, 3); } break;
    case BMEPS_PDF_LEVEL_13: { kw_out(bj, 4); } break;
    default: { kw_out(bj, 5); } break;
  }
  kw_out(bj, 0);
  i += pdf_begin_object(bj, bj->nexto);
  bj->nexto += 1UL;
  pdf_open_dictionary(bj); kw_out(bj, 0);
  kw_out(bj, 20); kw_out(bj, 0);
  pdf_close_dictionary(bj); kw_out(bj, 0);
  pdf_end_object(bj);
  i += pdf_begin_object(bj, bj->nexto); bj->nexto += 1UL;
  bj->psp = bj->nexto;
  pdf_open_dictionary(bj); kw_out(bj, 0);
  kw_out(bj, 21); kw_out(bj, 0);
  if(bj->frame_e > bj->frame_s) {
    /* reserve object numbers for outline */
    kw_out(bj, 85); kw_out(bj, 1);
    bj->olo = bj->nexto;
    pdf_write_reference(bj, bj->olo); kw_out(bj, 0);
    bj->psp += (1UL + bj->frame_n);
  }
  
  kw_out(bj, 22); kw_out(bj, 1);
  dkstream_puts_ul(bj->os, bj->psp);
  kw_out(bj, 1);
  dkstream_puts_ul(bj->os, 0UL); kw_out(bj, 1);
  kw_out(bj, 23); kw_out(bj, 0);
  if((bj->bo)->pdfopt & BMEPS_PDFOPT_FIT_MASK) {
    kw_out(bj, 63); kw_out(bj, 1); kw_out(bj, 10); kw_out(bj, 1);
    pdf_write_reference(bj, (bj->psp + 1UL)); kw_out(bj, 1);
    switch((int)((bj->bo)->pdfopt & BMEPS_PDFOPT_FIT_MASK)) {
      case (int)BMEPS_PDFOPT_FIT_WIDTH: {
        kw_out(bj, 65); kw_out(bj, 1);
	dkstream_puts_ul(bj->os, (bj->trans).bb.y1);
      } break;
      case (int)BMEPS_PDFOPT_FIT_HEIGHT: {
        kw_out(bj, 66);
      } break;
      case (int)BMEPS_PDFOPT_FIT_PAGE: {
        kw_out(bj, 64);
      } break;
    }
    kw_out(bj, 1); kw_out(bj, 11); kw_out(bj, 0);
  }
  pdf_close_dictionary(bj); kw_out(bj, 0);
  pdf_end_object(bj);
  if(bj->frame_e > bj->frame_s) {
    /* create outline objects */
    pdf_begin_object(bj, bj->nexto); bj->nexto += 1UL;
    pdf_open_dictionary(bj); kw_out(bj, 0);
    kw_out(bj, 76); kw_out(bj, 0);
    kw_out(bj, 77); kw_out(bj, 1);
    pdf_write_reference(bj, bj->nexto); kw_out(bj, 0);
    kw_out(bj, 78); kw_out(bj, 1);
    pdf_write_reference(bj, (bj->nexto + bj->frame_n - 1UL)); kw_out(bj, 0);
    pdf_close_dictionary(bj); kw_out(bj, 0);
    pdf_end_object(bj);
    for(i = 0UL; i < bj->frame_n; i++) {
      dkbif_set_frame(bj->bif, (bj->frame_s + i));
      bmeps_tool_calculate_areas(bj);
      pdf_begin_object(bj, bj->nexto); bj->nexto += 1UL;
      pdf_open_dictionary(bj); kw_out(bj, 0);
      kw_out(bj, 79); kw_out(bj, 1);
      kw_out(bj, 83);
      dkstream_puts_ul(bj->os, i+1UL);
      kw_out(bj, 84); kw_out(bj, 0);
      kw_out(bj, 29); kw_out(bj, 1);
      pdf_write_reference(bj, bj->olo); kw_out(bj, 0);
      if(i != 0UL) {
        kw_out(bj, 80); kw_out(bj, 1);
	pdf_write_reference(bj, (bj->nexto - 2UL));
	kw_out(bj, 0);
      }
      if(i != (bj->frame_n - 1L)) {
        kw_out(bj, 81); kw_out(bj, 1);
	pdf_write_reference(bj, bj->nexto);
	kw_out(bj, 0);
      }
      kw_out(bj, 82); kw_out(bj, 1);
      kw_out(bj, 10);
      pdf_write_reference(bj, (bj->psp + 1UL + i));
      kw_out(bj, 65); kw_out(bj, 1);
      dkstream_puts_ul(bj->os, (bj->trans).bb.y1);
      kw_out(bj, 11); kw_out(bj, 0);
      pdf_close_dictionary(bj); kw_out(bj, 0);
      pdf_end_object(bj);
    }
    /* set object number to start pages */
    bj->nexto = bj->psp;
  }
  i += pdf_begin_object(bj, bj->nexto); bj->nexto += 1UL;
  pdf_open_dictionary(bj); kw_out(bj, 0);
  kw_out(bj, 24); kw_out(bj, 0);
  kw_out(bj, 25); kw_out(bj, 1);
  dkstream_puts_ul(bj->os, bj->frame_n); kw_out(bj, 0);
  kw_out(bj, 26); kw_out(bj, 1);
  kw_out(bj, 10); kw_out(bj, 0);
  for(i = 0; i < bj->frame_n; i++) {
    dkstream_puts_ul(bj->os, (bj->nexto + i));
    kw_out(bj, 1);
    dkstream_puts_ul(bj->os, 0UL); kw_out(bj, 1);
    kw_out(bj, 23); kw_out(bj, 0);
  }
  kw_out(bj, 11); kw_out(bj, 0);
  pdf_close_dictionary(bj); kw_out(bj, 0);
  pdf_end_object(bj);
}



static
void
transfer_entire_file DK_P3(BJ *,bj, dk_stream_t *,os, FILE *,f)
{
  char buffer[512];
  size_t bs, bu, br;
  int cc = 0, write_error = 0;
  
  bs = sizeof(buffer);
  cc = 1;
  while(cc) {
    br = fread(buffer,1,sizeof(buffer),f);
    if(br > 0) {
      bu = dkstream_write(os, buffer, br);
      if(bu < br) {
	cc = 0; write_error = 1;
      }
    } else {
      cc = 0;
    }
  }
  if(write_error) {
    bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 53);
    bj->exval = 1;
  }
  
}



static
void
transfer_file_to_stream DK_P3(dk_stream_t *,os, FILE *,f, unsigned long,fs)
{
  char buffer[512];
  size_t bs, bu, br;
  unsigned long bytes_to_handle;
  int cc;
  
  bs = sizeof(buffer); cc = 1; bytes_to_handle = fs;
  while(cc) {
    if(bytes_to_handle > 0UL) {
      if(bytes_to_handle >= (unsigned long)bs) {
        bu = bs;
      } else {
        bu = (size_t)bytes_to_handle;
      }
      br = fread(buffer, 1, bu, f);
      if(br > 0) {
        dkstream_write(os, buffer, br);
	bytes_to_handle -= (unsigned long)br;
      } else {
        cc = 0;
      }
    } else {
      cc = 0;
    }
  }
  
}



static
void
pdf_file_objects_normally DK_P1(BJ *,bj)
{
  unsigned char use_mask_or_alpha;	/* flag to indicate mask/alpha usage */
  unsigned short bpcs;			/* bits per component */
  unsigned long bpc;			/* also bits per component */
  unsigned char c;			/* one byte of output for 8-bit input */
  unsigned long psp;			/* pages start position (object number) */
  unsigned long csp;			/* contents start position (object number) */
  unsigned long xsp;			/* xobjects start position (object number) */
  unsigned long i;			/* */
  unsigned long w;			/* width of output image */
  unsigned long h;			/* height of output image */
  unsigned long origw;			/* width of input image */
  unsigned long origh;			/* height of input image */
  unsigned long filesize;		/* file size of temporary file */
  unsigned long x;			/* x position of source pixel */
  unsigned long y;			/* y position of source pixel */
  unsigned long iy;			/* y position of destination pixel */
  unsigned long j;			/* x position of destination pixel */
  long fno;				/* number of current frame */
  dk_stat_t stbuf;			/* stat buffer to obtain file info */
  int number_of_filters = 0;		/* number of filters for encoding */
  int ch = 0;				/* number of channels in input file */
  int dummy = 0;			/* dummy variable for fopen failure */
  int data_ok = 0;			/* indicate output data file ok */
  int mask_ok = 0;			/* indicate mask data file ok */
  dk_stream_t *ofs1 = NULL;		/* unfiltered output stream */
  dk_stream_t *ofs2 = NULL;		/* filter output stream */
  dk_bitshift_t *obs = NULL;		/* output bit shifter */
  FILE *gfile = NULL;			/* temporary file */
  size_t nf;				/* number of next filter cell to set */
  
  fno = bj->frame_s;
  psp = bj->nexto;
  csp = psp + bj->frame_n;
  xsp = csp + bj->frame_n;
  i = 0UL;
  bj->nexto = xsp + bj->frame_n;
  while(fno <= bj->frame_e) {
    
    use_mask_or_alpha = 0x00;
    dkmem_cpy(bj->bo2, bj->bo, sizeof(BO));
    
    if(dkbif_set_frame(bj->bif, fno)) {
      
      data_ok = 0; mask_ok = 0;
      bmeps_tool_calculate_areas(bj);
      
      origw = w = dkbif_get_width(bj->bif);
      origh = h = dkbif_get_height(bj->bif);
      if((bj->trans).must_rotate) {
        w = origh; h = origw;
      }
      bpcs = dkbif_get_bits_per_component(bj->bif);
      bpcs = bmeps_tool_pdf_output_bits(bpcs);
      bpc  = (unsigned long)bpcs;
      switch(dkbif_get_channels(bj->bif)) {
        case 1: case 2: {
	  (bj->bo2)->opt &= (~(BMEPS_OPT_COLOR_OUTPUT));
	} break;
      }
      dkbif_set_bits_per_component(bj->bif, bpcs);
      
      switch(dkbif_get_channels(bj->bif)) {
        case 2: case 4: {	
	  if((bj->bo2)->opt & BMEPS_OPT_TRANSFER_ALPHA) {
	    
	    use_mask_or_alpha = 0x01;
	  } else {
	    
	    if((bj->bo2)->opt & BMEPS_OPT_IMAGE_MASK) {
	      
	      dkbif_set_mask_trigger_level(bj->bif, (bj->bo2)->mtl);
	      use_mask_or_alpha = 0x01;
	    }
	    if((bj->bo2)->opt & BMEPS_OPT_ALPHA_MIX) {
	      
	      dkbif_set_mixing(bj->bif,
	        (((bj->bo2)->opt & BMEPS_OPT_PREFER_SPEC_BG) ? 2 : 1),
	        (bj->bo2)->dbgr, (bj->bo2)->dbgg, (bj->bo2)->dbgb
	      );
	    }
	  }
	} break;
	default: {		
	  (bj->bo2)->opt &= (~(BMEPS_OPT_IMAGE_MASK));
	  (bj->bo2)->opt &= (~(BMEPS_OPT_ALPHA_MIX));
	  (bj->bo2)->opt &= (~(BMEPS_OPT_PREFER_SPEC_BG));
	  (bj->bo2)->opt &= (~(BMEPS_OPT_TRANSFER_ALPHA));
	} break;
      }
      
      /* PAGE OBJECT */
      pdf_begin_object(bj, (psp + i));
      pdf_open_dictionary(bj); kw_out(bj, 0);
      /* type */
      kw_out(bj, 27); kw_out(bj, 0);
      /* parent */
      kw_out(bj, 29); kw_out(bj, 1);
      pdf_write_reference(bj, bj->psp); kw_out(bj, 0);
      /* media box */
      kw_out(bj, 28); kw_out(bj, 1);
      kw_out(bj, 10); kw_out(bj, 1);
      if(bmeps_tool_how_to_handle_bb(bj) == 1) {
        dkstream_puts_double(bj->os, 0.0);
	kw_out(bj, 1);
        dkstream_puts_double(bj->os, 0.0);
	kw_out(bj, 1);
        dkstream_puts_double(bj->os, ((bj->trans).iu.x1 - (bj->trans).iu.x0));
	kw_out(bj, 1);
        dkstream_puts_double(bj->os, ((bj->trans).iu.y1 - (bj->trans).iu.y0));
	kw_out(bj, 1);
      } else {
        dkstream_puts_ul(bj->os, (bj->trans).bb.x0); kw_out(bj, 1);
        dkstream_puts_ul(bj->os, (bj->trans).bb.y0); kw_out(bj, 1);
        dkstream_puts_ul(bj->os, (bj->trans).bb.x1); kw_out(bj, 1);
        dkstream_puts_ul(bj->os, (bj->trans).bb.y1); kw_out(bj, 1);
      }
      kw_out(bj, 11); kw_out(bj, 0);
      kw_out(bj, 30); kw_out(bj, 1); pdf_open_dictionary(bj); kw_out(bj, 0);
      /* procset */
      kw_out(bj, 31); kw_out(bj, 1); kw_out(bj, 10); kw_out(bj, 1);
      kw_out(bj, 33); kw_out(bj, 1);
      if((bj->bo2)->opt & BMEPS_OPT_COLOR_OUTPUT) {
        kw_out(bj, 34);
      } else {
        kw_out(bj, 35);
      } kw_out(bj, 1);
      kw_out(bj, 11); kw_out(bj, 0);
      /* xobject */
      kw_out(bj, 32); kw_out(bj, 1);
      pdf_write_reference(bj, (xsp + i)); kw_out(bj, 0);
      pdf_close_dictionary(bj); kw_out(bj, 0);
      /* contents */
      kw_out(bj, 36); kw_out(bj, 1);
      pdf_write_reference(bj, (csp + i)); kw_out(bj, 0);
      /* pdf page attributes for transparency */
      if(use_mask_or_alpha) {
        if(((bj->bo2)->opt) & BMEPS_OPT_TRANSFER_ALPHA) {
	  if(((bj->bo2)->pdfopt) & BMEPS_PDFOPT_ALLOW_PDF_PAGE_ATTRIBUTES) {
	    kw_out(bj, 87); kw_out(bj, 0);
	  }
	}
      }
      pdf_close_dictionary(bj); kw_out(bj, 0);
      pdf_end_object(bj);
      /* GRAPHICS INSTRUCTIONS OBJECT */
      pdf_begin_object(bj, (csp + i));
      gfile = dksf_fopen(bj->tmp2, "wb");
      if(gfile) {
        fprintf(gfile, "q%s", kw[0]);
	switch(bmeps_tool_how_to_handle_bb(bj)) {
	  case 2: {	/* use paper size */
	    fprintf(
	      gfile,
	      "1 0 0 1 %lg %lg cm%s",
	      (bj->trans).iu.x0, (bj->trans).iu.y0, kw[0]
	    );
	    fprintf(
	      gfile,
	      "%lg 0 0 %lg 0 0 cm%s",
	      (bj->trans).sfx, (bj->trans).sfy, kw[0]
	    );
	    fprintf(gfile, "%lu 0 0 %lu 0 0 cm%s", w, h, kw[0]);
	  } break;
	  case 1: {	/* use resolution */
	    if(0) {	/* remove these lines if PDF output is ok */
	      fprintf(
	        gfile,
	        "1 0 0 1 %lg %lg cm%s",
	        (bj->trans).iu.x0, (bj->trans).iu.y0, kw[0]
	      );
	    }
	    fprintf(
	      gfile,
	      "%lg 0 0 %lg 0 0 cm%s",
	      (bj->trans).sfx, (bj->trans).sfy, kw[0]
	    );
	    fprintf(gfile, "%lu 0 0 %lu 0 0 cm%s", w, h, kw[0]);
	  } break;
	  default: {	/* do not scale */
	    fprintf(gfile, "%lu 0 0 %lu 0 0 cm%s", w, h, kw[0]);
	  } break;
	}
	fprintf(gfile, "/X%lu Do%s", bj->nexto, kw[0]);
	fprintf(gfile, "Q%s", kw[0]); fflush(gfile);
        fclose(gfile); gfile = NULL;
	if(dkstat_get(&stbuf, bj->tmp2)) {
	  filesize = (unsigned long)dkstat_size(&stbuf);
	  gfile = fopen(bj->tmp2, "rb");
	  if(gfile) {
	    pdf_open_dictionary(bj); kw_out(bj, 1);
	    kw_out(bj, 38); kw_out(bj, 1);
	    dkstream_puts_ul(bj->os, filesize);
	    kw_out(bj, 1);
	    pdf_close_dictionary(bj); kw_out(bj, 0);
	    kw_out(bj, 39); kw_out(bj, 0);
	    transfer_file_to_stream(bj->os, gfile, filesize);
	    kw_out(bj, 40); kw_out(bj, 0);
	    fclose(gfile); gfile = NULL;
	  } else {
	    bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 62, 63, bj->tmp2);
	    bj->exval = 1;
	  }
	} else {
	  bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 64, 65, bj->tmp2);
	  bj->exval = 1;
	}
	dksf_remove_file(bj->tmp2);
      } else {
	bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 66, 67, bj->tmp2);
	bj->exval = 1;
      }
      pdf_end_object(bj);
      /* XOBJECT DICTIONARY */
      pdf_begin_object(bj, (xsp + i));
      pdf_open_dictionary(bj); kw_out(bj, 0);
      kw_out(bj, 37);
      dkstream_puts_ul(bj->os, bj->nexto); kw_out(bj, 1);
      pdf_write_reference(bj, bj->nexto); kw_out(bj, 0);
      if(use_mask_or_alpha) {
        kw_out(bj, 37);
	dkstream_puts_ul(bj->os, (1UL + bj->nexto)); kw_out(bj, 1);
	pdf_write_reference(bj, (1UL + bj->nexto)); kw_out(bj, 0);
      }
      pdf_close_dictionary(bj); kw_out(bj, 0);
      pdf_end_object(bj);
      /* XOBJECT OBJECTS, use nexto */
      /* image and alpha/mask */
      number_of_filters = 2;
      if((bj->bo2)->enc & (BMEPS_ENCODING_FLATE)) {
        
        number_of_filters++;
      }
      if((bj->bo2)->enc & BMEPS_ENCODING_RUNLENGTH) {
        
        number_of_filters++;
      }
      ofs1 = dkstream_openfile(bj->tmp2, "wb", 0, &dummy);
      if(ofs1) {		
        ofs2 = dkof_open(ofs1, number_of_filters);
	if(ofs2) {		
	  obs = NULL;
	  if(bpc != 8) {	
	    obs = dkof_bs_open(ofs2);
	  }
	  if((bpc == 8) || (obs)) {	
	    data_ok = 1;
	    if(!dkof_set(ofs2, 0, DK_OF_TYPE_BUFFERED)) {
	      data_ok = 0;	
	    }
	    if((bj->bo2)->enc & BMEPS_ENCODING_ASCII85) {
	      if(!dkof_set(ofs2, 1, DK_OF_TYPE_ASCII85)) {
	        data_ok = 0;	
	      }
	    } else {
	      if(!dkof_set(ofs2, 1, DK_OF_TYPE_ASCIIHEX)) {
  	        data_ok = 0;	
	      }
	    }
	    dkof_set_crnl(ofs2, 1); nf = 2;
	    if((bj->bo2)->enc & BMEPS_ENCODING_FLATE) {
	      nf = 3;
	      if(!dkof_set(ofs2, 2, DK_OF_TYPE_FLATE)) {
	        data_ok = 0;	
	      }
	    } else {
	    }
	    if((bj->bo2)->enc & BMEPS_ENCODING_RUNLENGTH) {
	      
	      if(!dkof_set(ofs2, nf, DK_OF_TYPE_PSRL)) {
	        data_ok = 0;	
	      }
	    }
	    if(data_ok) {	
	      if(dkof_start_chunk(ofs2)) {	
	        ch = dkbif_get_channels(bj->bif);
	        for(iy = 0UL; iy < h; iy++) {
	          for(j = 0UL; j < w; j++) {
		    y = iy; x = j;
		    if((bj->trans).must_rotate) { x = iy; y = w - 1UL - j; }
		    if((bj->bo2)->opt & BMEPS_OPT_COLOR_OUTPUT) {
		      if((bpc != 8) && (obs)) {
		        dkof_bs_put(
			  obs, dkbif_get_red(bj->bif, x, y),
			  (unsigned short)bpc
			);
		        dkof_bs_put(
			  obs, dkbif_get_green(bj->bif, x, y),
			  (unsigned short)bpc
			);
		        dkof_bs_put(
			  obs, dkbif_get_blue(bj->bif, x, y),
			  (unsigned short)bpc
			);
		      } else {
		        c = (unsigned char)dkbif_get_red(bj->bif, x, y);
		        dkstream_write(ofs2, (char *)(&c), 1);
		        c = (unsigned char)dkbif_get_green(bj->bif, x, y);
		        dkstream_write(ofs2, (char *)(&c), 1);
		        c = (unsigned char)dkbif_get_blue(bj->bif, x, y);
		        dkstream_write(ofs2, (char *)(&c), 1);
		      }
		    } else {
		      if((bpc != 8) && (obs)) {
		        dkof_bs_put(
			  obs, dkbif_get_gray(bj->bif, x, y),
			  (unsigned short)bpc
			);
		      } else {
		        c = (unsigned char)dkbif_get_gray(bj->bif, x, y);
		        dkstream_write(ofs2, (char *)(&c), 1);
		      }
		    }
		  }
		  if(obs) {
		    dkof_bs_flush(obs);
		  }
	        }
	        if(!dkof_end_chunk(ofs2)) {
	          data_ok = 0;			
	        } else {			
		}
	      } else {				
		bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 69);
		bj->exval = 1;
	      }
	    } else {		
	    }
	  } else {
	    bmeps_tool_error_memory(bj); bj->exval = 1;
	  }
	  if(obs) {
	    dkof_bs_close(obs);
	  }
	  obs = NULL;
	  dkof_close(ofs2); ofs2 = NULL;
	} else {		
	  bmeps_tool_error_memory(bj); bj->exval = 1;
	}
        dkstream_close(ofs1); ofs1 = NULL;
      } else {			
	bmeps_tool_error_memory(bj); bj->exval = 1;
      }
      if(use_mask_or_alpha) {		
	ofs1 = dkstream_openfile(bj->tmp3, "wb", 0, &dummy);
	if(ofs1) {			
	  ofs2 = dkof_open(ofs1, number_of_filters);
	  if(ofs2) {			
	    mask_ok = 1;
	    if(!dkof_set(ofs2, 0, DK_OF_TYPE_BUFFERED)) {
	      mask_ok = 0;	
	    }
	    if((bj->bo2)->enc & BMEPS_ENCODING_ASCII85) {
	      if(!dkof_set(ofs2, 1, DK_OF_TYPE_ASCII85)) {
	        mask_ok = 0;	
	      }
	    } else {
	      if(!dkof_set(ofs2, 1, DK_OF_TYPE_ASCIIHEX)) {
  	        mask_ok = 0;	
	      }
	    }
	    dkof_set_crnl(ofs2, 1); nf = 2;
	    if((bj->bo2)->enc & BMEPS_ENCODING_FLATE) {
	      nf = 3;
	      if(!dkof_set(ofs2, 2, DK_OF_TYPE_FLATE)) {
	        mask_ok = 0;	
	      }
	    } else {
	    }
	    if((bj->bo2)->enc & BMEPS_ENCODING_RUNLENGTH) {
	      
	      if(!dkof_set(ofs2, nf, DK_OF_TYPE_PSRL)) {
	        mask_ok = 0;	
	      }
	    }
	    if(mask_ok) {
	      if(dkof_start_chunk(ofs2)) {
	        if((bj->bo2)->opt & BMEPS_OPT_TRANSFER_ALPHA) {	
	          obs = NULL;	
		  if(bpc != 8) {
		    obs = dkof_bs_open(ofs2);
		  }
		  if((bpc == 8) || (obs)) {	
		    for(iy = 0UL; iy < h; iy++) {
		      for(j = 0UL; j < w; j++) {
		        unsigned short m;
		        y = iy; x = j;
		        if((bj->trans).must_rotate) { x = iy; y = w - 1UL - j; }
		        m = dkbif_get_alpha(bj->bif, x, y);
		        if(obs) {
		          dkof_bs_put(obs, m, (unsigned short)bpc);
		        } else {
		          c = (unsigned char)m;
			  dkstream_write(ofs2, (char *)(&c), 1);
		        }
		      }
		      if(obs) {
		        dkof_bs_flush(obs);
		      }
		    }
		    if(obs) {
		      dkof_bs_close(obs); obs = NULL;
		    }
		  } else {		
		    bmeps_tool_error_memory(bj); bj->exval = 1;
		  }
	        } else {		
	          obs = dkof_bs_open(ofs2);
		  if(obs) {		
		    for(iy = 0UL; iy < h; iy++) {
		      for(j = 0UL; j < w; j++) {
		        y = iy; x = j;
		        if((bj->trans).must_rotate) { x = iy; y = w - 1UL - j; }
		        dkof_bs_put(
			  obs,
			  (unsigned short)(dkbif_get_mask(bj->bif,x,y) ? 1 : 0),
			  (unsigned short)1
			);
		      }
		      if(obs) {
		        dkof_bs_flush(obs);
		      }
		    }
		    dkof_bs_close(obs); obs = NULL;
		  } else {		
		    bmeps_tool_error_memory(bj); bj->exval = 1;
		  }
	        }
	        if(!dkof_end_chunk(ofs2)) {
	          
	          mask_ok = 0;
		  bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 69); bj->exval = 1;
	        }
	      } else {
		bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 68); bj->exval = 1;
	      }
	    } else {
	      
	      bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 70); bj->exval = 1;
	    }
	    dkof_close(ofs2); ofs2 = NULL;
	  } else {			
	    bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 70); bj->exval = 1;
	  }
	  dkstream_close(ofs1); ofs1 = NULL;
	} else {			
	  bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 66, 67, bj->tmp3);
	  bj->exval = 1;
	}
      }
      
      if(data_ok && ((mask_ok) || (use_mask_or_alpha == 0x00))) {
        
        if(dkstat_get(&stbuf, bj->tmp2)) {	
	  filesize = (unsigned long)dkstat_size(&stbuf);
	  pdf_begin_object(bj, bj->nexto); bj->nexto += 1UL;
	  gfile= fopen(bj->tmp2, "rb");
	  if(gfile) {				
	    pdf_open_dictionary(bj); kw_out(bj, 0);
	    kw_out(bj, 47); kw_out(bj, 0);
	    kw_out(bj, 48); kw_out(bj, 0);
	    kw_out(bj, 49); kw_out(bj, 1);
	    dkstream_puts_ul(bj->os, w); kw_out(bj, 0);
	    kw_out(bj, 50); kw_out(bj, 1);
	    dkstream_puts_ul(bj->os, h); kw_out(bj, 0);
	    kw_out(bj, 51); kw_out(bj, 1);
	    if((bj->bo2)->opt & BMEPS_OPT_COLOR_OUTPUT) {
	      kw_out(bj, 52);
	    } else {
	      kw_out(bj, 53);
	    } kw_out(bj, 0);
	    kw_out(bj, 55); kw_out(bj, 1);
	    dkstream_puts_ul(bj->os, bpc); kw_out(bj, 0);
	    if((bj->bo2)->opt & BMEPS_OPT_INTERPOLATE) {
	      kw_out(bj, 58); kw_out(bj, 1); kw_out(bj, 59); kw_out(bj, 0);
	    }
	    if(use_mask_or_alpha) {
	      if((bj->bo2)->opt & BMEPS_OPT_TRANSFER_ALPHA) {
	        kw_out(bj, 61);
		bj->alpha_channel_transferred = 0x01;
	      } else {
	        kw_out(bj, 62);
	      }
              kw_out(bj, 1);
	      dkstream_puts_ul(bj->os, bj->nexto); kw_out(bj, 1);
	      dkstream_puts_ul(bj->os, 0UL); kw_out(bj, 1);
	      kw_out(bj, 23); kw_out(bj, 0);
	    }
	    kw_out(bj, 56); kw_out(bj, 1);
	    dkstream_puts_ul(bj->os, filesize); kw_out(bj, 0);
	    kw_out(bj, 57); kw_out(bj, 1);
	    kw_out(bj, 10); kw_out(bj, 1);
	    if((bj->bo2)->enc & BMEPS_ENCODING_ASCII85) {
	      kw_out(bj, 42);
	    } else {
	      kw_out(bj, 41);
	    } kw_out(bj, 1);
	    if((bj->bo2)->enc & BMEPS_ENCODING_FLATE) {
	      kw_out(bj, 44); kw_out(bj, 1);
	    } else {
	    }
	    if((bj->bo2)->enc & BMEPS_ENCODING_RUNLENGTH) {
	      kw_out(bj, 45);
	    }
	    kw_out(bj, 1); kw_out(bj, 11); kw_out(bj, 0);
	    pdf_close_dictionary(bj); kw_out(bj, 0);
	    kw_out(bj, 39); kw_out(bj, 0);
	    transfer_file_to_stream(bj->os, gfile, filesize);
	    kw_out(bj, 40); kw_out(bj, 0);
	    fclose(gfile); gfile = NULL;
	  } else {				
	    bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 62, 63, bj->tmp2);
	    bj->exval = 1;
	  }
          pdf_end_object(bj);
          if(use_mask_or_alpha) {
	    if(dkstat_get(&stbuf, bj->tmp3)) {
	      filesize =(unsigned long)dkstat_size(&stbuf);
              pdf_begin_object(bj, bj->nexto); bj->nexto += 1UL;
	      gfile = fopen(bj->tmp3, "rb");
	      if(gfile) {
	        pdf_open_dictionary(bj); kw_out(bj, 0);
	        kw_out(bj, 47); kw_out(bj, 0);
	        kw_out(bj, 48); kw_out(bj, 0);
	        kw_out(bj, 49); kw_out(bj, 1);
	        dkstream_puts_ul(bj->os, w); kw_out(bj, 0);
	        kw_out(bj, 50); kw_out(bj, 1);
	        dkstream_puts_ul(bj->os, h); kw_out(bj, 0);
	        kw_out(bj, 51); kw_out(bj, 1);
		kw_out(bj, 53); kw_out(bj, 0);
	        kw_out(bj, 55); kw_out(bj, 1);
		if((bj->bo2)->opt & BMEPS_OPT_TRANSFER_ALPHA) {
		  dkstream_puts_ul(bj->os, bpc);
		} else {
	          dkstream_puts_ul(bj->os, 1UL);
		}
		kw_out(bj, 0);
	        kw_out(bj, 56); kw_out(bj, 1);
	        dkstream_puts_ul(bj->os, filesize); kw_out(bj, 0);
	        kw_out(bj, 57); kw_out(bj, 1);
	        kw_out(bj, 10); kw_out(bj, 1);
	        if((bj->bo2)->enc & BMEPS_ENCODING_ASCII85) {
	          kw_out(bj, 42);
	        } else {
	          kw_out(bj, 41);
	        } kw_out(bj, 1);
	        if((bj->bo2)->enc & BMEPS_ENCODING_FLATE) {
	          kw_out(bj, 44); kw_out(bj, 1);
	        } else {
	        }
	        if((bj->bo2)->enc & BMEPS_ENCODING_RUNLENGTH) {
	          kw_out(bj, 45);
	        }
	        kw_out(bj, 1); kw_out(bj, 11); kw_out(bj, 0);
		pdf_close_dictionary(bj); kw_out(bj, 0);
		kw_out(bj, 39); kw_out(bj, 0);
		transfer_file_to_stream(bj->os, gfile, filesize);
		kw_out(bj, 40); kw_out(bj, 0);
		fclose(gfile); gfile = NULL;
	      } else {
		bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 62, 63, bj->tmp3);
		bj->exval = 1;
	      }
	      pdf_end_object(bj);
	    } else {
	      bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 64, 65, bj->tmp3);
	      bj->exval = 1;
	    }
          }
	} else {				
	  bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 64, 65, bj->tmp2);
	  bj->exval = 1;
	}
      } else {					
      }
    } else {
      bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 71); bj->exval = 1;
    }
    fno++; i++;
  } 
}



static
void
pdf_file_objects_dct DK_P1(BJ *,bj)
{
#if DK_HAVE_JPEGLIB_H
  unsigned short bpcs;		/* bits per component */
  unsigned long bpc;		/* also bits per component */
  /* unsigned char c; */	/* one byte of output for 8-bit input */
  unsigned long psp;		/* pages start position (object number) */
  unsigned long csp;		/* contents start position (object number) */
  unsigned long xsp;		/* xobjects start position (object number) */
  unsigned long i;		/* */
  unsigned long w;		/* width of output image */
  unsigned long h;		/* height of output image */
  unsigned long origw;		/* width of input image */
  unsigned long origh;		/* height of input image */
  unsigned long filesize;	/* file size of temporary file */
  /* unsigned long x; */	/* x position of source pixel */
  /* unsigned long y; */	/* y position of source pixel */
  /* unsigned long iy; */	/* y position of destination pixel */
  /* unsigned long j; */	/* x position of destination pixel */
  long fno;			/* number of current frame */
  dk_stat_t stbuf;		/* stat buffer to obtain file info */
  int ch = 0;			/* number of channels in input file */
  int dummy = 0;		/* dummy variable for fopen failure */
  int data_ok = 0;		/* indicate output data file ok */
  dk_stream_t *ofs1 = NULL;	/* unfiltered output stream */
  dk_stream_t *ofs2 = NULL;	/* filter output stream */
  dk_bitshift_t *obs = NULL;	/* output bit shifter */
  FILE *gfile = NULL;		/* temporary file */
  
  i = 0;
  bj->frame_n = 1;
  fno = bj->frame_s;
  psp = bj->nexto;
  csp = psp + bj->frame_n;
  xsp = csp + bj->frame_n;
  dkmem_cpy(bj->bo2, bj->bo, sizeof(BO));
  bmeps_tool_calculate_areas(bj);
  origw = w = dkbif_get_width(bj->bif);
  origh = h = dkbif_get_height(bj->bif);
  if((bj->trans).must_rotate) {
    w = origh; h = origw;
  }
  bpcs = dkbif_get_bits_per_component(bj->bif);
  bpc  = (unsigned long)bpcs;
  pdf_begin_object(bj, bj->nexto); bj->nexto += 1UL;
  pdf_open_dictionary(bj); kw_out(bj, 0);
  /* type */
  kw_out(bj, 27); kw_out(bj, 0);
  /* parent */
  kw_out(bj, 29); kw_out(bj, 1);
  pdf_write_reference(bj, bj->psp); kw_out(bj, 0);
  /* media box */
  kw_out(bj, 28); kw_out(bj, 1);
  kw_out(bj, 10); kw_out(bj, 1);
  if(bmeps_tool_how_to_handle_bb(bj) == 1) {
    dkstream_puts_double(bj->os, 0.0);
    kw_out(bj, 1);
    dkstream_puts_double(bj->os, 0.0);
    kw_out(bj, 1);
    dkstream_puts_double(bj->os, ((bj->trans).iu.x1 - (bj->trans).iu.x0));
    kw_out(bj, 1);
    dkstream_puts_double(bj->os, ((bj->trans).iu.y1 - (bj->trans).iu.y0));
    kw_out(bj, 1);
  } else {
    dkstream_puts_ul(bj->os, (bj->trans).bb.x0); kw_out(bj, 1);
    dkstream_puts_ul(bj->os, (bj->trans).bb.y0); kw_out(bj, 1);
    dkstream_puts_ul(bj->os, (bj->trans).bb.x1); kw_out(bj, 1);
    dkstream_puts_ul(bj->os, (bj->trans).bb.y1); kw_out(bj, 1);
  }
  kw_out(bj, 11); kw_out(bj, 0);
  /* resources */
  kw_out(bj, 30); kw_out(bj, 1); pdf_open_dictionary(bj); kw_out(bj, 0);
  kw_out(bj, 31); kw_out(bj, 1); kw_out(bj, 10); kw_out(bj, 1);
  kw_out(bj, 33); kw_out(bj, 1);
  if((bj->bo2)->opt & BMEPS_OPT_COLOR_OUTPUT) {
    kw_out(bj, 34);
  } else {
    kw_out(bj, 35);
  } kw_out(bj, 0);
  kw_out(bj, 11); kw_out(bj, 0);
  kw_out(bj, 32); kw_out(bj, 1);
  pdf_write_reference(bj, (xsp + i)); kw_out(bj, 0);
  pdf_close_dictionary(bj); kw_out(bj, 0);
  /* contents */
  kw_out(bj, 36); kw_out(bj, 1);
  pdf_write_reference(bj, (csp + i)); kw_out(bj, 0);
  pdf_close_dictionary(bj); kw_out(bj, 0);
  pdf_end_object(bj);
  /* GRAPHICS CONTENTS OBJECT */
  pdf_begin_object(bj, bj->nexto); bj->nexto += 1UL;
      gfile = dksf_fopen(bj->tmp2, "w");
      if(gfile) {
        fprintf(gfile, "q%s", kw[0]);
	switch(bmeps_tool_how_to_handle_bb(bj)) {
	  case 2: {	/* use paper size */
#define DO_DEBUG 0
#if DO_DEBUG
	    if((bj->trans).must_rotate) {
	      fprintf(
	        gfile,
		"1 0 0 1 %lg %lg cm%s",
		0.5*((bj->trans).iu.x0 + (bj->trans).iu.x1),
		0.5*((bj->trans).iu.y1 + (bj->trans).iu.y0),
		kw[0]
	      );
	      fprintf(
	        gfile,
		"0 -1 1 0 0 0 cm%s", kw[0]
	      );
	      fprintf(
	        gfile,
		"%lg 0 0 %lg 0 0 cm%s",
		0.5*(bj->trans).sfy, 0.5*(bj->trans).sfx, kw[0]
	      );
	      fprintf(gfile, "%lu 0 0 %lu 0 0 cm%s", origw, origh, kw[0]);
#else
	    if((bj->trans).must_rotate) {
	      fprintf(
	        gfile,
		"1 0 0 1 %lg %lg cm%s",
		(bj->trans).iu.x0, (bj->trans).iu.y1, kw[0]
	      );
	      fprintf(
	        gfile,
		"0 -1 1 0 0 0 cm%s", kw[0]
	      );
	      fprintf(
	        gfile,
		"%lg 0 0 %lg 0 0 cm%s",
		(bj->trans).sfy, (bj->trans).sfx, kw[0]
	      );
	      fprintf(gfile, "%lu 0 0 %lu 0 0 cm%s", origw, origh, kw[0]);
#endif
	    } else {
	      fprintf(
	        gfile,
	        "1 0 0 1 %lg %lg cm%s",
	        (bj->trans).iu.x0, (bj->trans).iu.y0, kw[0]
	      );
	      fprintf(
	        gfile,
	        "%lg 0 0 %lg 0 0 cm%s",
	        (bj->trans).sfx, (bj->trans).sfy, kw[0]
	      );
	    }
	  } break;
	  case 1: {	/* use resolution */
	    if(0) {	/* remove these lines if PDF output is ok */
	      fprintf(
	        gfile,
	        "1 0 0 1 %lg %lg cm%s",
	        (bj->trans).iu.x0, (bj->trans).iu.y0, kw[0]
	      );
	    }
	    fprintf(
	      gfile,
	      "%lg 0 0 %lg 0 0 cm%s",
	      (bj->trans).sfx, (bj->trans).sfy, kw[0]
	    );
	    fprintf(gfile, "%lu 0 0 %lu 0 0 cm%s", w, h, kw[0]);
	  } break;
	  default: {	/* do not scale */
	    fprintf(gfile, "%lu 0 0 %lu 0 0 cm%s", w, h, kw[0]);
	  } break;
	}
	fprintf(gfile, "/X%lu Do%s", (bj->nexto + 1UL), kw[0]);
	fprintf(gfile, "Q%s", kw[0]); fflush(gfile);
        fclose(gfile); gfile = NULL;
	if(dkstat_get(&stbuf, bj->tmp2)) {
	  filesize = (unsigned long)dkstat_size(&stbuf);
	  gfile = fopen(bj->tmp2, "rb");
	  if(gfile) {
	    pdf_open_dictionary(bj); kw_out(bj, 1);
	    kw_out(bj, 38); kw_out(bj, 1);
	    dkstream_puts_ul(bj->os, filesize);
	    kw_out(bj, 1);
	    pdf_close_dictionary(bj); kw_out(bj, 0);
	    kw_out(bj, 39); kw_out(bj, 0);
	    transfer_file_to_stream(bj->os, gfile, filesize);
	    kw_out(bj, 40); kw_out(bj, 0);
	    fclose(gfile); gfile = NULL;
	  } else {
	    bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 62, 63, bj->tmp2);
	    bj->exval = 1;
	  }
	} else {
	  bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 64, 65, bj->tmp2);
	  bj->exval = 1;
	}
	dksf_remove_file(bj->tmp2);
      } else {
	bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 66, 67, bj->tmp2);
	bj->exval = 1;
      }
  pdf_end_object(bj);
  /* XOBJECT DICTIONARY */
  pdf_begin_object(bj, bj->nexto); bj->nexto += 1UL;
      pdf_open_dictionary(bj); kw_out(bj, 0);
      kw_out(bj, 37);
      dkstream_puts_ul(bj->os, bj->nexto); kw_out(bj, 1);
      pdf_write_reference(bj, bj->nexto); kw_out(bj, 0);
      pdf_close_dictionary(bj); kw_out(bj, 0);
  pdf_end_object(bj);
  /* XOBJECT OBJECT */
  pdf_begin_object(bj, bj->nexto); bj->nexto += 1UL;
      data_ok = 0;
      dummy = 0;
      ofs1 = dkstream_openfile(bj->tmp2, "wb", 0, &dummy);
      if(ofs1) {
        ofs2 = dkof_open(ofs1, 2);
	if(ofs2) {
	  data_ok = 1;
	  if(!dkof_set(ofs2, 0, DK_OF_TYPE_BUFFERED)) {
	    data_ok = 0;
	  }
	  if((bj->bo2)->enc & BMEPS_ENCODING_ASCII85) {
	    if(!dkof_set(ofs2, 1, DK_OF_TYPE_ASCII85)) {
	      data_ok = 0;
	    }
	  } else {
	    if(!dkof_set(ofs2, 1, DK_OF_TYPE_ASCIIHEX)) {
	      data_ok = 0;
	    }
	  }
	  dkof_set_crnl(ofs2, 1);
	  if(data_ok) {
	    if(dkof_start_chunk(ofs2)) {
	      rewind(bj->inf);
	      transfer_entire_file(bj, ofs2, bj->inf);
	      if(!dkof_end_chunk(ofs2)) {
		bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 69);
		bj->exval = 1;
	      }
	    } else {
	      bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 68);
	      bj->exval = 1;
	    }
	  } else {
	    /* previous errors */
	  }
	  dkof_close(ofs2); ofs2 = 0;
	} else {
	  bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 70);
	  bj->exval = 1;
	}
        dkstream_close(ofs1); ofs1 = NULL;
      } else {
	bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 66, 67, bj->tmp2);
	bj->exval = 1;
      }
      if(data_ok) {
        if(dkstat_get(&stbuf, bj->tmp2)) {
	  filesize = (unsigned long)dkstat_size(&stbuf);
	  gfile= fopen(bj->tmp2, "rb");
	  if(gfile) {
	    pdf_open_dictionary(bj); kw_out(bj, 0);
	    kw_out(bj, 47); kw_out(bj, 0);
	    kw_out(bj, 48); kw_out(bj, 0);
	    kw_out(bj, 49); kw_out(bj, 1);
	    dkstream_puts_ul(bj->os, origw); kw_out(bj, 0);
	    kw_out(bj, 50); kw_out(bj, 1);
	    dkstream_puts_ul(bj->os, origh); kw_out(bj, 0);
	    kw_out(bj, 51); kw_out(bj, 1);
	    if(((bj->bif)->d).jpg.jpgana.components > 0x01) {
	      if(((bj->bif)->d).jpg.jpgana.components == 0x03) {
	        kw_out(bj, 52);
	      } else {
	        kw_out(bj, 54);
	      }
	    } else {
	      kw_out(bj, 53);
	    }
	    kw_out(bj, 0);
	    kw_out(bj, 55); kw_out(bj, 1);
	    dkstream_puts_ul(bj->os, bpc);
	    kw_out(bj, 0);
	    if((bj->bo2)->opt & BMEPS_OPT_INTERPOLATE) {
	      if((bj->bo2)->opt & BMEPS_OPT_JPEG_INTERPOLATE) {
	        kw_out(bj, 58); kw_out(bj, 1); kw_out(bj, 59); kw_out(bj, 0);
	      }
	    }
	    kw_out(bj, 56); kw_out(bj, 1);
	    dkstream_puts_ul(bj->os, filesize); kw_out(bj, 0);
	    kw_out(bj, 57); kw_out(bj, 1);
	    kw_out(bj, 10); kw_out(bj, 1);
	    if((bj->bo2)->enc & BMEPS_ENCODING_ASCII85) {
	      kw_out(bj, 42);
	    } else {
	      kw_out(bj, 41);
	    } kw_out(bj, 1);
	    kw_out(bj, 46);
	    kw_out(bj, 1); kw_out(bj, 11); kw_out(bj, 0);
	    if((((bj->bif)->d).jpg.jpgana.components) != 0x01) {
	      if((((bj->bif)->d).jpg.jpgana.components) != 0x03) {
	        if(((bj->bif)->d).jpg.jpgana.adobe_marker_found) {
		  kw_out(bj, 86); kw_out(bj, 0);
		}
	      }
	    }
	    pdf_close_dictionary(bj); kw_out(bj, 0);
	    kw_out(bj, 39); kw_out(bj, 0);
	    transfer_file_to_stream(bj->os, gfile, filesize);
	    kw_out(bj, 40); kw_out(bj, 0);
	    fclose(gfile); gfile = NULL;
	  } else {
	    bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 62, 63, bj->tmp2);
	    bj->exval = 1;
	  }
	}
      }
  pdf_end_object(bj);

  
#endif
}



#define DKSP(i) dkstream_puts(ofs2, kw[i])



static
void
pdf_file_objects_draft DK_P1(BJ *,bj)
{
  long fno;				/* current frame to process */
  unsigned long w, h, origw, origh;	/* image dimensions */
  unsigned long psp;			/* page start position */
  unsigned long csp;			/* contents start position */
  unsigned long i;			/* the frame number */
  unsigned long filesize;		/* length of stream */
  FILE *gfile;				/* used to read encoded stream */
  DI dinner, douter;
  int dummy, data_ok, number_of_filters;
  double r = 0.7, g = 0.0, b = 0.0, gray = 0.9, black = 0.0;
  dk_stream_t *ofs1, *ofs2;
  dk_stat_t stbuf;
  
  fno = bj->frame_s;
  psp = bj->nexto;
  csp = psp + bj->frame_n;
  i = 0UL;
  bj->nexto = csp + bj->frame_n;	/* number of objects at end */
  while(fno <= bj->frame_e) {
    
    w = h = origw = origh = 0UL;
    data_ok = 0;
    ofs1 = NULL; ofs2 = NULL;
    dkmem_cpy(bj->bo2, bj->bo, sizeof(BO));
    if(dkbif_set_frame(bj->bif, fno)) {
      
      data_ok = 0;
      bmeps_tool_calculate_areas(bj);
      origw = w = dkbif_get_width(bj->bif);
      origh = h = dkbif_get_height(bj->bif);
      if((bj->trans).must_rotate) {
        w = origh; h = origw;
      }
      number_of_filters = 2;
      if((bj->bo2)->enc & (BMEPS_ENCODING_FLATE)) {
        
        number_of_filters++;
      }
      if(bmeps_tool_calc_di(bj, &dinner, &douter, 0.05, 0.01)) {
        dummy = 0;
        ofs1 = dkstream_openfile(bj->tmp2, "wb", 0, &dummy);
	if(ofs1) {
	  ofs2 = dkof_open(ofs1, number_of_filters);
	  if(ofs2) {
	    data_ok = 1;
#if DEBUG
	    if(!dkof_set(ofs2, 0, DK_OF_TYPE_BUFFERED)) {
	      data_ok = 0;
	    }
	    if((bj->bo2)->enc & BMEPS_ENCODING_ASCII85) {
	      if(!dkof_set(ofs2, 1, DK_OF_TYPE_BUFFERED)) {
	        data_ok = 0;
	      }
	    } else {
	      if(!dkof_set(ofs2, 1, DK_OF_TYPE_BUFFERED)) {
	        data_ok = 0;
	      }
	    }
	    dkof_set_crnl(ofs2, 1);
	    if((bj->bo2)->enc & BMEPS_ENCODING_FLATE) {
	      if(!dkof_set(ofs2, 2, DK_OF_TYPE_BUFFERED)) {
	        data_ok = 0;
	      }
	    } else {
	    }
#else
	    if(!dkof_set(ofs2, 0, DK_OF_TYPE_BUFFERED)) {
	      data_ok = 0;
	    }
	    if((bj->bo2)->enc & BMEPS_ENCODING_ASCII85) {
	      if(!dkof_set(ofs2, 1, DK_OF_TYPE_ASCII85)) {
	        data_ok = 0;
	      }
	    } else {
	      if(!dkof_set(ofs2, 1, DK_OF_TYPE_ASCIIHEX)) {
	        data_ok = 0;
	      }
	    }
	    dkof_set_crnl(ofs2, 1);
	    if((bj->bo2)->enc & BMEPS_ENCODING_FLATE) {
	      if(!dkof_set(ofs2, 2, DK_OF_TYPE_FLATE)) {
	        data_ok = 0;
	      }
	    } else {
	    }
#endif
	    if(data_ok) {
	      if(dkof_start_chunk(ofs2)) {
	        DKSP(67); DKSP(0);
		/* change color to red or black */
		if((bj->bo2)->opt & BMEPS_OPT_COLOR_OUTPUT) {
		  dkstream_puts_double(ofs2, r);
		  DKSP(1);
		  dkstream_puts_double(ofs2, g);
		  DKSP(1);
		  dkstream_puts_double(ofs2, b);
		  DKSP(1); DKSP(70);
		} else {
		  dkstream_puts_double(ofs2, black);
		  DKSP(1); DKSP(69);
		} DKSP(0);
		/* border rectangle */
		dkstream_puts_double(ofs2, (bj->trans).iu.x0);
		DKSP(1);
		dkstream_puts_double(ofs2, (bj->trans).iu.y0);
		DKSP(1);
		dkstream_puts_double(ofs2, ((bj->trans).iu.x1 - (bj->trans).iu.x0));
		DKSP(1);
		dkstream_puts_double(ofs2, ((bj->trans).iu.y1 - (bj->trans).iu.y0));
		DKSP(1); DKSP(75); DKSP(1); DKSP(74); DKSP(0);
		/* change color to gray */
		dkstream_puts_double(ofs2, gray);
		DKSP(1); DKSP(69); DKSP(0);
		/* middle rectangle */
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.x0 + douter.d)
		); DKSP(1);
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.y0 + douter.d)
		); DKSP(1);
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.x1 - (bj->trans).iu.x0 - 2.0 * douter.d)
		); DKSP(1);
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.y1 - (bj->trans).iu.y0 - 2.0 * douter.d)
		); DKSP(1); DKSP(75); DKSP(1); DKSP(74); DKSP(0);
		/* change color to white */
		dkstream_puts_double(ofs2, 1.0); DKSP(1); DKSP(69); DKSP(0);
		/* inner rectangle */
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.x0 + dinner.d)
		); DKSP(1);
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.y0 + dinner.d)
		); DKSP(1);
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.x1 - (bj->trans).iu.x0 - 2.0 * dinner.d)
		); DKSP(1);
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.y1 - (bj->trans).iu.y0 - 2.0 * dinner.d)
		); DKSP(1); DKSP(75); DKSP(1); DKSP(74); DKSP(0);
		/* change color to gray */
		dkstream_puts_double(ofs2, gray);
		DKSP(1); DKSP(69); DKSP(0);
		/* large diagonal lines */
		/*	x0+douter.d y0+douter.d moveto */
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.x0 + douter.d)
		); DKSP(1);
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.y0 + douter.d)
		); DKSP(1); DKSP(71); DKSP(0);
		/*	x0+douter.d+dinner.deltax y0+douter.d lineto */
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.x0 + douter.d + dinner.deltax)
		); DKSP(1);
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.y0 + douter.d)
		); DKSP(1); DKSP(72); DKSP(0);
		/*	x1-douter.d y1-douter.d-dinner.deltay lineto */
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.x1 - douter.d)
		); DKSP(1);
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.y1 - douter.d - dinner.deltay)
		); DKSP(1); DKSP(72); DKSP(0);
		/*	x1-douter.d y1-douter.d lineto */
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.x1 - douter.d)
		); DKSP(1);
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.y1 - douter.d)
		); DKSP(1); DKSP(72); DKSP(0);
		/*	x1-douter.d-dinner.deltax y1-douter.d lineto */
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.x1 - douter.d - dinner.deltax)
		); DKSP(1);
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.y1 - douter.d)
		); DKSP(1); DKSP(72); DKSP(0);
		/*	x0+douter.d y0+douter.d+dinnter.deltax lineto */
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.x0 + douter.d)
		); DKSP(1);
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.y0 + douter.d + dinner.deltax)
		); DKSP(1); DKSP(72); DKSP(0);
		/*	closepath fill */
		DKSP(73); DKSP(1); DKSP(74); DKSP(0);
		/*	x0+douter.d y1-douter.d moveto */
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.x0 + douter.d)
		); DKSP(1);
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.y1 - douter.d)
		); DKSP(1); DKSP(71); DKSP(0);
		/*	x0+douter.d y1-douter.d-dinner.deltay lineto */
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.x0 + douter.d)
		); DKSP(1);
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.y1 - douter.d - dinner.deltay)
		); DKSP(1); DKSP(72); DKSP(0);
		/*	x1-douterd-dinner.deltax y0+douter.d lineto */
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.x1 - douter.d - dinner.deltax)
		); DKSP(1);
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.y0 + douter.d)
		); DKSP(1); DKSP(72); DKSP(0);
		/*	x1-douter.d y0+douter.d lineto */
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.x1 - douter.d)
		); DKSP(1);
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.y0 + douter.d)
		); DKSP(1); DKSP(72); DKSP(0);
		/*	x1-douter.d y0+douter.d+dinner.deltay lineto */
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.x1 - douter.d)
		); DKSP(1);
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.y0 + douter.d + dinner.deltay)
		); DKSP(1); DKSP(72); DKSP(0);
		/*	x0+douter.d+dinner.deltax y1-douter.d lineto */
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.x0 + douter.d + dinner.deltax)
		); DKSP(1);
		dkstream_puts_double(
		  ofs2,
		  ((bj->trans).iu.y1 - douter.d)
		); DKSP(1); DKSP(72); DKSP(0);
		/*	closepath fill */
		DKSP(73); DKSP(1); DKSP(74); DKSP(0);
		/* change color to red or black */
		if((bj->bo2)->opt & BMEPS_OPT_COLOR_OUTPUT) {
		  dkstream_puts_double(ofs2, r);
		  DKSP(1);
		  dkstream_puts_double(ofs2, g);
		  DKSP(1);
		  dkstream_puts_double(ofs2, b);
		  DKSP(1); DKSP(70);
		} else {
		  dkstream_puts_double(ofs2, black);
		  DKSP(1); DKSP(69);
		} DKSP(0);
	        if(!dkof_end_chunk(ofs2)) {
		  bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 69);
		  bj->exval = 1;
		  data_ok = 0;
		}
	      } else {
		bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 68);
		bj->exval = 1;
		data_ok = 0;
	      }
	    } else {
	      bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 70);
	      bj->exval = 1;
	    }
	    dkof_close(ofs2); ofs2 = NULL;
	  } else {
	    bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 70);
	    bj->exval = 1;
	  }
	  dkstream_close(ofs1); ofs1 = NULL;
	  if(data_ok) {
	    if(dkstat_get(&stbuf, bj->tmp2)) {
	      filesize = (unsigned long)dkstat_size(&stbuf);
	      gfile = fopen(bj->tmp2, "rb");
	      if(gfile) {
	        pdf_begin_object(bj, psp+i);
		pdf_open_dictionary(bj); kw_out(bj, 0);
		kw_out(bj, 27); kw_out(bj, 0);
		kw_out(bj, 29); kw_out(bj, 1);
		pdf_write_reference(bj, bj->psp); kw_out(bj, 0);
		kw_out(bj, 28); kw_out(bj, 1);
		kw_out(bj, 10);
		if(bmeps_tool_how_to_handle_bb(bj) == 1) {
                  dkstream_puts_double(bj->os, 0.0);
	          kw_out(bj, 1);
                  dkstream_puts_double(bj->os, 0.0);
	          kw_out(bj, 1);
                  dkstream_puts_double(bj->os, ((bj->trans).iu.x1 - (bj->trans).iu.x0));
	          kw_out(bj, 1);
                  dkstream_puts_double(bj->os, ((bj->trans).iu.y1 - (bj->trans).iu.y0));
		} else {
		  dkstream_puts_ul(bj->os, (bj->trans).bb.x0);
		  kw_out(bj, 1);
		  dkstream_puts_ul(bj->os, (bj->trans).bb.y0);
		  kw_out(bj, 1);
		  dkstream_puts_ul(bj->os, (bj->trans).bb.x1);
		  kw_out(bj, 1);
		  dkstream_puts_ul(bj->os, (bj->trans).bb.y1);
		}
		kw_out(bj, 11); kw_out(bj, 0);
		kw_out(bj, 30); kw_out(bj, 1);
		pdf_open_dictionary(bj); kw_out(bj, 1);
		kw_out(bj, 31); kw_out(bj, 1);
		kw_out(bj, 10); kw_out(bj, 33); kw_out(bj, 11);
		pdf_close_dictionary(bj); kw_out(bj, 0);
		kw_out(bj, 36); kw_out(bj, 1);
		pdf_write_reference(bj, csp+i); kw_out(bj, 0);
		pdf_close_dictionary(bj); kw_out(bj, 0);
		pdf_end_object(bj);
		pdf_begin_object(bj, csp+i);
		pdf_open_dictionary(bj);
		kw_out(bj, 38); kw_out(bj, 1);
		dkstream_puts_ul(bj->os, filesize);
#if !DEBUG
		kw_out(bj, 1); kw_out(bj, 57); kw_out(bj, 1); kw_out(bj, 10);
		if((bj->bo2)->enc & BMEPS_ENCODING_ASCII85) {
		  kw_out(bj, 42);
		} else {
		  kw_out(bj, 41);
		}
		if((bj->bo2)->enc & BMEPS_ENCODING_FLATE) {
		  kw_out(bj, 1); kw_out(bj, 44);
		} else {
		}
		kw_out(bj, 11);
#endif
		pdf_close_dictionary(bj); kw_out(bj, 0);
		kw_out(bj, 39); kw_out(bj, 0);
		transfer_file_to_stream(bj->os, gfile, filesize);
		kw_out(bj, 40); kw_out(bj, 0);
		pdf_end_object(bj);
	        fclose(gfile); gfile = NULL;
	      } else {
	        bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 62, 63, bj->tmp2);
	        bj->exval = 1;
	      }
	    } else {
	      bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 64, 65, bj->tmp2);
	      bj->exval = 1;
	    }
	  }
	} else {
	  bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 66, 67, bj->tmp2);
	  bj->exval = 1;
	}
      } else {
	bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 72); bj->exval = 1;
      }
    } else {
      bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 71); bj->exval = 1;
    }
    fno++; i++;
    
  }
  
}



static
void
pdf_file_objects DK_P2(BJ *,bj, int,how)
{
  switch(how) {
    case 1: {	
#if DK_HAVE_JPEGLIB_H
      pdf_file_objects_dct(bj);
#else
      pdf_file_objects_normally(bj);
#endif
    } break;
    case 2: {	
      pdf_file_objects_draft(bj);
    } break;
    default: {	
      pdf_file_objects_normally(bj);
    } break;
  }
}



static
void
pdf_file_end DK_P2(BJ *,bj, int,how)
{
  unsigned long i;
  unsigned long pos, start_xref;
  char buffer[32];
  PDFOBJPOS *pop;
  start_xref = dkstream_get_bytes_written(bj->os);
  kw_out(bj, 12); kw_out(bj, 1);
  dkstream_puts_ul(bj->os, 0UL);
  kw_out(bj, 1);
  dkstream_puts_ul(bj->os, bj->nexto);
  kw_out(bj, 0);
  kw_out(bj, 16); kw_out(bj, 0);
  for(i = 1UL; i < bj->nexto; i++) {
    pos = 0UL;
    pop = dksto_it_find_like(bj->pdfobjsi, (void *)(&i), 1);
    if(pop) { pos = pop->pos; }
    sprintf(buffer, kw[17], pos);
    dkstream_puts(bj->os, buffer); kw_out(bj, 0);
  }
  kw_out(bj, 13); kw_out(bj, 0);
  pdf_open_dictionary(bj); kw_out(bj, 1);
  kw_out(bj, 18); kw_out(bj, 1);
  dkstream_puts_ul(bj->os, bj->nexto); kw_out(bj, 1);
  kw_out(bj, 19); kw_out(bj, 1);
  pdf_close_dictionary(bj); kw_out(bj, 0);
  kw_out(bj, 14); kw_out(bj, 0);
  dkstream_puts_ul(bj->os, start_xref); kw_out(bj, 0);
  kw_out(bj, 15); kw_out(bj, 0);
}



/*
	0 ... normal
	1 ... DCT
	2 ... draft
*/
void
bmeps_pdf DK_P2(BJ *,bj, int,how)
{
  PDFOBJPOS *pop;
  BO mybo;
  if(bj) {
    bj->bo2 = &mybo;
    bj->pdfobjs = dksto_open(0);
    if(bj->pdfobjs) {
      dksto_set_comp(bj->pdfobjs, compare_obj_pos, 0);
      bj->pdfobjsi = dksto_it_open(bj->pdfobjs);
      if(bj->pdfobjsi) {
        bj->nexto = 1UL;
	bj->frame_n = bj->frame_e - bj->frame_s + 1L;
	pdf_file_start(bj, how);
	pdf_file_objects(bj, how);
	pdf_file_end(bj, how);
	dksto_it_reset(bj->pdfobjsi);
	/* release objects */
	while((pop = dksto_it_next(bj->pdfobjsi)) != NULL) {
	  dk_delete(pop);
	}
        dksto_it_close(bj->pdfobjsi); bj->pdfobjsi = NULL;
      } else {
	bmeps_tool_error_memory(bj);
      }
      dksto_close(bj->pdfobjs); bj->pdfobjs = NULL;
    } else {
      bmeps_tool_error_memory(bj);
    }
    bj->bo2 = NULL;
  }
}



#ifndef LINT
static char sccs_id[] = {
"@(#)b2pdf.ctr 1.19 06/26/08\tbmeps2"
};
#endif

