/* Copyright (c) 2000-2010, Dirk Krause All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above opyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Dirk Krause nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @file b2pdf.c Conversion to PDF. */ /** Inside the b2pdf.c module. */ #define B2PDF_C 1 #include "bmepsi.h" #include "bmeps.h" $(trace-include) /** Keywords used for output. */ 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 <>", /* 88 */ "/Predictor ", /* 89 */ "/DecodeParms", /* 90 */ "null", /* 91 */ "/Colors", /* 92 */ "/Columns", /* 93 */ "3", /* 94 */ "1", NULL }; /** Number of elements in kw. */ static size_t sz_kw = sizeof(kw)/sizeof(PCHAR); /** Open a dictionary. */ #define pdf_open_dictionary(bj) kw_out(bj, 6) /** Close a dictionary. */ #define pdf_close_dictionary(bj) kw_out(bj, 7) /** Print one keyword to output stream. @param bj Bmeps job. @param i Index of keyword to print. */ 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]); } } } } /** Write reference to another object. @param bj Bmeps job. @param n Index of object to reference. */ 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); } /** Begin PDF object. @param bj Bmeps job. @param objno Number of new object. */ static int pdf_begin_object DK_P2(BJ *,bj, unsigned long,objno) { int back = 0; /* Function result. */ PDFOBJPOS *pop; /* PDF object position. */ 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; } /** End PDF object. @param bj Bmeps job. */ static void pdf_end_object DK_P1(BJ *,bj) { kw_out(bj, 9); kw_out(bj, 0); } /** Compare two PDF object positions. @param l Pointer to left object position. @param r Pointer to right object position. @param cr Comparison criteria. @return The comparison result. */ 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; } /** Start PDF file. @param bj Bmeps job @param how Ignored. */ 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); } $? ". pdfopt = %lu", (bj->bo)->pdfopt 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); } /** Transfer entire file. @param bj Bmeps job. @param os Output stream. @param f Input file. */ 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; $? "+ transfer_file_to_stream" 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; } $? "- transfer_file_to_stream" } /** Transfer a file to a stream. @param os Output stream. @param f Input file. @param fs File size. */ 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; $? "+ transfer_file_to_stream" 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; } } $? "- transfer_file_to_stream" } /** Calculate value to pass to flate compression for PNG sub predictor. @param v Current value. @param v1 Value one point to the left. @return Difference v - v1. */ static unsigned char png_sub DK_P2(unsigned char,v, unsigned char,v1) { unsigned char back; back = v - v1; return back; } /** Calculate value to pass to flate compression for PNG up predictor. @param v Current value. @param v2 Value one row up. @return Difference v - v2. */ static unsigned char png_up DK_P2(unsigned char,v, unsigned char,v2) { unsigned char back; back = v - v2; return back; } /** Calculate value to pass to flate compression for PNG avg predictor. @param v Current value. @param v1 Value one point to the left. @param v2 Value one row up. @return Difference v - (v1 + v2)/2. */ static unsigned char png_avg DK_P3(unsigned char,v, unsigned char,v1, unsigned char,v2) { unsigned char back; back = v - (unsigned char)((((unsigned short)v1 + (unsigned short)v2) / 2) & 0x00FF); return back; } /** Caluclate Paeth prediction value. @param v1 Value one point to the left. @param v2 Value one row up. @param v3 Value one row up one point to the left. @return Predicted value. */ static unsigned char png_pp DK_P3(unsigned char,v1, unsigned char,v2, unsigned char,v3) { unsigned char back; short p, pa, pb, pc; p = (short)v1 + (short)v2 - (short)v3; pa = p - (short)v1; pb = p - (short)v2; pc = p - (short)v3; if(pa < 0) pa = 0 - pa; if(pb < 0) pb = 0 - pb; if(pc < 0) pc = 0 - pc; if((pa <= pb) && (pa <= pc)) { back = v1; } else { if(pb <= pc) { back = v2; } else { back = v3; } } return back; } /** Calculate value to pass to flate compression for PNG Paeth predictor. @param v Current value. @param v1 Value one point to the left. @param v2 Value one row up. @param v3 Value one row up one point to the left. @return Difference v - paeth(v1,v2,v3). */ static unsigned char png_paeth DK_P4(unsigned char,v, unsigned char,v1, unsigned char,v2, unsigned char,v3) { unsigned char back; back = v - png_pp(v1,v2,v3); return back; } /** Retrieve high byte from 16-bit value. @param v 16-bit value. @return Higher byte. */ static unsigned char hb DK_P1(unsigned short, v) { unsigned char back; back = (unsigned char)((v >> 8) & 0x00FF); return back; } /** Retrieve low byte from 16-bit value. @param v 16-bit value. @return Lower byte. */ static unsigned char lb DK_P1(unsigned short,v) { unsigned char back; back = (unsigned char)(v & 0x00FF); return back; } /** Create word from two bytes. @param h Higher byte. @param l Lower byte. @return Word constructed from the two bytes. */ static unsigned short mw DK_P2(unsigned char,h, unsigned char,l) { unsigned short back; back = ((((unsigned short)h) << 8) & 0xFF00) | (((unsigned short)l) & 0x00FF); return back; } /** Create objects structure for normal conversion. @param bj Bmeps job. */ 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 */ $? "+ pdf_file_objects_normally" 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) { $? ". start of loop" use_mask_or_alpha = 0x00; dkmem_cpy(bj->bo2, bj->bo, sizeof(BO)); $? ". dkmem_cpy ok" if(dkbif_set_frame(bj->bif, fno)) { $? ". set frame ok" data_ok = 0; mask_ok = 0; bmeps_tool_calculate_areas(bj); $? ". calculate areas ok" 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); $? ", set bits per component ok" switch(dkbif_get_channels(bj->bif)) { case 2: case 4: { $? ". alpha" if((bj->bo2)->opt & BMEPS_OPT_TRANSFER_ALPHA) { $? ". transfer alpha" use_mask_or_alpha = 0x01; } else { $? ". no alpha transfer" if((bj->bo2)->opt & BMEPS_OPT_IMAGE_MASK) { $? ". mask creation" dkbif_set_mask_trigger_level(bj->bif, (bj->bo2)->mtl); use_mask_or_alpha = 0x01; } if((bj->bo2)->opt & BMEPS_OPT_ALPHA_MIX) { $? ". mixing" 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: { $? ". no alpha" (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; } $? ". channel check ok" /* 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 */ fputs("1 0 0 1 ", gfile); dkma_fputs_double_no_exp(gfile, (bj->trans).iu.x0); fputc(' ', gfile); dkma_fputs_double_no_exp(gfile, (bj->trans).iu.y0); fputs(" cm", gfile); fprintf(gfile, "%s", kw[0]); dkma_fputs_double_no_exp(gfile, (bj->trans).sfx); fputs(" 0 0 ", gfile); dkma_fputs_double_no_exp(gfile, (bj->trans).sfy); fputs(" 0 0 cm", gfile); fprintf(gfile, "%s", 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 */ fputs("1 0 0 1 ", gfile); dkma_fputs_double_no_exp(gfile, (bj->trans).iu.x0); fputc(' ', gfile); dkma_fputs_double_no_exp(gfile, (bj->trans).iu.y0); fputs(" cm", gfile); fprintf(gfile, "%s", kw[0]); } dkma_fputs_double_no_exp(gfile, (bj->trans).sfx); fputs(" 0 0 ", gfile); dkma_fputs_double_no_exp(gfile, (bj->trans).sfy); fputs(" 0 0 cm", gfile); fprintf(gfile, "%s", 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 = dksf_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)) { $? ". have flate or lzw" number_of_filters++; } if((bj->bo2)->enc & BMEPS_ENCODING_RUNLENGTH) { $? ". have run-length" number_of_filters++; } ofs1 = dkstream_openfile(bj->tmp2, "wb", 0, &dummy); if(ofs1) { $? ". ofs1 opened successfully" ofs2 = dkof_open(ofs1, number_of_filters); if(ofs2) { $? ". ofs2 opened successfully" obs = NULL; if(bpc != 8) { $? ". need bitshifter" obs = dkof_bs_open(ofs2); } if((bpc == 8) || (obs)) { $? ". bitshifter ok" data_ok = 1; if(!dkof_set(ofs2, 0, DK_OF_TYPE_BUFFERED)) { data_ok = 0; $? "! failed to set up buffering" } if((bj->bo2)->enc & BMEPS_ENCODING_ASCII85) { if(!dkof_set(ofs2, 1, DK_OF_TYPE_ASCII85)) { data_ok = 0; $? "! failed to set up ascii85" } } else { if(!dkof_set(ofs2, 1, DK_OF_TYPE_ASCIIHEX)) { data_ok = 0; $? "! failed to set up asciihex" } } 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; $? "! failed to set up flate" } } else { } if((bj->bo2)->enc & BMEPS_ENCODING_RUNLENGTH) { $? ". number_of_filters=%u nf=%u", (unsigned)number_of_filters, (unsigned)nf if(!dkof_set(ofs2, nf, DK_OF_TYPE_PSRL)) { data_ok = 0; $? "! failed to set up run-length" } } if(data_ok) { $? ". setup ok" if(dkof_start_chunk(ofs2)) { $? ". chunk started" ch = dkbif_get_channels(bj->bif); if((bj->bo2)->pred == BMEPS_PREDICTOR_INPUT) { $? ". retrieve predictor setting from input" (bj->bo2)->pred = BMEPS_PREDICTOR_NONE; $? ". dkbif_get_predictor => %d", dkbif_get_predictor(bj->bif) switch(dkbif_get_predictor(bj->bif)) { case DKBIF_PREDICTOR_PIXEL_SUB: { (bj->bo2)->pred = BMEPS_PREDICTOR_TIFF; } break; case DKBIF_PREDICTOR_BYTE_SUB: { (bj->bo2)->pred = BMEPS_PREDICTOR_PNG_SUB; } break; case DKBIF_PREDICTOR_BYTE_UP: { (bj->bo2)->pred = BMEPS_PREDICTOR_PNG_UP; } break; case DKBIF_PREDICTOR_BYTE_AVG: { (bj->bo2)->pred = BMEPS_PREDICTOR_PNG_AVERAGE; } break; case DKBIF_PREDICTOR_BYTE_PAETH: { (bj->bo2)->pred = BMEPS_PREDICTOR_PNG_PAETH; } break; } } if((bpc != 8) && (bpc != 16)) { $? ". no PNG prediction" switch((bj->bo2)->pred) { case BMEPS_PREDICTOR_PNG_SUB: case BMEPS_PREDICTOR_PNG_AVERAGE: case BMEPS_PREDICTOR_PNG_PAETH: { (bj->bo2)->pred = BMEPS_PREDICTOR_TIFF; $? ". use TIFF predictor" } break; default: { (bj->bo2)->pred = BMEPS_PREDICTOR_NONE; $? ". use no predictor" } break; } } if((bj->bo2)->enc & BMEPS_ENCODING_RUNLENGTH) { (bj->bo2)->pred = BMEPS_PREDICTOR_NONE; $? ". run-length, no predictor" } if(((bj->bo2)->enc & BMEPS_ENCODING_FLATE) && ((bj->bo2)->pred)) { switch((bj->bo2)->pred) { case BMEPS_PREDICTOR_TIFF: { unsigned short or, og, ob, nr, ng, nb; $? ". use tiff predictor" for(iy = 0UL; iy < h; iy++) { or = og = ob = 0; 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)) { nr = dkbif_get_red(bj->bif, x, y); dkof_bs_put( obs, (unsigned short)(nr - or), (unsigned short)bpc ); or = nr; ng = dkbif_get_green(bj->bif, x, y); dkof_bs_put( obs, (unsigned short)(ng - og), (unsigned short)bpc ); og = ng; nb = dkbif_get_blue(bj->bif, x, y); dkof_bs_put( obs, (unsigned short)(nb - ob), (unsigned short)bpc ); ob = nb; } else { nr = dkbif_get_red(bj->bif, x, y); ng = dkbif_get_green(bj->bif, x, y); nb = dkbif_get_blue(bj->bif, x, y); c = (unsigned char)(nr - or); dkstream_write(ofs2, (char *)(&c), 1); c = (unsigned char)(ng - og); dkstream_write(ofs2, (char *)(&c), 1); c = (unsigned char)(nb - ob); dkstream_write(ofs2, (char *)(&c), 1); or = nr; og = ng; ob = nb; } } else { if((bpc != 8) && (obs)) { ng = dkbif_get_gray(bj->bif, x, y); dkof_bs_put( obs, (unsigned short)(ng - og), (unsigned short)bpc ); og = ng; } else { ng = dkbif_get_gray(bj->bif, x, y); c = (unsigned char)(ng - og); dkstream_write(ofs2, (char *)(&c), 1); og = ng; } } } if(obs) { dkof_bs_flush(obs); } } } break; case BMEPS_PREDICTOR_PNG_SUB: case BMEPS_PREDICTOR_PNG_UP: case BMEPS_PREDICTOR_PNG_AVERAGE: case BMEPS_PREDICTOR_PNG_PAETH: { unsigned long x1, y1, x2, y2, x3, y3; unsigned short r, g, b, r1, g1, b1, r2, g2, b2, r3, g3, b3; $? ". use PNG predictors" for(iy = 0UL; iy < h; iy++) { /* Row filtertype byte */ switch((bj->bo2)->pred) { case BMEPS_PREDICTOR_PNG_SUB: { c = 0x01; } break; case BMEPS_PREDICTOR_PNG_UP: { c = 0x02; } break; case BMEPS_PREDICTOR_PNG_AVERAGE: { c = 0x03; } break; case BMEPS_PREDICTOR_PNG_PAETH: { c = 0x04; } break; } dkstream_write(ofs2, (char *)(&c), 1); for(j = 0UL; j < w; j++) { y = iy; x = j; x1 = x - 1UL; y1 = y; x2 = x; y2 = y - 1UL; x3 = x - 1UL; y3 = y - 1UL; if((bj->trans).must_rotate) { $? ". rotation" x = iy; y = w - 1UL - j; x1 = x; y1 = y + 1UL; x2 = x - 1UL; y2 = y; x3 = x - 1UL; y3 = y1; } if((bj->bo2)->opt & BMEPS_OPT_COLOR_OUTPUT) { $? ". colored pixel x=%lu y=%lu", x, y r = dkbif_get_red(bj->bif, x, y); g = dkbif_get_green(bj->bif, x, y); b = dkbif_get_blue(bj->bif, x, y); $? ". get left pixel data" r1 = dkbif_get_red(bj->bif, x1, y1); g1 = dkbif_get_green(bj->bif, x1, y1); b1 = dkbif_get_blue(bj->bif, x1, y1); $? ". get upper pixel data" r2 = dkbif_get_red(bj->bif, x2, y2); g2 = dkbif_get_green(bj->bif, x2, y2); b2 = dkbif_get_blue(bj->bif, x2, y2); $? ". get upper left pixel data" r3 = dkbif_get_red(bj->bif, x3, y3); g3 = dkbif_get_green(bj->bif, x3, y3); b3 = dkbif_get_blue(bj->bif, x3, y3); if(bpc == 16) { $? ". 16 bit" switch((bj->bo2)->pred) { case BMEPS_PREDICTOR_PNG_SUB: { $? ". png sub" r = mw(png_sub(hb(r), hb(r1)), png_sub(lb(r), lb(r1))); g = mw(png_sub(hb(g), hb(g1)), png_sub(lb(g), lb(g1))); b = mw(png_sub(hb(b), hb(b1)), png_sub(lb(b), lb(b1))); } break; case BMEPS_PREDICTOR_PNG_UP: { $? ". png up" r = mw(png_up(hb(r), hb(r2)), png_up(lb(r), lb(r2))); g = mw(png_up(hb(g), hb(g2)), png_up(lb(g), lb(g2))); b = mw(png_up(hb(b), hb(b2)), png_up(lb(b), lb(b2))); } break; case BMEPS_PREDICTOR_PNG_AVERAGE: { $? ". png avg" r = mw(png_avg(hb(r), hb(r1), hb(r2)), png_avg(lb(r), lb(r1), lb(r2))); g = mw(png_avg(hb(g), hb(g1), hb(g2)), png_avg(lb(g), lb(g1), lb(g2))); b = mw(png_avg(hb(b), hb(b1), hb(b2)), png_avg(lb(b), lb(b1), lb(b2))); } break; case BMEPS_PREDICTOR_PNG_PAETH: { $? ". png paeth" r = mw(png_paeth(hb(r), hb(r1), hb(r2), hb(r3)), png_paeth(lb(r), lb(r1), lb(r2), lb(r3))); g = mw(png_paeth(hb(g), hb(g1), hb(g2), hb(g3)), png_paeth(lb(g), lb(g1), lb(g2), lb(g3))); b = mw(png_paeth(hb(b), hb(b1), hb(b2), hb(b3)), png_paeth(lb(b), lb(b1), lb(b2), lb(b3))); } break; } dkof_bs_put(obs, r, (unsigned short)bpc); dkof_bs_put(obs, g, (unsigned short)bpc); dkof_bs_put(obs, b, (unsigned short)bpc); } else { $? ". 8 bit" switch((bj->bo2)->pred) { case BMEPS_PREDICTOR_PNG_SUB: { $? ". png sub" r = mw(0x00, png_sub(lb(r), lb(r1))); g = mw(0x00, png_sub(lb(g), lb(g1))); b = mw(0x00, png_sub(lb(b), lb(b1))); } break; case BMEPS_PREDICTOR_PNG_UP: { $? ". png up" r = mw(0x00, png_up(lb(r), lb(r2))); g = mw(0x00, png_up(lb(g), lb(g2))); b = mw(0x00, png_up(lb(b), lb(b2))); } break; case BMEPS_PREDICTOR_PNG_AVERAGE: { $? ". png avg" r = mw(0x00, png_avg(lb(r), lb(r1), lb(r2))); g = mw(0x00, png_avg(lb(g), lb(g1), lb(g2))); b = mw(0x00, png_avg(lb(b), lb(b1), lb(b2))); } break; case BMEPS_PREDICTOR_PNG_PAETH: { $? ". png paeth" r = mw(0x00, png_paeth(lb(r), lb(r1), lb(r2), lb(r3))); g = mw(0x00, png_paeth(lb(g), lb(g1), lb(g2), lb(g3))); b = mw(0x00, png_paeth(lb(b), lb(b1), lb(b2), lb(b3))); } break; } c = (unsigned char)(r & 0x00FF); dkstream_write(ofs2, (char *)(&c), 1); c = (unsigned char)(g & 0x00FF); dkstream_write(ofs2, (char *)(&c), 1); c = (unsigned char)(b & 0x00FF); dkstream_write(ofs2, (char *)(&c), 1); } } else { $? ". gray pixel x=%lu y=%lu", x, y r = dkbif_get_gray(bj->bif, x, y); $? ". get left pixel" r1 = dkbif_get_gray(bj->bif, x1, y1); $? ". get upper pixel" r2 = dkbif_get_gray(bj->bif, x2, y2); $? ". get upper left pixel" r3 = dkbif_get_gray(bj->bif, x3, y3); if(bpc == 16) { $? ". 16 bit" switch((bj->bo2)->pred) { case BMEPS_PREDICTOR_PNG_SUB: { $? ". png sub" r = mw(png_sub(hb(r), hb(r1)), png_sub(lb(r), lb(r1))); } break; case BMEPS_PREDICTOR_PNG_UP: { $? ". png up" r = mw(png_up(hb(r), hb(r2)), png_up(lb(r), lb(r2))); } break; case BMEPS_PREDICTOR_PNG_AVERAGE: { $? ". png avg" r = mw(png_avg(hb(r), hb(r1), hb(r2)), png_avg(lb(r), lb(r1), lb(r2))); } break; case BMEPS_PREDICTOR_PNG_PAETH: { $? ". png paeth" r = mw(png_paeth(hb(r), hb(r1), hb(r2), hb(r3)), png_paeth(lb(r), lb(r1), lb(r2), lb(r3))); } break; } dkof_bs_put(obs, r, (unsigned short)bpc); } else { $? ". 8 bit" switch((bj->bo2)->pred) { case BMEPS_PREDICTOR_PNG_SUB: { $? ". png sub" r = mw(0x00, png_sub(lb(r), lb(r1))); } break; case BMEPS_PREDICTOR_PNG_UP: { $? ". png up" r = mw(0x00, png_up(lb(r), lb(r2))); } break; case BMEPS_PREDICTOR_PNG_AVERAGE: { $? ". png avg" r = mw(0x00, png_avg(lb(r), lb(r1), lb(r2))); } break; case BMEPS_PREDICTOR_PNG_PAETH: { $? ". png paeth" r = mw(0x00, png_paeth(lb(r), lb(r1), lb(r2), lb(r3))); } break; } c = (unsigned char)(r & 0x00FF); dkstream_write(ofs2, (char *)(&c), 1); } } } } } break; } } else { 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; $? "! failed to finish chunk" } else { $? ". chunk finished" } } else { $? "! failed to start chunk" bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 69); bj->exval = 1; } } else { $? "! setup problem" } } else { bmeps_tool_error_memory(bj); bj->exval = 1; } if(obs) { dkof_bs_close(obs); } obs = NULL; dkof_close(ofs2); ofs2 = NULL; } else { $? "! failed to open osf2" bmeps_tool_error_memory(bj); bj->exval = 1; } dkstream_close(ofs1); ofs1 = NULL; } else { $? "! failed to open osf1" bmeps_tool_error_memory(bj); bj->exval = 1; } if(use_mask_or_alpha) { $? ". create alpha data or mask" ofs1 = dkstream_openfile(bj->tmp3, "wb", 0, &dummy); if(ofs1) { $? ". output stream opened" ofs2 = dkof_open(ofs1, number_of_filters); if(ofs2) { $? ". filter stream opened" mask_ok = 1; if(!dkof_set(ofs2, 0, DK_OF_TYPE_BUFFERED)) { mask_ok = 0; $? "! failed to set up buffering" } if((bj->bo2)->enc & BMEPS_ENCODING_ASCII85) { if(!dkof_set(ofs2, 1, DK_OF_TYPE_ASCII85)) { mask_ok = 0; $? "! failed to set up ascii85" } } else { if(!dkof_set(ofs2, 1, DK_OF_TYPE_ASCIIHEX)) { mask_ok = 0; $? "! failed to set up asciihex" } } 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; $? "! failed to set up flate" } } else { } if((bj->bo2)->enc & BMEPS_ENCODING_RUNLENGTH) { $? ". number_of_filters=%u nf=%u", (unsigned)number_of_filters, (unsigned)nf if(!dkof_set(ofs2, nf, DK_OF_TYPE_PSRL)) { mask_ok = 0; $? "! failed to set up run-length" } } if(mask_ok) { if(dkof_start_chunk(ofs2)) { if((bj->bo2)->opt & BMEPS_OPT_TRANSFER_ALPHA) { $? ". alpha" obs = NULL; $? ". bpc = %lu", (unsigned long)bpc if(bpc != 8) { obs = dkof_bs_open(ofs2); } if((bpc == 8) || (obs)) { $? ". bit shifter ok" 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 { $? "! failed to open bit shifter" bmeps_tool_error_memory(bj); bj->exval = 1; } } else { $? ". mask" obs = dkof_bs_open(ofs2); if(obs) { $? ". bit shifter ok" 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 { $? "! failed to open bit shifter" bmeps_tool_error_memory(bj); bj->exval = 1; } } if(!dkof_end_chunk(ofs2)) { $? "! failed to finish chunk" 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 { $? "! failed to set up output encoding" bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 70); bj->exval = 1; } dkof_close(ofs2); ofs2 = NULL; } else { $? "! failed to open filter stream" bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 70); bj->exval = 1; } dkstream_close(ofs1); ofs1 = NULL; } else { $? "! failed to open output stream" bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 66, 67, bj->tmp3); bj->exval = 1; } } $? ". data_ok=%d mask_ok=%d umoa=%d", (int)data_ok, (int)mask_ok, (int)use_mask_or_alpha if(data_ok && ((mask_ok) || (use_mask_or_alpha == 0x00))) { $? ". conditions ok" if(dkstat_get(&stbuf, bj->tmp2)) { $? ". stat ok" filesize = (unsigned long)dkstat_size(&stbuf); pdf_begin_object(bj, bj->nexto); bj->nexto += 1UL; gfile= dksf_fopen(bj->tmp2, "rb"); if(gfile) { $? ". fopen ok" 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); if((bj->bo2)->enc & BMEPS_ENCODING_FLATE) { switch((bj->bo2)->pred) { case BMEPS_PREDICTOR_TIFF: case BMEPS_PREDICTOR_PNG_SUB: case BMEPS_PREDICTOR_PNG_UP: case BMEPS_PREDICTOR_PNG_AVERAGE: case BMEPS_PREDICTOR_PNG_PAETH: { // kw_out(bj, 88); kw_out(bj, 0); kw_out(bj, 89); kw_out(bj, 1); kw_out(bj, 10); kw_out(bj, 0); kw_out(bj, 1); kw_out(bj, 1); kw_out(bj, 90); kw_out(bj, 0); // flate predictor dictionary kw_out(bj, 1); kw_out(bj, 1); kw_out(bj, 6); kw_out(bj, 88); switch((bj->bo2)->pred) { case BMEPS_PREDICTOR_TIFF: { dkstream_puts_ul(bj->os, 2UL); } break; case BMEPS_PREDICTOR_PNG_SUB: { dkstream_puts_ul(bj->os, 11UL); } break; case BMEPS_PREDICTOR_PNG_UP: { dkstream_puts_ul(bj->os, 12UL); } break; case BMEPS_PREDICTOR_PNG_AVERAGE: { dkstream_puts_ul(bj->os, 13UL); } break; case BMEPS_PREDICTOR_PNG_PAETH: { dkstream_puts_ul(bj->os, 14UL); } break; } kw_out(bj, 1); kw_out(bj, 55); kw_out(bj, 1); dkstream_puts_ul(bj->os, bpc); kw_out(bj, 1); kw_out(bj, 91); kw_out(bj, 1); if((bj->bo2)->opt & BMEPS_OPT_COLOR_OUTPUT) { kw_out(bj, 93); } else { kw_out(bj, 94); } kw_out(bj, 1); kw_out(bj, 92); kw_out(bj, 1); dkstream_puts_ul(bj->os, w); kw_out(bj, 7); kw_out(bj, 0); if((bj->bo2)->enc & BMEPS_ENCODING_RUNLENGTH) { kw_out(bj, 1); kw_out(bj, 1); kw_out(bj, 90); kw_out(bj, 0); } kw_out(bj, 11); kw_out(bj, 0); } break; } } 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 { $? "! fopen failed" 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 = dksf_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 { $? "! stat failed" bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 64, 65, bj->tmp2); bj->exval = 1; } } else { $? "! conditions wrong" } } else { bmeps_tool_msg_1(bj, DK_LOG_LEVEL_ERROR, 71); bj->exval = 1; } fno++; i++; } $? "- pdf_file_objects_normally" } /** Create PDF object structure for DCT-pass-through. @param bj Bmeps job. */ 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 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 */ FILE *gfile = NULL; /* temporary file */ $? "+ pdf_objects_dct" 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) { fputs("1 0 0 1 ", gfile); dkma_fputs_double_no_exp(gfile, 0.5*((bj->trans).iu.x0 + (bj->trans).iu.x1)); fputc(' ', gfile); dkma_fputs_double_no_exp(gfile, 0.5*((bj->trans).iu.y1 + (bj->trans).iu.y0)); fputs(" cm", gfile); fprintf(gfile, "%s", kw[0]); fprintf( gfile, "0 -1 1 0 0 0 cm%s", kw[0] ); dkma_fputs_double_no_exp(gfile, 0.5*(bj->trans).sfy); fputs(" 0 0 ", gfile); dkma_fputs_double_no_exp(gfile, 0.5*(bj->trans).sfx); fputs(" 0 0 cm", gfile); fprintf(gfile, "%s", kw[0]); fprintf(gfile, "%lu 0 0 %lu 0 0 cm%s", origw, origh, kw[0]); } #else if((bj->trans).must_rotate) { fputs("1 0 0 1 ", gfile); dkma_fputs_double_no_exp(gfile, (bj->trans).iu.x0); fputc(' ', gfile); dkma_fputs_double_no_exp(gfile, (bj->trans).iu.y1); fputs(" cm", gfile); fprintf(gfile, "%s", kw[0]); fprintf( gfile, "0 -1 1 0 0 0 cm%s", kw[0]); dkma_fputs_double_no_exp(gfile, (bj->trans).sfy); fputs(" 0 0 ", gfile); dkma_fputs_double_no_exp(gfile, (bj->trans).sfx); fputs(" 0 0 cm", gfile); fprintf(gfile, "%s", kw[0]); fprintf(gfile, "%lu 0 0 %lu 0 0 cm%s", origw, origh, kw[0]); } #endif else { fputs("1 0 0 1 ", gfile); dkma_fputs_double_no_exp(gfile, (bj->trans).iu.x0); fputc(' ', gfile); dkma_fputs_double_no_exp(gfile, (bj->trans).iu.y0); fputs(" cm", gfile); fprintf(gfile, "%s", kw[0]); dkma_fputs_double_no_exp(gfile, (bj->trans).sfx); fputs(" 0 0 ", gfile); dkma_fputs_double_no_exp(gfile, (bj->trans).sfy); fputs(" 0 0 cm", gfile); fprintf(gfile, "%s", kw[0]); } } break; case 1: { /* use resolution */ if(0) { /* remove these lines if PDF output is ok */ fputs("1 0 0 1 ", gfile); dkma_fputs_double_no_exp(gfile, (bj->trans).iu.x0); fputc(' ', gfile); dkma_fputs_double_no_exp(gfile, (bj->trans).iu.y0); fputs(" cm", gfile); fprintf(gfile, "%s", kw[0]); } dkma_fputs_double_no_exp(gfile, (bj->trans).sfx); fputs(" 0 0 ", gfile); dkma_fputs_double_no_exp(gfile, (bj->trans).sfy); fputs(" 0 0 cm", gfile); fprintf(gfile, "%s", 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 = dksf_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= dksf_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); $? "- pdf_objects_dct" #endif } /** Print one keyword to ofs2. */ #define DKSP(i) dkstream_puts(ofs2, kw[i]) /** Create draft PDF. @param bj Bmeps job. */ 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; $? "+ pdf_file_objects_draft" 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) { $? ". start of loop" 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)) { $? ". set frame ok" 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)) { $? ". have flate or lzw" 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 = dksf_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++; $? ". end of loop" } $? "- pdf_file_objects_draft" } /** Create PDF object structure. @param bj Bmeps job. @param how 0=normal,1=DCT,2=draft. */ static void pdf_file_objects DK_P2(BJ *,bj, int,how) { switch(how) { case 1: { $? ". dct" #if DK_HAVE_JPEGLIB_H pdf_file_objects_dct(bj); #else pdf_file_objects_normally(bj); #endif } break; case 2: { $? ". draft" pdf_file_objects_draft(bj); } break; default: { $? ". normally" pdf_file_objects_normally(bj); } break; } } /** Finish PDF file (write xref table). @param bj Bmeps job. @param how Ignored. */ 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); } /** Convert to PDF. @param bj Bmeps job. @param how Conversion type (0=normal, 1=DCT-passthrough, 2=draft. */ void bmeps_pdf DK_P2(BJ *,bj, int,how) { PDFOBJPOS *pop; BO mybo; if(bj) { if(bj->os) { dkstream_set_double_no_exponent(bj->os, 1); } 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; } }