%% options copyright owner = Dirk Krause copyright year = 2011-2014 license = bsd %% header #ifdef __cplusplus extern "C" { #endif /** Process one file name. This function is the entry point used by bmeps3 and wxbmeps. The opt->app component must be set. @param opt Option set for conversion. @param sfn Source file name. @param biftype Bitmap image file type. @param min Progress bar value at start of processing. @param max Progress bar value at end of processing. @param comm Communicator object from wxbmeps. @return 1 on success, 0 on error. */ int dk3bm_process_file_name( dk3_bm_eps_options_t *opt, dkChar const *sfn, int biftype, int min, int max, void *comm ); /** Place a PS object in a given range. This is the entry point used by Fig to PS/EPS conversion. @param dfile Destination file. @param outbb Image area. @param drawdir Draw direction / coordinates origin. @param sfn Source file name. @param app Application structure. @param pslevel PS level. @param ec Pointer to error code variable, may be NULL. @return 1 on success, 0 on error. */ int dk3bm_ps_place_object( FILE *dfile, dk3_bb_t *outbb, int drawdir, char const *sfn, dk3_app_t *app, int pslevel, int *ec ); /** Find graphics state transformations to place an object. @param dst Graphics state transformation structure. @param outbb Reserved range for image. @param drawdir Drawing directory / coordinates origin. @param imw Image width in pixels. @param imh Image height in pixels. @param xres X resolution. @param yres Y resolution. @param ec Pointer to error code variable. @return 1 on success, 0 on error. */ int dk3bm_find_transformation( dk3_coordinates_transformation_t *dst, dk3_bb_t *outbb, int drawdir, double imw, double imh, double xres, double yres, int *ec ); /** Find graphics state transformations to place an object. @param dst Graphics state transformation structure. @param bif Image to place. @param outbb Reserved range for image. @param drawdir Drawing directory / coordinates origin. @param ec Pointer to error code variable. @return 1 on success, 0 on error. */ int dk3bm_find_bif_transformation( dk3_coordinates_transformation_t *dst, dk3_bif_t *bif, dk3_bb_t *outbb, int drawdir, int *ec ); #ifdef __cplusplus } #endif %% module #include "dk3all.h" #include "dk3bif.h" #include "dk3bifa.h" #include "dk3bmeps.h" #include "dk3bmeo.h" #include "dk3bmj.h" #include "dk3pdf.h" #include "dk3bm.h" #if DK3_USE_WX #include #endif $!trace-include /** Don't debug the module. */ #define DK3BM_DEBUG 0 /** File name suffixes for output files. */ dkChar const * const dk3bm_output_suffixes[] = { dkT(".ps"), dkT(".eps"), dkT(".pdf"), dkT(".bb") }; /** Everything between 72-epsilon and 72+epsilon is seen as 72 dpi. Some file formats store the resolution in pixels per meter as integer numbers. If 72.0 is scaled from one inch to a meter and rounded to integer, the rounding error maximum is one. If one dot per meter (the probable rounding error) is converted back to dot per inch the result is 0.254. */ static double const dk3bm_epsilon = 0.254; /** Keywords used by the module. */ static char const * const dk3bm_c8_kw[] = { /* 0 */ "\n", /* 1 */ " ", /* 2 */ "{\n", /* 3 */ "} exec\n", /* 4 */ "gsave\n", /* 5 */ "grestore\n", /* 6 */ "showpage\n", /* 7 */ "13 dict begin\n", /* 8 */ "end\n", /* 9 */ "%lg %lg translate\n", /* 10 */ "%d rotate\n", /* 11 */ "%lg %lg scale\n", /* 12 */ "%ld %ld scale\n", /* 13 */ "%!PS-Adobe-2.0", /* 14 */ "%!PS-Adobe-3.0", /* 15 */ " EPSF-2.0", /* 16 */ " EPSF-3.0", /* 17 */ "<<\n", /* 18 */ ">>\nimage\n", /* 19 */ "/ImageType 1\n", /* 20 */ "/DeviceRGB setcolorspace\n", /* 21 */ "/DeviceGray setcolorspace\n", /* 22 */ "/fa currentfile /ASCII85Decode filter def\n", /* 23 */ "fa flushfile fa closefile\n", /* 24 */ "/fb fa /RunLengthDecode filter def\n", /* 25 */ "fb closefile\n", /* 26 */ "/fb fa /FlateDecode filter def\n", /* 27 */ "/fb fa << >> /DCTDecode filter def\n", /* 28 */ "/Width %ld\n", /* 29 */ "/Height %ld\n", /* 30 */ "/ImageMatrix [%ld 0 0 -%ld 0 %ld]\n", /* 31 */ "%%%%BoundingBox: 0 0 %ld %ld\n", /* 32 */ "%%LanguageLevel: 2\n", /* 33 */ "%%LanguageLevel: 3\n", /* 34 */ "/BitsPerComponent %u\n", /* 35 */ "/MultipleDataSources true\n", /* 36 */ "/MultipleDataSources false\n", /* 37 */ "/DataSource fb\n", /* 38 */ "/DataSource fa\n", /* 39 */ "/DataSource [\n", /* 40 */ "{ fb sr readstring pop }\n", /* 41 */ "{ fb sg readstring pop }\n", /* 42 */ "{ fb sb readstring pop }\n", /* 43 */ "]\n", /* 44 */ "/Decode [0 1]\n", /* 45 */ "/Decode [0 1 0 1 0 1]\n", /* 46 */ "/Interpolate true\n", /* 47 */ "/Interpolate false\n", /* 48 */ "/sr %ld string def\n", /* 49 */ "/sg %ld string def\n", /* 50 */ "/sb %ld string def\n", /* 51 */ "%%Creator: bmeps3\n", /* 52 */ "%%Title: ", /* 53 */ "%%%%Pages: %u\n", /* 54 */ "%%PageOrder: Ascend\n", /* 55 */ "%%DocumentData: Clean7Bit\n", /* 56 */ "%%EndComments\n", /* 57 */ "%%BeginProlog\n", /* 58 */ "%%EndProlog\n", /* 59 */ "%%BeginSetup\n", /* 60 */ "%%EndSetup\n", /* 61 */ "%%Trailer\n", /* 62 */ "%%EOF\n", /* 63 */ "%%%%Page: %u %u\n", /* 64 */ "%%BeginFeature: *PageSize BmepsPage\n", /* 65 */ "%%EndFeature\n", /* 66 */ "<< /PageSize [%ld %ld] /ImagingBBox null >> setpagedevice\n", /* 67 */ "%%BeginFeature: *Duplex DuplexNoTumble\n", /* 68 */ "<< /Duplex true /Tumble false >> setpagedevice\n", /* 69 */ "%%BeginFeature: *Duplex DuplexTumble\n", /* 70 */ "<< /Duplex true /Tumble true >> setpagedevice\n", /* 71 */ "0 setgray\nnewpath\n", /* 72 */ "%lg %lg moveto\n", /* 73 */ "%lg %lg lineto\n", /* 74 */ "closepath\nfill\n", /* 75 */ "0.8 setgray\nnewpath\n", /* 76 */ "1 setgray\nnewpath\n", /* 77 */ "%lg setlinewidth\n", /* 78 */ "newpath\n", /* 79 */ "stroke\n", /* 80 */ "/fb fa <<\n", /* 81 */ ">> /FlateDecode filter def\n", /* 82 */ "/Predictor %d\n", /* 83 */ "/Columns %ld\n", /* 84 */ "/Colors 3\n", /* 85 */ "/Colors 1\n", /* 86 */ "/DeviceCMYK setcolorspace\n", /* 87 */ "/Decode [0 1 0 1 0 1 0 1]\n", /* 88 */ "/Decode [1 0 1 0 1 0 1 0]\n", }; /** Convert long to double. @param l Long value to convert. @return Conversion result. */ static double dk3bm_l_to_d(long l) { return ((double)l); } /** Correct output buffer. If LC_NUMERIC has a wrong setting it might produce a comma instead of a decimal dot for floating point numbers. The PS and PDF language specification always requires a dot, independent of the users language setting. @param s Buffer start address. */ static void dk3bm_correct_output_buffer(char *s) { char *ptr; /* Temporary pointer to traverse string. */ $? "+ dk3bm_correct_output_buffer" if(s) { ptr = s; while(*ptr) { if(*ptr == ',') { *ptr = '.'; } ptr++; } } $? "- dk3bm_correct_output_buffer" } /** Write PS header for document. @param job Conversion job. @param pages Number of pages in the print job. */ static void dk3bm_ps_document_header(dk3_bm_conversion_job_t *job, size_t pages) { char fnb[DK3_MAX_PATH]; /* Buffer used to construct output. */ char outputbuffer[256]; /* Another buffer for output. */ dkChar const *ptr; /* Used to traverse file name. */ dkChar const *nb; /* Short file name. */ int ie; /* Input encoding. */ $? "+ dk3bm_ps_document_header" fputs(dk3bm_c8_kw[((job->opt)->psl == 3) ? 14 : 13], job->dfile); if((job->opt)->dr == DK3_BMEPS_DRIVER_EPS) { fputs(dk3bm_c8_kw[((job->opt)->psl == 3) ? 16 : 15], job->dfile); } fputs(dk3bm_c8_kw[0], job->dfile); $? ". w=%ld h=%ld", job->x_size, job->y_size fprintf(job->dfile, dk3bm_c8_kw[31], job->x_size, job->y_size); fputs(dk3bm_c8_kw[((job->opt)->psl == 3) ? 33 : 32], job->dfile); if((job->opt)->dsc) { fputs(dk3bm_c8_kw[51], job->dfile); ptr = job->sfn; if(ptr) { nb = NULL; while(*ptr) { if((*ptr == dkT('\\')) || (*ptr == dkT('/'))) { nb = ptr; } ptr++; } if(nb) { nb++; } else { nb = job->sfn; } ie = dk3app_get_encoding((job->opt)->app); if(dk3str_to_c8p_app(fnb,sizeof(fnb),nb,ie,(job->opt)->app)) { fputs(dk3bm_c8_kw[52], job->dfile); fputs(fnb, job->dfile); fputs(dk3bm_c8_kw[0], job->dfile); } } sprintf(fnb, dk3bm_c8_kw[53], (unsigned)pages); fputs(fnb, job->dfile); for(ie = 54; ie <= 59; ie++) { fputs(dk3bm_c8_kw[ie], job->dfile); } switch((job->opt)->dr) { case DK3_BMEPS_DRIVER_PS: { switch((job->opt)->mode) { case DK3_BMEPS_MODE_DOCUMENT: { fputs(dk3bm_c8_kw[64], job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[66], job->x_size, job->y_size); fputs(outputbuffer, job->dfile); fputs(dk3bm_c8_kw[65], job->dfile); if((job->opt)->duplex) { if((job->opt)->tumble) { fputs(dk3bm_c8_kw[69], job->dfile); fputs(dk3bm_c8_kw[70], job->dfile); fputs(dk3bm_c8_kw[65], job->dfile); } else { fputs(dk3bm_c8_kw[67], job->dfile); fputs(dk3bm_c8_kw[68], job->dfile); fputs(dk3bm_c8_kw[65], job->dfile); } } } break; } } break; } fputs(dk3bm_c8_kw[60], job->dfile); } else { if((job->opt)->duplex) { if((job->opt)->tumble) { fputs(dk3bm_c8_kw[70], job->dfile); } else { fputs(dk3bm_c8_kw[68], job->dfile); } } } $? "- dk3bm_ps_document_header" } /** Produce footer for PS print job. @param job Conversion job. */ static void dk3bm_ps_document_footer(dk3_bm_conversion_job_t *job) { $? "+ dk3bm_ps_document_footer" if((job->opt)->dsc) { fputs(dk3bm_c8_kw[61], job->dfile); fputs(dk3bm_c8_kw[62], job->dfile); } switch((job->opt)->dr) { case DK3_BMEPS_DRIVER_PS: { switch((job->opt)->mode) { case DK3_BMEPS_MODE_DOCUMENT: { fputc(0x04, job->dfile); } break; } } break; } $? "- dk3bm_ps_document_footer" } /** Copy DCT encoded data directly from input to output. @param of Output filter. @param dctin Input file containing DCT-encoded data. @param job Conversion job. @return 1 on success, 0 on error. */ static int dk3bm_copy_dct_data( dk3_of_t *of, FILE *dctin, dk3_bm_conversion_job_t *job ) { char bu[4096]; /* Buffer for data read from file. */ size_t rb; /* Number of bytes read. */ int back = 1; int cc; /* Flag: Can continue. */ $? "+ dk3bm_copy_dct_data" cc = 1; while(cc) { cc = 0; rb = dk3sf_fread_app((void *)bu, 1, sizeof(bu), dctin, (job->opt)->app); if(rb > 0) { cc = 1; if(!dk3of_write_bytes(of, (unsigned char *)bu, rb)) { back = 0; cc = 0; /* ERROR: Failed to write data! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 58, DK3_BMJ_LOG_BOTH, job ); } } } $? "- dk3bm_copy_dct_data %d", back return back; } /** Write flate filter definition with predictor. @param job Conversion job. */ static void dk3bm_define_flate_with_predictor(dk3_bm_conversion_job_t *job) { char outputbuffer[256]; /* Buffer to construct output. */ int i = 0; /* Predictor ID in PS and PDF. */ $? "+ dk3bm_define_flate_with_predictor" fputs(dk3bm_c8_kw[80], job->dfile); /* Predictor Columns Colors BitsPerComponent */ switch((job->opt)->pred) { case DK3_COMPRESSION_PREDICTOR_TIFF: { i = 2; } break; case DK3_COMPRESSION_PREDICTOR_PNG_SUB: { i = 11; } break; case DK3_COMPRESSION_PREDICTOR_PNG_UP: { i = 12; } break; case DK3_COMPRESSION_PREDICTOR_PNG_AVERAGE: { i = 13; } break; case DK3_COMPRESSION_PREDICTOR_PNG_PAETH: { i = 14; } break; } sprintf(outputbuffer, dk3bm_c8_kw[82], i); fputs(outputbuffer, job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[83], dk3bif_get_width(job->bif)); fputs(outputbuffer, job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[34], job->bpc); fputs(outputbuffer, job->dfile); if(job->procedure == DK3_BMEPS_RGB_FLATE) { fputs(dk3bm_c8_kw[84], job->dfile); } else { fputs(dk3bm_c8_kw[85], job->dfile); } fputs(dk3bm_c8_kw[81], job->dfile); $? "- dk3bm_define_flate_with_predictor" } /** Write one unsigned character. @param of Output filter. @param v Value to write to output. */ static void dk3bm_write_uc(dk3_of_t *of, dk3_bif_pixel_t v) { unsigned char ucv; /* Byte to write. */ $? "+ dk3bm_write_uc" ucv = (unsigned char)v; dk3of_write_bytes(of, &ucv, 1); $? "- dk3bm_write_uc" } /** Produce PS for image or object. The following components of job must be set: x_size, y_size, x_translate, y_translate, x_0, x_1, y_0, y_1, x_scale, y_scale, do_translate, do_rotate, do_float_scale. @param job Conversion job. @return 1 on success, 0 on error. */ static int dk3bm_job_produce_img_job_real_ps(dk3_bm_conversion_job_t *job) { char outputbuffer[256]; /* Buffer to prepare output. */ FILE *dctin; /* Input file containing DCT data. */ dk3_stream_t *os; /* Output stream. */ dk3_of_t *of; /* Output filter. */ long bitsperline; /* Bits per line. */ long bytesperline; /* Bytes per line. */ dk3_bif_coord_t w; /* Image width. */ dk3_bif_coord_t h; /* Image height. */ dk3_bif_coord_t x; /* Current x. */ dk3_bif_coord_t y; /* Current y. */ dk3_bif_pixel_t v; /* Current point value. */ dk3_bif_pixel_t pl; /* Left pixel. */ dk3_bif_pixel_t pu; /* Upper pixel. */ dk3_bif_pixel_t plu; /* Left upper pixel. */ size_t nbits; /* Number of bits per component. */ int back = 0; int analysis_type = 0; /* Analysis to perform. */ int use_dct = 0; /* Flag: DCT used. */ int me = 0; /* Flag: Math error. */ int alphain = 0; /* Flag: Alpha channel. */ int colorin = 0; /* Flag: Color image. */ #if DK3_USE_WX int minpb; /* Original min progress bar value. */ int maxpb; /* Original max progress bar value. */ int pbmin; /* Min progress bar value. */ int pbmax; /* Max progress bar value. */ #endif $? "+ dk3bm_job_produce_img_job_real_ps" #if DK3_USE_WX minpb = job->minpb; maxpb = job->maxpb; #endif if(job->dfile) { $? ". destination file ok" alphain = 0; switch(dk3bif_get_color_space(job->bif)) { case DK3_COLOR_SPACE_GRAY_ALPHA: case DK3_COLOR_SPACE_RGBA: { alphain = 1; $? ". alpha inspection necessary" } break; } colorin = 0; switch(dk3bif_get_color_space(job->bif)) { case DK3_COLOR_SPACE_GRAY: case DK3_COLOR_SPACE_GRAY_ALPHA: { } break; default: { colorin = 1; $? ". color inspection necessary" } break; } /* Conversion defaults. */ w = dk3bif_get_width(job->bif); h = dk3bif_get_height(job->bif); job->procedure = DK3_BMEPS_GRAY_UNCOMPRESSED; job->bpc = 8; /* Decisions about compression, bpc, colors. */ analysis_type = 0; switch(dk3bif_get_type(job->bif)) { case DK3_BIF_IMAGE_TYPE_JPEG: { $? ". is jpeg" if((job->opt)->dct) { $? ". dct allowed" switch(dk3bif_get_bits_per_pixel(job->bif)) { case 8: case 4: case 2: case 1: { $? ". bpc ok" switch(dk3bif_jpeg_get_num_components(job->bif)) { case 1: { $? ". dct gray" job->procedure = DK3_BMEPS_GRAY_DCT; job->bpc = dk3bif_get_bits_per_pixel(job->bif); use_dct = 1; } break; case 3: { $? ". dct rgb" job->procedure = DK3_BMEPS_RGB_DCT; job->bpc = dk3bif_get_bits_per_pixel(job->bif); use_dct = 1; } break; case 4: { $? ". dct cmyk" job->procedure = DK3_BMEPS_CMYK_DCT; job->bpc = dk3bif_get_bits_per_pixel(job->bif); use_dct = 1; } break; default: { $? ". comp %u", (unsigned)dk3bif_jpeg_get_num_components(job->bif) } break; } } break; } } } break; } if(!(use_dct)) { if((job->opt)->color) { switch(dk3bif_get_color_space(job->bif)) { case DK3_COLOR_SPACE_GRAY: case DK3_COLOR_SPACE_GRAY_ALPHA: { } break; default: { analysis_type |= DK3_BIF_ANALYSIS_COLOR; } break; } } if((job->opt)->rbpc) { analysis_type |= DK3_BIF_ANALYSIS_BITS; } if(alphain) { analysis_type |= DK3_BIF_ANALYSIS_ALPHA; } /* PROGRESS: Analyzing image. */ dk3app_log_1((job->opt)->app, DK3_LL_PROGRESS, job->msg, 48); if(analysis_type) { #if DK3_USE_WX dk3bif_analyze_progress( job->bif, analysis_type, job->pComm, minpb, ((maxpb + minpb)/2) ); #else dk3bif_analyze(job->bif, analysis_type); #endif } nbits = dk3bif_get_bits_per_pixel(job->bif); if((job->opt)->rbpc) { nbits = dk3bif_real_bits_per_pixel(job->bif); } #if 0 /* 2014-03-22 New algorithms for bits per component detection and reduction. */ job->bpc = 1; if(nbits > 1) { job->bpc = 2; if(nbits > 2) { job->bpc = 4; if(nbits > 4) { job->bpc = 8; if(nbits > 8) { job->bpc = 12; } } } } #else switch (nbits) { case 1: { job->bpc = 1; } break; case 2: { job->bpc = 2; } break; case 4: { job->bpc = 4; } break; case 12: { job->bpc = 12; } break; default: { job->bpc = 8; } break; } #endif /* 2014-03-23 The dk3bifa module generate debug output. */ #if 0 /* DEBUG: Analysis results. */ { dkChar numbuf[128]; dkChar const *msgpart[3]; int convres; msgpart[0] = (job->msg)[51]; msgpart[1] = (job->msg)[(colorin) ? 49 : 50]; dk3app_log_msg((job->opt)->app, DK3_LL_DEBUG, msgpart, 2); msgpart[0] = (job->msg)[52]; msgpart[1] = (job->msg)[(dk3bif_real_color(job->bif)) ? 49 : 50]; dk3app_log_msg((job->opt)->app, DK3_LL_DEBUG, msgpart, 2); msgpart[0] = (job->msg)[53]; msgpart[1] = (job->msg)[(alphain) ? 49 : 50]; dk3app_log_msg((job->opt)->app, DK3_LL_DEBUG, msgpart, 2); msgpart[0] = (job->msg)[54]; msgpart[1] = (job->msg)[(dk3bif_real_alpha(job->bif)) ? 49 : 50]; dk3app_log_msg((job->opt)->app, DK3_LL_DEBUG, msgpart, 2); #if VERSION_BEFORE_20140716 dk3sf_sprintf3(numbuf,dkT("%u"),(unsigned)dk3bif_get_bits_per_pixel(job->bif)); msgpart[0] = (job->msg)[55]; msgpart[1] = numbuf; dk3app_log_msg((job->opt)->app, DK3_LL_DEBUG, msgpart, 2); dk3sf_sprintf3(numbuf,dkT("%u"),(unsigned)dk3bif_real_bits_per_pixel(job->bif)); msgpart[0] = (job->msg)[56]; msgpart[1] = numbuf; dk3app_log_msg((job->opt)->app, DK3_LL_DEBUG, msgpart, 2); dk3sf_sprintf3(numbuf,dkT("%u"),(unsigned)(job->bpc)); msgpart[0] = (job->msg)[57]; msgpart[1] = numbuf; dk3app_log_msg((job->opt)->app, DK3_LL_DEBUG, msgpart, 2); #else convres = dk3ma_um_to_string( numbuf, DK3_SIZEOF(numbuf,dkChar), (dk3_um_t)dk3bif_get_bits_per_pixel(job->bif) ); if (0 != convres) { msgpart[0] = (job->msg)[55]; msgpart[1] = numbuf; dk3app_log_msg((job->opt)->app, DK3_LL_DEBUG, msgpart, 2); } convres = dk3ma_um_to_string( numbuf, DK3_SIZEOF(numbuf,dkChar), (dk3_um_t)dk3bif_real_bits_per_pixel(job->bif) ); if (0 != convres) { msgpart[0] = (job->msg)[56]; msgpart[1] = numbuf; dk3app_log_msg((job->opt)->app, DK3_LL_DEBUG, msgpart, 2); } convres = dk3ma_um_to_string( numbuf, DK3_SIZEOF(numbuf,dkChar), (dk3_um_t)(job->bpc) ); if (0 != convres) { msgpart[0] = (job->msg)[57]; msgpart[1] = numbuf; dk3app_log_msg((job->opt)->app, DK3_LL_DEBUG, msgpart, 2); } #endif } #endif if(analysis_type & DK3_BIF_ANALYSIS_COLOR) { colorin = dk3bif_real_color(job->bif); } if(analysis_type & DK3_BIF_ANALYSIS_ALPHA) { alphain = dk3bif_real_alpha(job->bif); } switch(dk3bif_get_color_space(job->bif)) { case DK3_COLOR_SPACE_GRAY: case DK3_COLOR_SPACE_GRAY_ALPHA: { job->procedure = DK3_BMEPS_GRAY_RUNLENGTH; if((job->opt)->psl >= 3) { job->procedure = DK3_BMEPS_GRAY_FLATE; if((job->opt)->pred > DK3_COMPRESSION_PREDICTOR_TIFF) { job->bpc = 8; } } } break; default: { if(dk3bif_real_color(job->bif)) { job->procedure = DK3_BMEPS_RGB_UNCOMPRESSED; if((job->opt)->psl >= 3) { job->procedure = DK3_BMEPS_RGB_FLATE; if((job->opt)->pred > DK3_COMPRESSION_PREDICTOR_TIFF) { job->bpc = 8; } } else { bitsperline = dk3ma_l_mul_ok((long)(job->bpc), w, &me); if(me == 0) { bytesperline = bitsperline / 8L; if(bitsperline % 8L) { bytesperline++; } if(bytesperline < 16384L) { job->procedure = DK3_BMEPS_RGB_RUNLENGTH; } } } } else { job->procedure = DK3_BMEPS_GRAY_RUNLENGTH; if((job->opt)->psl >= 3) { job->procedure = DK3_BMEPS_GRAY_FLATE; if((job->opt)->pred > DK3_COMPRESSION_PREDICTOR_TIFF) { job->bpc = 8; } } } } break; } } dk3app_log_1((job->opt)->app, DK3_LL_PROGRESS, job->msg, 76); #if DK3BM_DEBUG job->procedure = DK3_BMEPS_RGB_UNCOMPRESSED; #endif #if DK3_USE_WX $? ". 1/2" dk3bmj_progress(job->pComm, ((maxpb + minpb)/2)); job->minpb = ((maxpb + minpb) / 2); pbmin = job->minpb; pbmax = job->maxpb; #endif /* File header. */ if(job->do_header_footer) { dk3bm_ps_document_header(job, 1); } /* Image. */ if((job->opt)->dsc) { sprintf( outputbuffer, dk3bm_c8_kw[63], (unsigned)(job->currentPage), (unsigned)(job->currentPage) ); fputs(outputbuffer, job->dfile); } fputs(dk3bm_c8_kw[2], job->dfile); /* { */ fputs(dk3bm_c8_kw[4], job->dfile); /* gsave */ /* Translate, rotate, scale. */ if(job->do_translate) { sprintf( outputbuffer, dk3bm_c8_kw[9], job->x_translate, job->y_translate ); dk3bm_correct_output_buffer(outputbuffer); fputs(outputbuffer, job->dfile); } if(job->do_rotate) { sprintf(outputbuffer, dk3bm_c8_kw[10], (90 * job->do_rotate)); fputs(outputbuffer, job->dfile); } if(job->do_float_scale) { sprintf( outputbuffer, dk3bm_c8_kw[11], job->x_scale, job->y_scale ); dk3bm_correct_output_buffer(outputbuffer); } else { sprintf(outputbuffer, dk3bm_c8_kw[12], w, h); } fputs(outputbuffer, job->dfile); fputs(dk3bm_c8_kw[7], job->dfile); /* 13 dict begin */ /* Color space, definitions for data source(s). */ switch(job->procedure) { case DK3_BMEPS_GRAY_UNCOMPRESSED: { fputs(dk3bm_c8_kw[21], job->dfile); fputs(dk3bm_c8_kw[22], job->dfile); } break; case DK3_BMEPS_RGB_UNCOMPRESSED: { fputs(dk3bm_c8_kw[20], job->dfile); fputs(dk3bm_c8_kw[22], job->dfile); } break; case DK3_BMEPS_GRAY_RUNLENGTH: { fputs(dk3bm_c8_kw[21], job->dfile); fputs(dk3bm_c8_kw[22], job->dfile); fputs(dk3bm_c8_kw[24], job->dfile); } break; case DK3_BMEPS_RGB_RUNLENGTH: { fputs(dk3bm_c8_kw[20], job->dfile); fputs(dk3bm_c8_kw[22], job->dfile); fputs(dk3bm_c8_kw[24], job->dfile); bitsperline = w * (long)(job->bpc); bytesperline = bitsperline / 8L; if(bitsperline % 8L) { bytesperline++; } fprintf(job->dfile, dk3bm_c8_kw[48], bytesperline); fprintf(job->dfile, dk3bm_c8_kw[49], bytesperline); fprintf(job->dfile, dk3bm_c8_kw[50], bytesperline); } break; case DK3_BMEPS_GRAY_DCT: { fputs(dk3bm_c8_kw[21], job->dfile); fputs(dk3bm_c8_kw[22], job->dfile); fputs(dk3bm_c8_kw[27], job->dfile); } break; case DK3_BMEPS_RGB_DCT: { fputs(dk3bm_c8_kw[20], job->dfile); fputs(dk3bm_c8_kw[22], job->dfile); fputs(dk3bm_c8_kw[27], job->dfile); } break; case DK3_BMEPS_CMYK_DCT: { fputs(dk3bm_c8_kw[86], job->dfile); fputs(dk3bm_c8_kw[22], job->dfile); fputs(dk3bm_c8_kw[27], job->dfile); } break; case DK3_BMEPS_GRAY_FLATE: { fputs(dk3bm_c8_kw[21], job->dfile); fputs(dk3bm_c8_kw[22], job->dfile); if((job->opt)->pred) { dk3bm_define_flate_with_predictor(job); } else { fputs(dk3bm_c8_kw[26], job->dfile); } } break; case DK3_BMEPS_RGB_FLATE: { fputs(dk3bm_c8_kw[20], job->dfile); fputs(dk3bm_c8_kw[22], job->dfile); if((job->opt)->pred) { dk3bm_define_flate_with_predictor(job); } else { fputs(dk3bm_c8_kw[26], job->dfile); } } break; } fputs(dk3bm_c8_kw[17], job->dfile); /* << */ /* Image dictionary contents. */ fputs(dk3bm_c8_kw[19], job->dfile); /* /ImageType 1 */ sprintf(outputbuffer, dk3bm_c8_kw[28], w); fputs(outputbuffer, job->dfile); /* /Width ... */ sprintf(outputbuffer, dk3bm_c8_kw[29], h); fputs(outputbuffer, job->dfile); /* /Height ... */ sprintf(outputbuffer, dk3bm_c8_kw[30], w, h, h); fputs(outputbuffer, job->dfile); /* /ImageMatrix ... */ sprintf(outputbuffer, dk3bm_c8_kw[34], (unsigned)(job->bpc)); fputs(outputbuffer, job->dfile); /* /BitsPerComponent ... */ /* /Interpolate ... */ switch(job->procedure) { case DK3_BMEPS_GRAY_UNCOMPRESSED: { fputs(dk3bm_c8_kw[38], job->dfile); fputs(dk3bm_c8_kw[44], job->dfile); fputs(dk3bm_c8_kw[((job->opt)->ip) ? 46 : 47], job->dfile); } break; case DK3_BMEPS_RGB_UNCOMPRESSED: { fputs(dk3bm_c8_kw[36], job->dfile); fputs(dk3bm_c8_kw[38], job->dfile); fputs(dk3bm_c8_kw[45], job->dfile); fputs(dk3bm_c8_kw[((job->opt)->ip) ? 46 : 47], job->dfile); } break; case DK3_BMEPS_GRAY_RUNLENGTH: { fputs(dk3bm_c8_kw[37], job->dfile); fputs(dk3bm_c8_kw[44], job->dfile); fputs(dk3bm_c8_kw[((job->opt)->ip) ? 46 : 47], job->dfile); } break; case DK3_BMEPS_RGB_RUNLENGTH: { fputs(dk3bm_c8_kw[35], job->dfile); fputs(dk3bm_c8_kw[39], job->dfile); fputs(dk3bm_c8_kw[40], job->dfile); fputs(dk3bm_c8_kw[41], job->dfile); fputs(dk3bm_c8_kw[42], job->dfile); fputs(dk3bm_c8_kw[43], job->dfile); fputs(dk3bm_c8_kw[45], job->dfile); fputs(dk3bm_c8_kw[((job->opt)->ip) ? 46 : 47], job->dfile); } break; case DK3_BMEPS_GRAY_DCT: { fputs(dk3bm_c8_kw[37], job->dfile); fputs(dk3bm_c8_kw[44], job->dfile); if((job->opt)->ip) { if((job->opt)->jip) { fputs(dk3bm_c8_kw[46], job->dfile); } } } break; case DK3_BMEPS_RGB_DCT: { fputs(dk3bm_c8_kw[36], job->dfile); fputs(dk3bm_c8_kw[37], job->dfile); fputs(dk3bm_c8_kw[45], job->dfile); if((job->opt)->ip) { if((job->opt)->jip) { fputs(dk3bm_c8_kw[46], job->dfile); } } } break; case DK3_BMEPS_CMYK_DCT: { fputs(dk3bm_c8_kw[36], job->dfile); fputs(dk3bm_c8_kw[37], job->dfile); if(dk3bif_jpeg_get_found_adobe_marker(job->bif)) { fputs(dk3bm_c8_kw[88], job->dfile); } else { fputs(dk3bm_c8_kw[87], job->dfile); } if((job->opt)->ip) { if((job->opt)->jip) { fputs(dk3bm_c8_kw[46], job->dfile); } } } break; case DK3_BMEPS_GRAY_FLATE: { fputs(dk3bm_c8_kw[37], job->dfile); fputs(dk3bm_c8_kw[44], job->dfile); fputs(dk3bm_c8_kw[((job->opt)->ip) ? 46 : 47], job->dfile); } break; case DK3_BMEPS_RGB_FLATE: { fputs(dk3bm_c8_kw[36], job->dfile); fputs(dk3bm_c8_kw[37], job->dfile); fputs(dk3bm_c8_kw[45], job->dfile); fputs(dk3bm_c8_kw[((job->opt)->ip) ? 46 : 47], job->dfile); } break; } fputs(dk3bm_c8_kw[18], job->dfile); /* >> image */ /* Close data streams. */ switch(job->procedure) { case DK3_BMEPS_GRAY_UNCOMPRESSED: { fputs(dk3bm_c8_kw[23], job->dfile); } break; case DK3_BMEPS_RGB_UNCOMPRESSED: { fputs(dk3bm_c8_kw[23], job->dfile); } break; case DK3_BMEPS_GRAY_RUNLENGTH: { fputs(dk3bm_c8_kw[25], job->dfile); fputs(dk3bm_c8_kw[23], job->dfile); } break; case DK3_BMEPS_RGB_RUNLENGTH: { fputs(dk3bm_c8_kw[25], job->dfile); fputs(dk3bm_c8_kw[23], job->dfile); } break; case DK3_BMEPS_GRAY_DCT: { fputs(dk3bm_c8_kw[25], job->dfile); fputs(dk3bm_c8_kw[23], job->dfile); } break; case DK3_BMEPS_RGB_DCT: { fputs(dk3bm_c8_kw[25], job->dfile); fputs(dk3bm_c8_kw[23], job->dfile); } break; case DK3_BMEPS_CMYK_DCT: { fputs(dk3bm_c8_kw[25], job->dfile); fputs(dk3bm_c8_kw[23], job->dfile); } break; case DK3_BMEPS_GRAY_FLATE: { fputs(dk3bm_c8_kw[25], job->dfile); fputs(dk3bm_c8_kw[23], job->dfile); } break; case DK3_BMEPS_RGB_FLATE: { fputs(dk3bm_c8_kw[25], job->dfile); fputs(dk3bm_c8_kw[23], job->dfile); } break; } fputs(dk3bm_c8_kw[8], job->dfile); /* end */ fputs(dk3bm_c8_kw[5], job->dfile); /* grestore */ switch((job->opt)->mode) { case DK3_BMEPS_MODE_IMAGE: case DK3_BMEPS_MODE_DOCUMENT: { if((job->opt)->dr == DK3_BMEPS_DRIVER_PS) { fputs(dk3bm_c8_kw[6], job->dfile); /* showpage */ } } break; } fputs(dk3bm_c8_kw[3], job->dfile); /* } exec */ /* Write compress/encoded image data. */ os = dk3stream_open_file_app( job->dfile, DK3_STREAM_FLAG_WRITE, (job->opt)->app ); if(os) { of = dk3of_open_app(os, (job->opt)->app); if(of) { dk3of_set_finalize(of, 1); if(dk3of_add_cell(of, DK3_OF_CELL_TYPE_A85)) { switch(job->procedure) { case DK3_BMEPS_GRAY_UNCOMPRESSED: { dk3bif_set_bits_per_pixel(job->bif, job->bpc); if(dk3of_start_chunk(of)) { if(job->bpc == 8) { if(alphain) { for(y = 0L; y < h; y++) { for(x = 0L; x < w; x++) { v = dk3bif_get_mixed_gray(job->bif, x, y); dk3bm_write_uc(of, v); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } else { for(y = 0L; y < h; y++) { for(x = 0L; x < w; x++) { v = dk3bif_get_gray(job->bif, x, y); dk3bm_write_uc(of, v); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } } else { if(alphain) { for(y = 0L; y < h; y++) { for(x = 0L; x < w; x++) { v = dk3bif_get_mixed_gray(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); } dk3of_flush_bits(of); #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } else { for(y = 0L; y < h; y++) { for(x = 0L; x < w; x++) { v = dk3bif_get_gray(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); } dk3of_flush_bits(of); #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } } back = dk3of_end_chunk(of); } else { /* ERROR: Failed to start encoded chunk! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 59, DK3_BMJ_LOG_BOTH, job ); } } break; case DK3_BMEPS_RGB_UNCOMPRESSED: { dk3bif_set_bits_per_pixel(job->bif, job->bpc); if(dk3of_start_chunk(of)) { if(job->bpc == 8) { if(alphain) { for(y = 0L; y < h; y++) { for(x = 0L; x < w; x++) { v = dk3bif_get_mixed_red(job->bif, x, y); dk3bm_write_uc(of, v); v = dk3bif_get_mixed_green(job->bif, x, y); dk3bm_write_uc(of, v); v = dk3bif_get_mixed_blue(job->bif, x, y); dk3bm_write_uc(of, v); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } else { for(y = 0L; y < h; y++) { for(x = 0L; x < w; x++) { v = dk3bif_get_red(job->bif, x, y); dk3bm_write_uc(of, v); v = dk3bif_get_green(job->bif, x, y); dk3bm_write_uc(of, v); v = dk3bif_get_blue(job->bif, x, y); dk3bm_write_uc(of, v); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } } else { if(alphain) { for(y = 0L; y < h; y++) { for(x = 0L; x < w; x++) { v = dk3bif_get_mixed_red(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); v = dk3bif_get_mixed_green(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); v = dk3bif_get_mixed_blue(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); } dk3of_flush_bits(of); #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } else { for(y = 0L; y < h; y++) { for(x = 0L; x < w; x++) { v = dk3bif_get_red(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); v = dk3bif_get_green(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); v = dk3bif_get_blue(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); } dk3of_flush_bits(of); #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } } back = dk3of_end_chunk(of); } else { /* ERROR: Failed to start encoded chunk! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 59, DK3_BMJ_LOG_BOTH, job ); } } break; case DK3_BMEPS_GRAY_RUNLENGTH: { dk3bif_set_bits_per_pixel(job->bif, job->bpc); if(dk3of_add_cell(of, DK3_OF_CELL_TYPE_RUN_LENGTH)) { if(dk3of_start_chunk(of)) { if(job->bpc == 8) { if(alphain) { for(y = 0UL; y < h; y++) { for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_gray(job->bif, x, y); dk3bm_write_uc(of, v); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } else { for(y = 0UL; y < h; y++) { for(x = 0UL; x < w; x++) { v = dk3bif_get_gray(job->bif, x, y); dk3bm_write_uc(of, v); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } } else { if(alphain) { for(y = 0UL; y < h; y++) { for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_gray(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); } dk3of_flush_bits(of); #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } else { for(y = 0UL; y < h; y++) { for(x = 0UL; x < w; x++) { v = dk3bif_get_gray(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); } dk3of_flush_bits(of); #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } } back = dk3of_end_chunk(of); } else { /* ERROR: Failed to start encoded chunk! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 59, DK3_BMJ_LOG_BOTH, job ); } } else { /* ERROR: Failed to add run-length cell! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 59, DK3_BMJ_LOG_BOTH, job ); } } break; case DK3_BMEPS_RGB_RUNLENGTH: { dk3bif_set_bits_per_pixel(job->bif, job->bpc); if(dk3of_add_cell(of, DK3_OF_CELL_TYPE_RUN_LENGTH)) { if(dk3of_start_chunk(of)) { if(job->bpc == 8) { if(alphain) { for(y = 0UL; y < h; y++) { for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_red(job->bif, x, y); dk3bm_write_uc(of, v); } for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_green(job->bif, x, y); dk3bm_write_uc(of, v); } for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_blue(job->bif, x, y); dk3bm_write_uc(of, v); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } else { for(y = 0UL; y < h; y++) { for(x = 0UL; x < w; x++) { v = dk3bif_get_red(job->bif, x, y); dk3bm_write_uc(of, v); } for(x = 0UL; x < w; x++) { v = dk3bif_get_green(job->bif, x, y); dk3bm_write_uc(of, v); } for(x = 0UL; x < w; x++) { v = dk3bif_get_blue(job->bif, x, y); dk3bm_write_uc(of, v); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } } else { if(alphain) { for(y = 0UL; y < h; y++) { for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_red(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); } dk3of_flush_bits(of); for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_green(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); } dk3of_flush_bits(of); for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_blue(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); } dk3of_flush_bits(of); #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } else { for(y = 0UL; y < h; y++) { for(x = 0UL; x < w; x++) { v = dk3bif_get_red(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); } dk3of_flush_bits(of); for(x = 0UL; x < w; x++) { v = dk3bif_get_green(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); } dk3of_flush_bits(of); for(x = 0UL; x < w; x++) { v = dk3bif_get_blue(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); } dk3of_flush_bits(of); #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } } back = dk3of_end_chunk(of); } else { /* ERROR: Failed to start encoded chunk! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 59, DK3_BMJ_LOG_BOTH, job ); } } else { /* ERROR: Failed to add run-length cell! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 59, DK3_BMJ_LOG_BOTH, job ); } } break; case DK3_BMEPS_GRAY_DCT: case DK3_BMEPS_RGB_DCT: case DK3_BMEPS_CMYK_DCT: { dctin = dk3bif_get_file(job->bif); if(dctin) { rewind(dctin); if(dk3of_start_chunk(of)) { back = dk3bm_copy_dct_data(of, dctin, job); if(back) { back = dk3of_end_chunk(of); } else { (void)dk3of_end_chunk(of); } } else { /* ERROR: Failed to start encoded chunk! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 59, DK3_BMJ_LOG_BOTH, job ); } } else { /* BUG: No input file! */ } } break; case DK3_BMEPS_GRAY_FLATE: { dk3bif_set_bits_per_pixel(job->bif, job->bpc); if(dk3of_add_cell(of, DK3_OF_CELL_TYPE_FLATE)) { if(dk3of_start_chunk(of)) { if(job->bpc == 8) { if(alphain) { $? ". have alpha" switch((job->opt)->pred) { case DK3_COMPRESSION_PREDICTOR_TIFF: { for(y = 0UL; y < h; y++) { pl = 0; for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_gray(job->bif, x, y); dk3bm_write_uc(of, (v - pl)); pl = v; } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; case DK3_COMPRESSION_PREDICTOR_PNG_SUB: { for(y = 0UL; y < h; y++) { pl = 0; dk3bm_write_uc(of, 1); for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_gray(job->bif, x, y); dk3bm_write_uc(of, (v - pl)); pl = v; } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; case DK3_COMPRESSION_PREDICTOR_PNG_UP: { for(y = 0UL; y < h; y++) { dk3bm_write_uc(of, 2); for(x = 0UL; x < w; x++) { $? ". x=%ld y=%ld", x, y v = dk3bif_get_mixed_gray(job->bif, x, y); pu = dk3bif_get_mixed_gray(job->bif, x, (y - 1L)); $? ". v = %u pu=%u", (unsigned)v, (unsigned)pu v = v - pu; $? ". v-pu=%u", (unsigned)v dk3bm_write_uc(of, v); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; case DK3_COMPRESSION_PREDICTOR_PNG_AVERAGE: { for(y = 0UL; y < h; y++) { dk3bm_write_uc(of, 3); for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_gray(job->bif, x, y); pl = dk3bif_get_mixed_gray(job->bif, (x - 1L), y); pu = dk3bif_get_mixed_gray(job->bif, x, (y - 1L)); pl = dk3bif_average(pl, pu); pl &= 0x00FFU; v = v - pl; dk3bm_write_uc(of, v); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; case DK3_COMPRESSION_PREDICTOR_PNG_PAETH: { for(y = 0UL; y < h; y++) { dk3bm_write_uc(of, 4); for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_gray(job->bif, x, y); pl = dk3bif_get_mixed_gray(job->bif, (x - 1L), y); pu = dk3bif_get_mixed_gray(job->bif, x, (y - 1L)); plu = dk3bif_get_mixed_gray( job->bif, (x - 1L), (y - 1L) ); pl = dk3bif_paeth(pl, pu, plu); v = v - pl; dk3bm_write_uc(of, v); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; default: { for(y = 0UL; y < h; y++) { for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_gray(job->bif, x, y); dk3bm_write_uc(of, v); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; } } else { switch((job->opt)->pred) { case DK3_COMPRESSION_PREDICTOR_TIFF: { for(y = 0UL; y < h; y++) { pl = 0; for(x = 0UL; x < w; x++) { v = dk3bif_get_gray(job->bif, x, y); dk3bm_write_uc(of, (v - pl)); pl = v; } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; case DK3_COMPRESSION_PREDICTOR_PNG_SUB: { for(y = 0UL; y < h; y++) { dk3bm_write_uc(of, 1); pl = 0; for(x = 0UL; x < w; x++) { v = dk3bif_get_gray(job->bif, x, y); dk3bm_write_uc(of, (v - pl)); pl = v; } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; case DK3_COMPRESSION_PREDICTOR_PNG_UP: { for(y = 0UL; y < h; y++) { dk3bm_write_uc(of, 2); for(x = 0UL; x < w; x++) { v = dk3bif_get_gray(job->bif, x, y); pu = dk3bif_get_gray(job->bif, x, (y - 1L)); dk3bm_write_uc(of, (v - pu)); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; case DK3_COMPRESSION_PREDICTOR_PNG_AVERAGE: { for(y = 0UL; y < h; y++) { dk3bm_write_uc(of, 3); for(x = 0UL; x < w; x++) { v = dk3bif_get_gray(job->bif, x, y); pl = dk3bif_get_gray(job->bif, (x - 1L), y); pu = dk3bif_get_gray(job->bif, x, (y - 1L)); pl = dk3bif_average(pl, pu); pl &= 0x00FFU; v = v - pl; dk3bm_write_uc(of, v); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; case DK3_COMPRESSION_PREDICTOR_PNG_PAETH: { for(y = 0UL; y < h; y++) { dk3bm_write_uc(of, 4); for(x = 0UL; x < w; x++) { v = dk3bif_get_gray(job->bif, x, y); pl = dk3bif_get_gray(job->bif, (x - 1L), y); pu = dk3bif_get_gray(job->bif, x, (y - 1L)); plu = dk3bif_get_gray( job->bif, (x - 1L), (y - 1L) ); pl = dk3bif_paeth(pl, pu, plu); v = v - pl; dk3bm_write_uc(of, v); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; default: { for(y = 0UL; y < h; y++) { for(x = 0UL; x < w; x++) { v = dk3bif_get_gray(job->bif, x, y); dk3bm_write_uc(of, v); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; } } } else { if(alphain) { switch((job->opt)->pred) { case DK3_COMPRESSION_PREDICTOR_TIFF: { for(y = 0UL; y < h; y++) { pl = 0; for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_gray(job->bif, x, y); dk3of_write_bits(of, (v - pl), job->bpc); pl = v; } dk3of_flush_bits(of); #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; default: { for(y = 0UL; y < h; y++) { for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_gray(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); } dk3of_flush_bits(of); #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; } } else { switch((job->opt)->pred) { case DK3_COMPRESSION_PREDICTOR_TIFF: { for(y = 0UL; y < h; y++) { pl = 0; for(x = 0UL; x < w; x++) { v = dk3bif_get_gray(job->bif, x, y); dk3of_write_bits(of, (v - pl), job->bpc); pl = v; } dk3of_flush_bits(of); #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; default: { for(y = 0UL; y < h; y++) { for(x = 0UL; x < w; x++) { v = dk3bif_get_gray(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); } dk3of_flush_bits(of); #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; } } } back = dk3of_end_chunk(of); } else { /* ERROR: Failed to start encoded chunk! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 59, DK3_BMJ_LOG_BOTH, job ); } } else { /* ERROR: Failed to add run-length cell! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 59, DK3_BMJ_LOG_BOTH, job ); } } break; case DK3_BMEPS_RGB_FLATE: { dk3bif_set_bits_per_pixel(job->bif, job->bpc); if(dk3of_add_cell(of, DK3_OF_CELL_TYPE_FLATE)) { if(dk3of_start_chunk(of)) { if(job->bpc == 8) { if(alphain) { switch((job->opt)->pred) { case DK3_COMPRESSION_PREDICTOR_TIFF: { for(y = 0UL; y < h; y++) { pl = 0; /* r */ pu = 0; /* g */ plu = 0; /* b */ for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_red(job->bif, x, y); dk3bm_write_uc(of, (v - pl)); pl = v; v = dk3bif_get_mixed_green(job->bif, x, y); dk3bm_write_uc(of, (v - pu)); pu = v; v = dk3bif_get_mixed_blue(job->bif, x, y); dk3bm_write_uc(of, (v - plu)); plu = v; } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; case DK3_COMPRESSION_PREDICTOR_PNG_SUB: { for(y = 0UL; y < h; y++) { pl = 0; /* r */ pu = 0; /* g */ plu = 0; /* b */ dk3bm_write_uc(of, 1); for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_red(job->bif, x, y); dk3bm_write_uc(of, (v - pl)); pl = v; v = dk3bif_get_mixed_green(job->bif, x, y); dk3bm_write_uc(of, (v - pu)); pu = v; v = dk3bif_get_mixed_blue(job->bif, x, y); dk3bm_write_uc(of, (v - plu)); plu = v; } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; case DK3_COMPRESSION_PREDICTOR_PNG_UP: { for(y = 0UL; y < h; y++) { dk3bm_write_uc(of, 2); for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_red(job->bif, x, y); pu = dk3bif_get_mixed_red(job->bif, x, (y - 1L)); dk3bm_write_uc(of, (v - pu)); v = dk3bif_get_mixed_green(job->bif, x, y); pu = dk3bif_get_mixed_green(job->bif, x, (y - 1L)); dk3bm_write_uc(of, (v - pu)); v = dk3bif_get_mixed_blue(job->bif, x, y); pu = dk3bif_get_mixed_blue(job->bif, x, (y - 1L)); dk3bm_write_uc(of, (v - pu)); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; case DK3_COMPRESSION_PREDICTOR_PNG_AVERAGE: { for(y = 0UL; y < h; y++) { dk3bm_write_uc(of, 3); for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_red(job->bif, x, y); pl = dk3bif_get_mixed_red(job->bif, (x - 1L), y); pu = dk3bif_get_mixed_red(job->bif, x, (y - 1L)); pu = dk3bif_average(pl, pu); dk3bm_write_uc(of, (v - pu)); v = dk3bif_get_mixed_green(job->bif, x, y); pl = dk3bif_get_mixed_green(job->bif, (x - 1L), y); pu = dk3bif_get_mixed_green(job->bif, x, (y - 1L)); pu = dk3bif_average(pl, pu); dk3bm_write_uc(of, (v - pu)); v = dk3bif_get_mixed_blue(job->bif, x, y); pl = dk3bif_get_mixed_blue(job->bif, (x - 1L), y); pu = dk3bif_get_mixed_blue(job->bif, x, (y - 1L)); pu = dk3bif_average(pl, pu); dk3bm_write_uc(of, (v - pu)); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; case DK3_COMPRESSION_PREDICTOR_PNG_PAETH: { for(y = 0UL; y < h; y++) { dk3bm_write_uc(of, 3); for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_red(job->bif, x, y); pl = dk3bif_get_mixed_red(job->bif, (x - 1L), y); pu = dk3bif_get_mixed_red(job->bif, x, (y - 1L)); plu = dk3bif_get_mixed_red(job->bif, (x - 1L), (y - 1L)); pu = dk3bif_paeth(pl, pu, plu); dk3bm_write_uc(of, (v - pu)); v = dk3bif_get_mixed_green(job->bif, x, y); pl = dk3bif_get_mixed_green(job->bif, (x - 1L), y); pu = dk3bif_get_mixed_green(job->bif, x, (y - 1L)); plu = dk3bif_get_mixed_green(job->bif, (x - 1L), (y - 1L)); pu = dk3bif_paeth(pl, pu, plu); dk3bm_write_uc(of, (v - pu)); v = dk3bif_get_mixed_blue(job->bif, x, y); pl = dk3bif_get_mixed_blue(job->bif, (x - 1L), y); pu = dk3bif_get_mixed_blue(job->bif, x, (y - 1L)); plu = dk3bif_get_mixed_blue(job->bif, (x - 1L), (y - 1L)); pu = dk3bif_paeth(pl, pu, plu); dk3bm_write_uc(of, (v - pu)); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; default: { for(y = 0UL; y < h; y++) { for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_red(job->bif, x, y); dk3bm_write_uc(of, v); v = dk3bif_get_mixed_green(job->bif, x, y); dk3bm_write_uc(of, v); v = dk3bif_get_mixed_blue(job->bif, x, y); dk3bm_write_uc(of, v); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; } } else { switch((job->opt)->pred) { case DK3_COMPRESSION_PREDICTOR_TIFF: { for(y = 0UL; y < h; y++) { pl = 0; /* r */ pu = 0; /* g */ plu = 0; /* b */ for(x = 0UL; x < w; x++) { v = dk3bif_get_red(job->bif, x, y); dk3bm_write_uc(of, (v - pl)); pl = v; v = dk3bif_get_green(job->bif, x, y); dk3bm_write_uc(of, (v - pu)); pu = v; v = dk3bif_get_blue(job->bif, x, y); dk3bm_write_uc(of, (v - plu)); plu = v; } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; case DK3_COMPRESSION_PREDICTOR_PNG_SUB: { for(y = 0UL; y < h; y++) { pl = 0; /* r */ pu = 0; /* g */ plu = 0; /* b */ dk3bm_write_uc(of, 1); for(x = 0UL; x < w; x++) { v = dk3bif_get_red(job->bif, x, y); dk3bm_write_uc(of, (v - pl)); pl = v; v = dk3bif_get_green(job->bif, x, y); dk3bm_write_uc(of, (v - pu)); pu = v; v = dk3bif_get_blue(job->bif, x, y); dk3bm_write_uc(of, (v - plu)); plu = v; } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; case DK3_COMPRESSION_PREDICTOR_PNG_UP: { for(y = 0UL; y < h; y++) { dk3bm_write_uc(of, 2); for(x = 0UL; x < w; x++) { v = dk3bif_get_red(job->bif, x, y); pu = dk3bif_get_red(job->bif, x, (y - 1L)); dk3bm_write_uc(of, (v - pu)); v = dk3bif_get_green(job->bif, x, y); pu = dk3bif_get_green(job->bif, x, (y - 1L)); dk3bm_write_uc(of, (v - pu)); v = dk3bif_get_blue(job->bif, x, y); pu = dk3bif_get_blue(job->bif, x, (y - 1L)); dk3bm_write_uc(of, (v - pu)); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; case DK3_COMPRESSION_PREDICTOR_PNG_AVERAGE: { for(y = 0UL; y < h; y++) { dk3bm_write_uc(of, 3); for(x = 0UL; x < w; x++) { v = dk3bif_get_red(job->bif, x, y); pl = dk3bif_get_red(job->bif, (x - 1L), y); pu = dk3bif_get_red(job->bif, x, (y - 1L)); pu = dk3bif_average(pl, pu); dk3bm_write_uc(of, (v - pu)); v = dk3bif_get_green(job->bif, x, y); pl = dk3bif_get_green(job->bif, (x - 1L), y); pu = dk3bif_get_green(job->bif, x, (y - 1L)); pu = dk3bif_average(pl, pu); dk3bm_write_uc(of, (v - pu)); v = dk3bif_get_blue(job->bif, x, y); pl = dk3bif_get_blue(job->bif, (x - 1L), y); pu = dk3bif_get_blue(job->bif, x, (y - 1L)); pu = dk3bif_average(pl, pu); dk3bm_write_uc(of, (v - pu)); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; case DK3_COMPRESSION_PREDICTOR_PNG_PAETH: { for(y = 0UL; y < h; y++) { dk3bm_write_uc(of, 3); for(x = 0UL; x < w; x++) { v = dk3bif_get_red(job->bif, x, y); pl = dk3bif_get_red(job->bif, (x - 1L), y); pu = dk3bif_get_red(job->bif, x, (y - 1L)); plu = dk3bif_get_red(job->bif, (x - 1L), (y - 1L)); pu = dk3bif_paeth(pl, pu, plu); dk3bm_write_uc(of, (v - pu)); v = dk3bif_get_green(job->bif, x, y); pl = dk3bif_get_green(job->bif, (x - 1L), y); pu = dk3bif_get_green(job->bif, x, (y - 1L)); plu = dk3bif_get_green(job->bif, (x - 1L), (y - 1L)); pu = dk3bif_paeth(pl, pu, plu); dk3bm_write_uc(of, (v - pu)); v = dk3bif_get_blue(job->bif, x, y); pl = dk3bif_get_blue(job->bif, (x - 1L), y); pu = dk3bif_get_blue(job->bif, x, (y - 1L)); plu = dk3bif_get_blue(job->bif, (x - 1L), (y - 1L)); pu = dk3bif_paeth(pl, pu, plu); dk3bm_write_uc(of, (v - pu)); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; default : { for(y = 0UL; y < h; y++) { for(x = 0UL; x < w; x++) { v = dk3bif_get_red(job->bif, x, y); dk3bm_write_uc(of, v); v = dk3bif_get_green(job->bif, x, y); dk3bm_write_uc(of, v); v = dk3bif_get_blue(job->bif, x, y); dk3bm_write_uc(of, v); } #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; } } } else { if(alphain) { switch((job->opt)->pred) { case DK3_COMPRESSION_PREDICTOR_TIFF: { for(y = 0UL; y < h; y++) { pl = 0; pu = 0; plu = 0; for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_red(job->bif, x, y); dk3of_write_bits(of, (v - pl), job->bpc); pl = v; v = dk3bif_get_mixed_green(job->bif, x, y); dk3of_write_bits(of, (v - pu), job->bpc); pu = v; v = dk3bif_get_mixed_blue(job->bif, x, y); dk3of_write_bits(of, (v - plu), job->bpc); plu = v; } dk3of_flush_bits(of); #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; default: { for(y = 0UL; y < h; y++) { for(x = 0UL; x < w; x++) { v = dk3bif_get_mixed_red(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); v = dk3bif_get_mixed_green(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); v = dk3bif_get_mixed_blue(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); } dk3of_flush_bits(of); #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; } } else { switch((job->opt)->pred) { case DK3_COMPRESSION_PREDICTOR_TIFF: { for(y = 0UL; y < h; y++) { pl = 0; pu = 0; plu = 0; for(x = 0UL; x < w; x++) { v = dk3bif_get_red(job->bif, x, y); dk3of_write_bits(of, (v - pl), job->bpc); pl = v; v = dk3bif_get_green(job->bif, x, y); dk3of_write_bits(of, (v - pu), job->bpc); pu = v; v = dk3bif_get_blue(job->bif, x, y); dk3of_write_bits(of, (v - plu), job->bpc); plu = v; } dk3of_flush_bits(of); #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; default: { for(y = 0UL; y < h; y++) { for(x = 0UL; x < w; x++) { v = dk3bif_get_red(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); v = dk3bif_get_green(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); v = dk3bif_get_blue(job->bif, x, y); dk3of_write_bits(of, v, job->bpc); } dk3of_flush_bits(of); #if DK3_USE_WX dk3bmj_lines_progress(job->pComm,pbmin,pbmax,h,y); #endif } } break; } } } back = dk3of_end_chunk(of); } else { /* ERROR: Failed to start encoded chunk! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 59, DK3_BMJ_LOG_BOTH, job ); } } else { /* ERROR: Failed to add run-length cell! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 59, DK3_BMJ_LOG_BOTH, job ); } } break; } } else { /* ERROR: Failed to add filter cell! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 59, DK3_BMJ_LOG_BOTH, job ); } dk3of_close(of); } else { /* ERROR: Failed to create output filter! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 59, DK3_BMJ_LOG_BOTH, job ); } dk3stream_close(os); } else { /* ERROR: Failed to create output stream! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 59, DK3_BMJ_LOG_BOTH, job ); } /* File footer. */ if(job->do_header_footer) { dk3bm_ps_document_footer(job); } } else { $? "! no output file" /* BUG: No output file! */ } #if DK3_USE_WX job->minpb = minpb; job->maxpb = maxpb; #endif $? "- dk3bm_job_produce_img_job_real_ps %d", back return back; } int dk3bm_find_transformation( dk3_coordinates_transformation_t *dst, dk3_bb_t *outbb, int drawdir, double imw, double imh, double xres, double yres, int *ec ) { double w = 0.0; /* Image width. */ double h = 0.0; /* Image height. */ double sx = 0.0; /* X scale factor. */ double sy = 0.0; /* Y scale factor. */ double sf = 0.0; /* Scale factor. */ double xmin = 0.0; /* Minimum X. */ double xmax = 0.0; /* Maximum X. */ double ymin = 0.0; /* Minimum Y. */ double ymax = 0.0; /* Maximum Y. */ double xused = 0.0; /* Used X range. */ double yused = 0.0; /* Used Y range. */ double xborder = 0.0; /* X border. */ double yborder = 0.0; /* Y border. */ int mec = 0; /* Mathematical error code. */ int back = 0; $? "+ dk3bm_find_transformation w=%lg h=%lg xr=%lg yr=%lg",imw,imh,xres,yres if((dst) && (outbb)) { back = 1; w = imw; $? ". w = %lg", w h = imh; $? ". h = %lg", h if((xres > 0.0) && (yres > 0.0)) { w = dk3ma_d_div_ok(w, xres, &mec); $? ". w = %lg", w h = dk3ma_d_div_ok(h, yres, &mec); $? ". h = %lg", h } sx = sy = sf = 0.0; switch(drawdir) { case DK3_IMAGE_ORIGIN_LEFT_BOTTOM: case DK3_IMAGE_ORIGIN_RIGHT_TOP: case DK3_IMAGE_ORIGIN_LEFT_TOP_FLIPPED: case DK3_IMAGE_ORIGIN_RIGHT_BOTTOM_FLIPPED: { sx = dk3ma_d_div_ok( dk3ma_d_sub_ok(outbb->xmax, outbb->xmin, ec), h, ec ); sy = dk3ma_d_div_ok( dk3ma_d_sub_ok(outbb->ymax, outbb->ymin, ec), w, ec ); if(sx < sy) { /* Entire X range used. */ xmin = outbb->xmin; xmax = outbb->xmax; xused = dk3ma_d_sub_ok(xmax, xmin, ec); xborder = 0.0; yused = dk3ma_d_mul_ok(sx, w, ec); yborder = 0.5 * dk3ma_d_sub_ok( dk3ma_d_sub_ok(outbb->ymax, outbb->ymin, ec), yused, ec ); if(yborder < 0.0) { yborder = 0.0; } ymin = dk3ma_d_add_ok(outbb->ymin, yborder, ec); ymax = dk3ma_d_add_ok(ymin, yused, ec); } else { /* Entire Y range used. */ ymin = outbb->ymin; ymax = outbb->ymax; yused = dk3ma_d_sub_ok(ymax, ymin, ec); yborder = 0.0; xused = dk3ma_d_mul_ok(sy, h, ec); xborder = 0.5 * dk3ma_d_sub_ok( dk3ma_d_sub_ok(outbb->xmax, outbb->xmin, ec), xused, ec ); if(xborder < 0.0) { xborder = 0.0; } xmin = dk3ma_d_add_ok(outbb->xmin, xborder, ec); xmax = dk3ma_d_add_ok(xmin, xused, ec); } } break; default: { sx = dk3ma_d_div_ok( dk3ma_d_sub_ok(outbb->xmax, outbb->xmin, ec), w, ec ); sy = dk3ma_d_div_ok( dk3ma_d_sub_ok(outbb->ymax, outbb->ymin, ec), h, ec ); if(sx < sy) { /* Entire X range used. */ xmin = outbb->xmin; xmax = outbb->xmax; xused = dk3ma_d_sub_ok(xmax, xmin, ec); xborder = 0.0; yused = dk3ma_d_mul_ok(sx, h, ec); yborder = 0.5 * dk3ma_d_sub_ok( dk3ma_d_sub_ok(outbb->ymax, outbb->ymin, ec), yused, ec ); if(yborder < 0.0) { yborder = 0.0; } ymin = dk3ma_d_add_ok(outbb->ymin, yborder, ec); ymax = dk3ma_d_add_ok(ymin, yused, ec); } else { /* Entire Y range used. */ ymin = outbb->ymin; ymax = outbb->ymax; yused = dk3ma_d_sub_ok(ymax, ymin, ec); yborder = 0.0; xused = dk3ma_d_mul_ok(sy, w, ec); xborder = 0.5 * dk3ma_d_sub_ok( dk3ma_d_sub_ok(outbb->xmax, outbb->xmin, ec), xused, ec ); if(xborder < 0.0) { xborder = 0.0; } xmin = dk3ma_d_add_ok(outbb->xmin, xborder, ec); xmax = dk3ma_d_add_ok(xmin, xused, ec); } } break; } dst->x_scale = xused; dst->y_scale = yused; $? ". xused = %lg", xused $? ". yused = %lg", yused $? ". xmin = %lg", xmin $? ". xmax = %lg", xmax $? ". ymin = %lg", ymin $? ". ymax = %lg", ymax dst->rot = 0; switch(drawdir) { case DK3_IMAGE_ORIGIN_LEFT_BOTTOM: { /* 1 */ dst->x_translate = xmax; dst->y_translate = ymin; dst->rot = 1; dst->x_scale = yused; dst->y_scale = xused; } break; case DK3_IMAGE_ORIGIN_RIGHT_TOP: { /* 2 */ dst->x_translate = xmin; dst->y_translate = ymax; dst->rot = 3; dst->x_scale = yused; dst->y_scale = xused; } break; case DK3_IMAGE_ORIGIN_RIGHT_BOTTOM: { /* 3 */ dst->x_translate = xmax; dst->y_translate = ymax; dst->rot = 2; } break; case DK3_IMAGE_ORIGIN_LEFT_TOP_FLIPPED: { /* 4 */ dst->x_translate = xmax; dst->y_translate = ymax; dst->rot = 1; dst->x_scale = yused; dst->y_scale = xused; dst->x_scale = -1.0 * (dst->x_scale); } break; case DK3_IMAGE_ORIGIN_LEFT_BOTTOM_FLIPPED: { /* 5 */ dst->x_translate = xmin; dst->y_translate = ymax; dst->y_scale = -1.0 * (dst->y_scale); } break; case DK3_IMAGE_ORIGIN_RIGHT_TOP_FLIPPED: { /* 6 */ dst->x_translate = xmax; dst->y_translate = ymin; dst->x_scale = -1.0 * (dst->x_scale); } break; case DK3_IMAGE_ORIGIN_RIGHT_BOTTOM_FLIPPED: { /* 7 */ dst->x_translate = xmin; dst->y_translate = ymin; dst->rot = 3; dst->x_scale = yused; dst->y_scale = xused; dst->x_scale = -1.0 * (dst->x_scale); } break; default: { /* left top */ dst->x_translate = xmin; dst->y_translate = ymin; dst->rot = 0; } break; } $? ". x translate = %lg", dst->x_translate $? ". y translate = %lg", dst->y_translate $? ". rotate = %d", dst->rot $? ". x scale = %lg", dst->x_scale $? ". y_scale = %lg", dst->y_scale } if(mec) { if(ec) { *ec = mec; } } $? "- dk3bm_find_transformation %d", back return back; } int dk3bm_find_bif_transformation( dk3_coordinates_transformation_t *dst, dk3_bif_t *bif, dk3_bb_t *outbb, int drawdir, int *ec ) { double w; double h; double xres; double yres; dk3_bif_coord_t imw; dk3_bif_coord_t imh; int back = 0; $? "+ dk3bm_find_bif_transformation" if((dst) && (bif) && (outbb)) { imw = dk3bif_get_width(bif); imh = dk3bif_get_height(bif); w = (double)imw; h = (double)imh; xres = dk3bif_get_xres(bif); yres = dk3bif_get_yres(bif); back = dk3bm_find_transformation(dst, outbb, drawdir, w, h, xres, yres, ec); } $? "- dk3bm_find_bif_transformation" return back; } int dk3bm_ps_place_object( FILE *dfile, dk3_bb_t *outbb, int drawdir, char const *sfn, dk3_app_t *app, int pslevel, int *ec ) { dk3_coordinates_transformation_t trans; dk3_bm_eps_options_t bmeo; dk3_bm_conversion_job_t job; int back = 0; $? "+ dk3bm_ps_place_object %d", drawdir if((dfile) && (outbb) && (sfn) && (app)) { dk3bmj_init(&job, app); dk3bmeo_init(&bmeo); $? ". job and options initialized" job.opt = &bmeo; job.sfn = NULL; job.dfile = dfile; job.do_header_footer = 0; bmeo.app = app; bmeo.ima.ia.xl = outbb->xmin; bmeo.ima.ia.xr = outbb->xmax; bmeo.ima.ia.yb = outbb->ymin; bmeo.ima.ia.yt = outbb->ymax; #if VERSION_BEFORE_20140902 bmeo.mode = bmeo.szmode = bmeo.dr = DK3_BMEPS_DRIVER_EPS; #else bmeo.mode = DK3_BMEPS_MODE_OBJECT; bmeo.szmode = DK3_BMEPS_SIZE_1_1; $? ". szmode = 1:1" bmeo.dr = DK3_BMEPS_DRIVER_EPS; #endif bmeo.io = drawdir; bmeo.psl = pslevel; job.bif = dk3bif_open_c8_filename_app(sfn,DK3_BIF_IMAGE_TYPE_UNKNOWN,app); if(job.bif) { $? ". bif opened" job.biftype = dk3bif_get_type(job.bif); /* job.procedure = */ $? ". bif type = %d", job.biftype /* job->x_size */ /* job->y_size */ /* job->x_0 */ /* job->x_1 */ /* job->y_0 */ /* job->y_1 */ /* job->procedure */ /* job->bpc */ /* job->nPages */ /* job->currentPage */ if(dk3bm_find_bif_transformation(&trans, job.bif, outbb, drawdir, ec)) { /* FIG2LAT */ $? ". transformations found" job.x_translate = trans.x_translate; job.y_translate = trans.y_translate; job.x_scale = trans.x_scale; job.y_scale = trans.y_scale; job.do_rotate = trans.rot; job.do_translate = 1; job.do_float_scale = 1; $? ". going to produce image data" if(dk3bif_read_data(job.bif)) { back = dk3bm_job_produce_img_job_real_ps(&job); } else { /* ##### ERROR: Failed to read image data! */ } } else { /* ##### ERROR: Failed to calculate transformation data */ } dk3bif_close(job.bif); } else { $? "! failed to open image" /* ##### ERROR: Failed to open image */ } } else { $? "! arguments" } $? "- dk3bm_ps_place_object %d", back return back; } /** Paper size check function. @param ps Paper size to check. @return 1 on success, 0 on error (borders larger than paper). */ static int dk3bm_check_paper_size(dk3_paper_size_t *ps) { int back = 0; $? "+ dk3bm_check_paper_size" if(ps->w > (ps->i + ps->o)) { if(ps->h > (ps->t + ps->b)) { back = 1; } } $? "- dk3bm_check_paper_size %d", back return back; } /** Produce PS draft for image or object. The x_0, x_1, y_0 and y_1 values must be set. @param job Conversion job. @return 1 on succes, 0 on error. */ static int dk3bm_job_produce_img_job_draft_ps(dk3_bm_conversion_job_t *job) { char outputbuffer[256]; /* Conversion buffer for numbers. */ double dx; /* Stripe width. */ double dy; /* Stripe width backup. */ int back = 0; $? "+ dk3bm_job_produce_img_job_draft_ps" dk3bm_ps_document_header(job, job->nPages); fputs(dk3bm_c8_kw[4], job->dfile); fputs(dk3bm_c8_kw[21], job->dfile); fputs(dk3bm_c8_kw[71], job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[72], job->x_0, job->y_0); dk3bm_correct_output_buffer(outputbuffer); fputs(outputbuffer, job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[73], job->x_1, job->y_0); dk3bm_correct_output_buffer(outputbuffer); fputs(outputbuffer, job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[73], job->x_1, job->y_1); dk3bm_correct_output_buffer(outputbuffer); fputs(outputbuffer, job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[73], job->x_0, job->y_1); dk3bm_correct_output_buffer(outputbuffer); fputs(outputbuffer, job->dfile); fputs(dk3bm_c8_kw[74], job->dfile); dx = 0.01 * (job->x_1 - job->x_0); dy = 0.01 * (job->y_1 - job->y_0); if(dy < dx) dx = dy; if(dx > 2.8) dx = 2.8; fputs(dk3bm_c8_kw[75], job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[72], job->x_0+dx, job->y_0+dx); dk3bm_correct_output_buffer(outputbuffer); fputs(outputbuffer, job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[73], job->x_1-dx, job->y_0+dx); dk3bm_correct_output_buffer(outputbuffer); fputs(outputbuffer, job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[73], job->x_1-dx, job->y_1-dx); dk3bm_correct_output_buffer(outputbuffer); fputs(outputbuffer, job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[73], job->x_0+dx, job->y_1-dx); dk3bm_correct_output_buffer(outputbuffer); fputs(outputbuffer, job->dfile); fputs(dk3bm_c8_kw[74], job->dfile); dx = 10.0 * dx; fputs(dk3bm_c8_kw[76], job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[72], job->x_0+dx, job->y_0+dx); dk3bm_correct_output_buffer(outputbuffer); fputs(outputbuffer, job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[73], job->x_1-dx, job->y_0+dx); dk3bm_correct_output_buffer(outputbuffer); fputs(outputbuffer, job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[73], job->x_1-dx, job->y_1-dx); dk3bm_correct_output_buffer(outputbuffer); fputs(outputbuffer, job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[73], job->x_0+dx, job->y_1-dx); dk3bm_correct_output_buffer(outputbuffer); fputs(outputbuffer, job->dfile); fputs(dk3bm_c8_kw[74], job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[77], 0.9 * dx); dk3bm_correct_output_buffer(outputbuffer); fputs(outputbuffer, job->dfile); fputs(dk3bm_c8_kw[75], job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[72], job->x_0+dx, job->y_0+dx); dk3bm_correct_output_buffer(outputbuffer); fputs(outputbuffer, job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[73], job->x_1-dx, job->y_1-dx); dk3bm_correct_output_buffer(outputbuffer); fputs(outputbuffer, job->dfile); fputs(dk3bm_c8_kw[79], job->dfile); fputs(dk3bm_c8_kw[78], job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[72], job->x_0+dx, job->y_1-dx); dk3bm_correct_output_buffer(outputbuffer); fputs(outputbuffer, job->dfile); sprintf(outputbuffer, dk3bm_c8_kw[73], job->x_1-dx, job->y_0+dx); dk3bm_correct_output_buffer(outputbuffer); fputs(outputbuffer, job->dfile); fputs(dk3bm_c8_kw[79], job->dfile); fputs(dk3bm_c8_kw[5], job->dfile); switch((job->opt)->mode) { case DK3_BMEPS_MODE_IMAGE: case DK3_BMEPS_MODE_DOCUMENT: { if((job->opt)->dr == DK3_BMEPS_DRIVER_PS) { fputs(dk3bm_c8_kw[6], job->dfile); /* showpage */ } } break; } dk3bm_ps_document_footer(job); $? "- dk3bm_job_produce_img_job_draft_ps %d", back return back; } /** Do the real work when producing a PS document. @param job Job structure. @return 1 on success, 0 on error. */ static int dk3bm_job_produce_doc_real_ps(dk3_bm_conversion_job_t *job) { double dmaxwidth = 0.0; /* Max width PS points. */ double dmaxheight = 0.0; /* Max height PS points. */ double xres; /* X res current frame. */ double yres; /* Y res current frame. */ double deltax; /* Real x width. */ double deltay; /* Real y width. */ double sx; /* Scale factor x. */ double sy; /* Scale factor y. */ dk3_bif_coord_t maxwidth = 0L; /* Max width pixels. */ dk3_bif_coord_t maxheight = 0L; /* Max height pixels. */ dk3_bif_coord_t w; /* Current frame width. */ dk3_bif_coord_t h; /* Current frame height. */ size_t nFrames; /* Number of frames. */ size_t cf; /* Current frame. */ int me = 0; /* Math error. */ int workmode = 0; /* Transformation mode. */ int back = 1; int must_rotate = 0; /* Flag: Must rotate. */ #if DK3_USE_WX int minpb; /* Original min progress bar value. */ int maxpb; /* Original max progress bar value. */ #endif $? "+ dk3bm_job_produce_doc_real_p2" #if DK3_USE_WX minpb = job->minpb; maxpb = job->maxpb; #endif switch((job->opt)->szmode) { case DK3_BMEPS_SIZE_1_1: { $? ". szmode: 1:1" workmode = 0; } break; case DK3_BMEPS_SIZE_CHUNK: case DK3_BMEPS_SIZE_SPECIFIED: { workmode = 1; $? ". szmode: chunk/specified" } break; case DK3_BMEPS_SIZE_PAPER: { $? ". szmode: paper size" workmode = 2; if(!dk3bm_check_paper_size(&(((job->opt)->ima).ps))) { back = 0; /* ERROR: Incorrect paper size setup! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 62, DK3_BMJ_LOG_BOTH, job ); } } break; } if(back) { nFrames = dk3bif_number_of_frames(job->bif); for(cf = 0; cf < nFrames; cf++) { dk3bif_set_frame(job->bif, cf); job->currentPage = cf + 1; w = dk3bif_get_width(job->bif); h = dk3bif_get_height(job->bif); if(w > maxwidth) { maxwidth = w; } if(h > maxheight) { maxheight = h; } if(workmode == 1) { switch((job->opt)->szmode) { case DK3_BMEPS_SIZE_SPECIFIED: { $? ". szmode: specified" xres = yres = (job->opt)->resolution; } break; default: { $? ". szmode: other" xres = dk3bif_get_xres(job->bif); yres = dk3bif_get_yres(job->bif); } break; } if(xres <= 0.0) { xres = 72.0; } if(yres <= 0.0) { yres = 72.0; } if(fabs(xres - 72.0) > dk3bm_epsilon) { deltax = dk3ma_d_mul_ok( 72.0, dk3ma_d_div_ok(dk3bm_l_to_d(w), xres, &me), &me ); } else { deltax = dk3bm_l_to_d(w); } if(fabs(yres - 72.0) > dk3bm_epsilon) { deltay = dk3ma_d_mul_ok( 72.0, dk3ma_d_div_ok(dk3bm_l_to_d(h), yres, &me), &me ); } else { deltay = dk3bm_l_to_d(h); } if(deltax > dmaxwidth) { dmaxwidth = deltax; } if(deltay > dmaxheight) { dmaxheight = deltay; } } } switch(workmode) { case 0: { job->x_size = maxwidth; job->y_size = maxheight; } break; case 1: { dmaxwidth = ceil(dmaxwidth); dmaxheight = ceil(dmaxheight); job->x_size = dk3ma_d_to_l_ok(dmaxwidth, &me); job->y_size = dk3ma_d_to_l_ok(dmaxheight, &me); } break; case 2: { job->x_size = dk3ma_d_to_l_ok(floor(((job->opt)->ima).ps.w), &me); job->y_size = dk3ma_d_to_l_ok(floor(((job->opt)->ima).ps.h), &me); } break; } /* Produce output. */ if(back) { job->nPages = nFrames; dk3bm_ps_document_header(job, job->nPages); job->do_header_footer = 0; for(cf = 0; cf < nFrames; cf++) { #if DK3_USE_WX job->minpb = minpb + (int)cf * (maxpb - minpb) / (int)nFrames; job->maxpb = minpb + (1 + (int)cf) * (maxpb - minpb) / (int)nFrames; if(job->minpb < minpb) { job->minpb = minpb; } if(job->maxpb > maxpb) { job->maxpb = maxpb; } #endif dk3bif_set_frame(job->bif, cf); w = dk3bif_get_width(job->bif); h = dk3bif_get_height(job->bif); job->currentPage = cf + 1; job->x_translate = 0.0; job->y_translate = 0.0; job->x_0 = 0.0; job->y_0 = 0.0; job->x_1 = 0.0; job->y_1 = 0.0; job->x_scale = 1.0; job->y_scale = 1.0; job->do_translate = 0; job->do_float_scale = 0; job->do_rotate = 0; must_rotate = 0; switch(workmode) { case 0: { if(w < maxwidth) { job->x_translate = 0.5 * dk3bm_l_to_d(maxwidth - w); job->do_translate = 1; } if(h < maxheight) { job->y_translate = 0.5 * dk3bm_l_to_d(maxheight - h); job->do_translate = 1; } if(job->do_translate) { job->x_scale = dk3bm_l_to_d(w); job->y_scale = dk3bm_l_to_d(h); job->do_float_scale = 1; } } break; case 1: { job->do_float_scale = 1; job->do_translate = 1; switch((job->opt)->szmode) { case DK3_BMEPS_SIZE_SPECIFIED: { $? ". szmode: specified" xres = yres = (job->opt)->resolution; } break; default: { $? ". szmode: other" xres = dk3bif_get_xres(job->bif); yres = dk3bif_get_yres(job->bif); } break; } if(xres <= 0.0) { xres = 72.0; } if(yres <= 0.0) { yres = 72.0; } if(fabs(xres - 72.0) > dk3bm_epsilon) { deltax = dk3ma_d_mul_ok( 72.0, dk3ma_d_div_ok(dk3bm_l_to_d(w), xres, &me), &me ); } else { deltax = dk3bm_l_to_d(w); } if(fabs(yres - 72.0) > dk3bm_epsilon) { deltay = dk3ma_d_mul_ok( 72.0, dk3ma_d_div_ok(dk3bm_l_to_d(h), yres, &me), &me ); } else { deltay = dk3bm_l_to_d(h); } job->x_scale = deltax; job->y_scale = deltay; job->x_translate = 0.5 * (dmaxwidth - deltax); job->y_translate = 0.5 * (dmaxheight - deltay); } break; case 2: { job->do_float_scale = 1; job->do_translate = 1; if((job->opt)->duplex) { if((job->opt)->tumble) { if((job->currentPage) % 2) { job->y_0 = ((job->opt)->ima).ps.b; job->y_1 = ((job->opt)->ima).ps.h - ((job->opt)->ima).ps.t; } else { job->y_0 = ((job->opt)->ima).ps.t; job->y_1 = ((job->opt)->ima).ps.h - ((job->opt)->ima).ps.b; } job->x_0 = ((job->opt)->ima).ps.i; job->x_1 = ((job->opt)->ima).ps.w - ((job->opt)->ima).ps.o; } else { if((job->currentPage) % 2) { job->x_0 = ((job->opt)->ima).ps.i; job->x_1 = ((job->opt)->ima).ps.w - ((job->opt)->ima).ps.o; } else { job->x_0 = ((job->opt)->ima).ps.o; job->x_1 = ((job->opt)->ima).ps.w - ((job->opt)->ima).ps.i; } job->y_0 = ((job->opt)->ima).ps.b; job->y_1 = ((job->opt)->ima).ps.h - ((job->opt)->ima).ps.t; } } else { job->x_0 = ((job->opt)->ima).ps.i; job->x_1 = ((job->opt)->ima).ps.w - ((job->opt)->ima).ps.o; job->y_0 = ((job->opt)->ima).ps.b; job->y_1 = ((job->opt)->ima).ps.h - ((job->opt)->ima).ps.t; } xres = dk3bif_get_xres(job->bif); yres = dk3bif_get_yres(job->bif); if(xres <= 0.0) xres = 72.0; if(yres <= 0.0) yres = 72.0; if(fabs(xres - 72.0) > dk3bm_epsilon) { deltax = dk3ma_d_mul_ok( 72.0, dk3ma_d_div_ok(dk3bm_l_to_d(w), xres, &me), &me ); } else { deltax = dk3bm_l_to_d(w); } if(fabs(yres - 72.0) > dk3bm_epsilon) { deltay = dk3ma_d_mul_ok( 72.0, dk3ma_d_div_ok(dk3bm_l_to_d(h), yres, &me), &me ); } else { deltay = dk3bm_l_to_d(h); } if((job->y_1 - job->y_0) > (job->x_1 - job->x_0)) { if(deltax > deltay) { must_rotate = 1; } } else { if((job->y_1 - job->y_0) < (job->x_1 - job->x_0)) { if(deltax > deltay) { must_rotate = 1; } } } if(must_rotate) { job->do_rotate = 1; sx = dk3ma_d_div_ok((job->y_1 - job->y_0), deltax, &me); sy = dk3ma_d_div_ok((job->x_1 - job->x_0), deltay, &me); if(sx < sy) { job->x_scale = job->y_1 - job->y_0; job->y_scale = dk3ma_d_mul_ok(sx, deltay, &me); job->x_translate = job->x_1 - 0.5 * (job->x_1 - job->x_0 - job->y_scale); job->y_translate = job->y_0; } else { job->y_scale = job->x_1 - job->x_0; job->x_scale = dk3ma_d_mul_ok(sy, deltax, &me); job->x_translate = job->x_1; job->y_translate = job->y_0 + 0.5 * (job->y_1 - job->y_0 - job->x_scale); } } else { sx = dk3ma_d_div_ok((job->x_1 - job->x_0), deltax, &me); sy = dk3ma_d_div_ok((job->y_1 - job->y_0), deltay, &me); if(sx < sy) { job->x_scale = job->x_1 - job->x_0; job->y_scale = dk3ma_d_mul_ok(sx, deltay, &me); job->x_translate = job->x_0; job->y_translate = job->y_0 + 0.5 * (job->y_1 - job->y_0 - job->y_scale); } else { job->y_scale = job->y_1 - job->y_0; job->x_scale = dk3ma_d_mul_ok(sy, deltax, &me); job->y_translate = job->y_0; job->x_translate = job->x_0 + 0.5 * (job->x_1 - job->x_0 - job->x_scale); } } $? ". x_scale = %lg", job->x_scale $? ". y_scale = %lg", job->y_scale $? ". x_translate = %lg", job->x_translate $? ". y_translate = %lg", job->y_translate $? ". do_rotate = %d", job->do_rotate } break; } /* Output current frame. */ if(back) { if(!dk3bm_job_produce_img_job_real_ps(job)) { back = 0; } } #if DK3_USE_WX dk3bmj_progress(job->pComm, job->maxpb); #endif } dk3bm_ps_document_footer(job); } } #if DK3_USE_WX job->minpb = minpb; job->maxpb = maxpb; #endif $? "- dk3bm_job_produce_doc_real_ps %d", back return back; } /** Produce PS document. @param job Conversion job. @return 1 on success, 0 on error. */ static int dk3bm_job_produce_doc_ps(dk3_bm_conversion_job_t *job) { int back = 0; #if DK3_USE_WX int min; /* Original min progress bar value. */ int max; /* Original max progress bar value. */ #endif /* PROGRESS: Reading image. */ $? "+ dk3bm_job_produce_doc_ps" dk3app_log_1((job->opt)->app, DK3_LL_PROGRESS, job->msg, 47); #if DK3_USE_WX min = job->minpb; max = job->maxpb; #endif if(dk3bif_read_data(job->bif)) { $? ". image ok" #if DK3_USE_WX $? ". 1/3" dk3bmj_progress(job->pComm, job->minpb + (job->maxpb - job->minpb)/3); job->minpb = job->minpb + ((job->maxpb - job->minpb)/3); #endif if(job->dfile) { back = dk3bm_job_produce_doc_real_ps(job); } else { job->dfile = dk3sf_fopen_app( job->dfn, dk3app_not_localized(24), (job->opt)->app ); if(job->dfile) { back = dk3bm_job_produce_doc_real_ps(job); if(!dk3sf_fclose_fn_app(job->dfile, job->dfn, (job->opt)->app)) { back = 0; } job->dfile = NULL; } else { /* ERROR: Failed to open output file! */ dk3bmj_log_i3( (job->opt)->app, DK3_LL_ERROR, 77, 78, job->dfn, DK3_BMJ_LOG_JOB, job ); } } } else { $? "! failed to read image" /* ERROR: Failed to read image data! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 61, DK3_BMJ_LOG_BOTH, job ); } #if DK3_USE_WX job->minpb = min; job->maxpb = max; #endif $? "- dk3bm_job_produce_doc_ps %d", back return back; } /** Produce PS image or object. @param job Conversion job. @return 1 on success, 0 on error. */ static int dk3bm_job_produce_img_obj_ps(dk3_bm_conversion_job_t *job) { double w; /* Image width used. */ double h; /* Image height used. */ double xr = 0.0; /* X resolution. */ double yr = 0.0; /* Y resolution. */ int back = 1; int ur = 0; /* Flag: Use resolution. */ int ec = 0; /* Math error code. */ $? "+ dk3bm_job_produce_img_obj_ps" /* Prepare for size 1:1. */ job->x_size = dk3bif_get_width(job->bif); job->y_size = dk3bif_get_height(job->bif); job->x_1 = dk3bm_l_to_d(job->x_size); job->y_1 = dk3bm_l_to_d(job->y_size); $? ". w=%ld h=%ld", job->x_size, job->y_size /* Attempt to use other size/resolution if required. */ switch((job->opt)->szmode) { case DK3_BMEPS_SIZE_CHUNK: { $? ". szmode: chunk" xr = dk3bif_get_xres(job->bif); yr = dk3bif_get_yres(job->bif); $? ". xr=%lg yr=%lg", xr, yr if((xr > 0.0) && (yr > 0.0)) { $? ". rounding error = %lg", fabs(xr - 72.0) if(fabs(xr - 72.0) > dk3bm_epsilon) { ur = 1; } $? ". rounding error = %lg", fabs(yr - 72.0) if(fabs(yr - 72.0) > dk3bm_epsilon) { ur = 1; } } } break; case DK3_BMEPS_SIZE_SPECIFIED: { $? ". szmode: specified" if((job->opt)->resolution > 0.0) { $? ". rounding error = %lg", fabs((job->opt)->resolution - 72.0) if(fabs((job->opt)->resolution - 72.0) > dk3bm_epsilon) { xr = yr = (job->opt)->resolution; $? ". xr=%lg yr=%lg", xr, yr ur = 1; } } } break; } /* If we have to use a resolution, calculate dimensions. */ if(ur) { $? ". must use resolution" w = dk3bm_l_to_d(job->x_size); $? ". w=%ld h=%ld", job->x_size, job->y_size h = dk3bm_l_to_d(job->y_size); $? ". w=%lg h=%lg", w, h w = dk3ma_d_mul_ok(72.0, dk3ma_d_div_ok(w, xr, &ec), &ec); h = dk3ma_d_mul_ok(72.0, dk3ma_d_div_ok(h, yr, &ec), &ec); job->x_1 = ceil(w); $? ". w=%lg h=%lg", w, h job->y_1 = ceil(h); job->x_size = dk3ma_d_to_l_ok(job->x_1, &ec); job->y_size = dk3ma_d_to_l_ok(job->y_1, &ec); $? ". w=%ld h=%ld", job->x_size, job->y_size job->x_translate = 0.5 * (job->x_1 - w); job->y_translate = 0.5 * (job->y_1 - h); if(job->x_translate < 0.0) { job->x_translate = 0.0; } if(job->y_translate < 0.0) { job->y_translate = 0.0; } job->do_translate = 1; job->x_0 = job->x_translate; job->y_0 = job->y_translate; job->x_1 = job->x_0 + w; job->y_1 = job->y_0 + h; if(job->x_1 > dk3bm_l_to_d(job->x_size)) { job->x_1 = dk3bm_l_to_d(job->x_size); } if(job->y_1 > dk3bm_l_to_d(job->y_size)) { job->y_1 = dk3bm_l_to_d(job->y_size); } job->x_scale = w; job->y_scale = h; job->do_float_scale = 1; $? ". x0 = %lg", job->x_0 $? ". x1 = %lg", job->x_1 $? ". y0 = %lg", job->y_0 $? ". y1 = %lg", job->y_1 $? ". xt = %lg", job->x_translate $? ". yt = %lg", job->y_translate $? ". xs = %lg", job->x_scale $? ". ys = %lg", job->y_scale $? ". w = %ld", job->x_size $? ". h = %ld", job->y_size if(ec) { $? ". math error" back = 0; dk3bmj_log_i1( (job->opt)->app, DK3_LL_ERROR, 260, DK3_BMJ_LOG_BOTH, job ); } } /* If no error yet, go on. */ if(back) { if((job->opt)->draft) { $? ". draft" if(job->dfile) { $? ". file already set" back = dk3bm_job_produce_img_job_draft_ps(job); } else { $? ". must open output" job->dfile = dk3sf_fopen_app( job->dfn, dk3app_not_localized(24), (job->opt)->app ); if(job->dfile) { $? ". output ok" back = dk3bm_job_produce_img_job_draft_ps(job); if(!dk3sf_fclose_fn_app(job->dfile, job->dfn, (job->opt)->app)) { back = 0; } job->dfile = NULL; } else { $? "! failed to open output" back = 0; /* ERROR: Failed to open output file! */ dk3bmj_log_i3( (job->opt)->app, DK3_LL_ERROR, 77, 78, job->dfn, DK3_BMJ_LOG_JOB, job ); } } } else { $? ". real image" /* PROGRESS: Reading image. */ dk3app_log_1((job->opt)->app, DK3_LL_PROGRESS, job->msg, 47); if(dk3bif_read_data(job->bif)) { $? ". image ok" #if DK3_USE_WX $? ". 1/3" dk3bmj_progress(job->pComm, job->minpb + (job->maxpb - job->minpb)/3); job->minpb = job->minpb + ((job->maxpb - job->minpb)/3); #endif if(job->dfile) { $? ". file already set" back = dk3bm_job_produce_img_job_real_ps(job); } else { $? ". must open output" job->dfile = dk3sf_fopen_app( job->dfn, dk3app_not_localized(24), (job->opt)->app ); if(job->dfile) { $? ". output ok" back = dk3bm_job_produce_img_job_real_ps(job); if(!dk3sf_fclose_fn_app(job->dfile, job->dfn, (job->opt)->app)) { back = 0; } job->dfile = NULL; } else { $? "! failed to open output" back = 0; /* ERROR: Failed to open output file! */ dk3bmj_log_i3( (job->opt)->app, DK3_LL_ERROR, 77, 78, job->dfn, DK3_BMJ_LOG_JOB, job ); } } } else { $? "! failed to read image" back = 0; /* ERROR: Failed to read image data! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 61, DK3_BMJ_LOG_BOTH, job ); } } } $? "- dk3bm_job_produce_img_obj_ps %d", back return back; } /** Produce PS/EPS output. @param job Job structure. @return 1 on success, 0 on error. */ static int dk3bm_job_produce_ps(dk3_bm_conversion_job_t *job) { int back = 0; $? "+ dk3bm_job_produce_ps" switch((job->opt)->mode) { case DK3_BMEPS_MODE_DOCUMENT: { $? ". document" back = dk3bm_job_produce_doc_ps(job); } break; default: { $? ". image or object" back = dk3bm_job_produce_img_obj_ps(job); } break; } $? "- dk3bm_job_produce_ps %d", back return back; } /** Add one image frame as output page. @param job Conversion job. @param pageno Page number of frame to add. @return 1 on success, 0 on error. */ static int dk3bm_job_add_pdf_frame(dk3_bm_conversion_job_t *job, size_t pageno) { dk3_bif_coord_t w; /* Image width. */ dk3_bif_coord_t h; /* Image height. */ double xres = 0.0; /* X resolution. */ double yres = 0.0; /* Y resolution. */ double dw; /* Image width on paper. */ double dh; /* Image height on paper. */ double px0; /* Left x (paper). */ double px1; /* Right x (paper). */ double py0; /* Lower y (paper). */ double py1; /* Upper y (paper). */ double width; /* Paper width. */ double height; /* Paper height. */ double sx; /* Scale factor for x direction. */ double sy; /* Scale factor for y direction. */ long mbx0; /* Left x (media box). */ long mbx1; /* Right x (media box). */ long mby0; /* Lower y (media box). */ long mby1; /* Upper y (media box). */ int workmode; /* Transformation mode. */ int back = 1; int me = 0; /* Flag: Math error. */ $? "+ dk3bm_job_add_pdf_frame %s min=%d max=%d", TR_PTR(job->pComm), job->minpb, job->maxpb /* Re-initialize (we probably have to handle multiple frames in one job. */ job->x_translate = 0.0; job->y_translate = 0.0; job->x_scale = 1.0; job->y_scale = 1.0; job->x_0 = 0.0; job->x_1 = 0.0; job->y_0 = 0.0; job->y_1 = 0.0; job->x_size = 0L; job->y_size = 0L; job->bpc = 8; job->do_translate = 0; job->do_rotate = 0; job->do_float_scale = 0; job->procedure = 0; workmode = 0; mbx0 = mbx1 = mby0 = mby1 = 0L; /* Process image width, height and resolution. */ w = dk3bif_get_width(job->bif); h = dk3bif_get_height(job->bif); switch((job->opt)->szmode) { case DK3_BMEPS_SIZE_CHUNK: { $? ". szmode: chunk" xres = dk3bif_get_xres(job->bif); yres = dk3bif_get_yres(job->bif); if(xres > 0.0) { if(yres > 0.0) { if((fabs(xres - 72.0) > dk3bm_epsilon) || (fabs(yres - 72.0) > dk3bm_epsilon)) { workmode = 1; } } } } break; case DK3_BMEPS_SIZE_SPECIFIED: { $? ". szmode: specified" xres = yres = (job->opt)->resolution; if(xres > 0.0) { if(fabs(xres - 72.0) > dk3bm_epsilon) { workmode = 1; } } } break; case DK3_BMEPS_SIZE_PAPER: { $? ". szmode: paper" workmode = 2; xres = dk3bif_get_xres(job->bif); yres = dk3bif_get_yres(job->bif); if(xres <= 0.0) { xres = 72.0; } if(yres <= 0.0) { yres = 72.0; } if(fabs(xres - 72.0) <= dk3bm_epsilon) { xres = 72.0; } if(fabs(yres - 72.0) <= dk3bm_epsilon) { yres = 72.0; } } break; default: { $? ". szmode: 1:1" workmode = 0; } break; } switch(workmode) { case 2: { dw = dk3ma_d_mul_ok( 72.0, dk3ma_d_div_ok(dk3bm_l_to_d(w), xres, &me), &me ); dh = dk3ma_d_mul_ok( 72.0, dk3ma_d_div_ok(dk3bm_l_to_d(h), yres, &me), &me ); $? ". dw=%lg dh=%lg", dw, dh if(dk3bm_check_paper_size(&(((job->opt)->ima).ps))) { width = floor(((job->opt)->ima).ps.w); height = floor(((job->opt)->ima).ps.h); $? ". width=%lg", width $? ". height=%lg", height mbx1 = dk3ma_d_to_l_ok(width, &me); mby1 = dk3ma_d_to_l_ok(height, &me); if((job->opt)->duplex) { if((job->opt)->tumble) { if(pageno % 2) { /* Rueckseite */ px0 = ((job->opt)->ima).ps.i; px1 = width - ((job->opt)->ima).ps.o; py0 = ((job->opt)->ima).ps.t; py1 = height - ((job->opt)->ima).ps.b; } else { /* Vorderseite */ px0 = ((job->opt)->ima).ps.i; px1 = width - ((job->opt)->ima).ps.o; py0 = ((job->opt)->ima).ps.b; py1 = height - ((job->opt)->ima).ps.t; } } else { if(pageno % 2) { /* Rueckseite */ px0 = ((job->opt)->ima).ps.o; px1 = width - ((job->opt)->ima).ps.i; py0 = ((job->opt)->ima).ps.b; py1 = height - ((job->opt)->ima).ps.t; } else { /* Vorderseite */ px0 = ((job->opt)->ima).ps.i; px1 = width - ((job->opt)->ima).ps.o; py0 = ((job->opt)->ima).ps.b; py1 = height - ((job->opt)->ima).ps.t; } } } else { px0 = ((job->opt)->ima).ps.i; px1 = width - ((job->opt)->ima).ps.o; py0 = ((job->opt)->ima).ps.b; py1 = height - ((job->opt)->ima).ps.t; } if((px1 > px0) && (py1 > py0)) { if((py1 - py0) > (px1 - px0)) { $? ". paper is portrait" if(dw > dh) { $? ". image is landscape, rot" job->do_rotate = 1; } else { $? ". image is portrait" } } else { $? ". paper is prob landscape" if((py1 - py0) < (px1 - px0)) { $? ". paper is landscape" if(dh > dw) { $? ". image is portrait" job->do_rotate = 1; } else { } } } $? ". px0 = %lg", px0 $? ". px1 = %lg", px1 $? ". py0 = %lg", py0 $? ". py1 = %lg", py1 if(job->do_rotate) { $? ". rotate" sx = dk3ma_d_div_ok((py1 - py0), dw, &me); sy = dk3ma_d_div_ok((px1 - px0), dh, &me); if(sx > sy) { $? ". x factor too large" job->y_scale = (px1 - px0); job->x_scale = sy * dw; job->x_translate = px1; job->y_translate = py0 + 0.5 * (py1 - py0 - job->x_scale); if(job->y_translate < py0) { job->y_translate = py0; } } else { $? ". y factor too large" job->x_scale = (py1 - py0); job->y_scale = sx * dh; job->x_translate = px1 - 0.5 * (px1 - px0 - job->y_scale); if(job->x_translate > px1) { job->x_translate = px1; } job->y_translate = py0; } } else { $? ". no rotation" sx = dk3ma_d_div_ok((px1 - px0), dw, &me); sy = dk3ma_d_div_ok((py1 - py0), dh, &me); if(sx > sy) { $? ". x factor too large" job->y_scale = py1 - py0; job->x_scale = sy * dw; job->x_translate = px0 + 0.5 * (px1 - px0 - job->x_scale); if(job->x_translate < px0) { job->x_translate = px0; } job->y_translate = py0; } else { $? ". y factor too large" job->x_scale = px1 - px0; job->y_scale = sx * dh; job->y_translate = py0 + 0.5 * (py1 - py0 - job->y_scale); if(job->y_translate < py0) { job->y_translate = py0; } job->x_translate = px0; } } job->do_translate = 1; job->do_float_scale = 1; } else { $? "! page setup" back = 0; /* ERROR Page setup incorrect */ dk3bmj_log_i1( (job->opt)->app, DK3_LL_ERROR, 259, DK3_BMJ_LOG_BOTH, job ); } } else { back = 0; } $? ". x_scale = %lg", job->x_scale $? ". y_scale = %lg", job->y_scale $? ". x_translate = %lg", job->x_translate $? ". y_translate = %lg", job->y_translate $? ". do_rotate = %d", job->do_rotate } break; case 1: { dw = dk3ma_d_mul_ok( 72.0, dk3ma_d_div_ok(dk3bm_l_to_d(w), xres, &me), &me ); dh = dk3ma_d_mul_ok( 72.0, dk3ma_d_div_ok(dk3bm_l_to_d(h), yres, &me), &me ); job->x_scale = dw; job->y_scale = dh; job->x_size = dk3ma_d_to_l_ok(ceil(dw), &me); job->y_size = dk3ma_d_to_l_ok(ceil(dh), &me); job->do_float_scale = 1; job->x_translate = 0.5 * dk3ma_d_sub_ok(job->x_size, dw, &me); job->y_translate = 0.5 * dk3ma_d_sub_ok(job->y_size, dh, &me); if(job->x_translate < 0.0) { job->x_translate = 0.0; } if(job->y_translate < 0.0) { job->y_translate = 0.0; } job->do_translate = 1; mbx1 = dk3ma_d_to_l_ok(job->x_size, &me); mby1 = dk3ma_d_to_l_ok(job->y_size, &me); } break; default: { $? ". workmode = 0" mbx0 = 0L; mby0 = 0L; mbx1 = w; mby1 = h; job->x_size = w; job->y_size = h; } break; } dk3pdf_set_next_mediabox(job->pdf, mbx0, mbx1, mby0, mby1); if(me) { $? ". math error" back = 0; } if(back == 1) { $? ". still ok" if(dk3pdf_open_page(job->pdf)) { $? ". open page" if(job->do_translate) { dk3pdf_translate_double(job->pdf, job->x_translate, job->y_translate); } if(job->do_rotate) { dk3pdf_rotate_int(job->pdf, 90); } if(job->do_float_scale) { dk3pdf_scale_double(job->pdf, job->x_scale, job->y_scale); } else { dk3pdf_scale_long(job->pdf, mbx1, mby1); } if(dk3pdf_add_image_progress( job->pdf, job->bif, job->opt, job->pComm, job->minpb, job->maxpb ) ) { back = 1; $? ". success" } else { back = 0; $? "! failed to add image" dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 73, DK3_BMJ_LOG_BOTH, job ); } dk3pdf_close_page(job->pdf); } else { $? "! dk3pdf_open_page" dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 71, DK3_BMJ_LOG_JOB, job ); } } else { back = 0; /* ERROR: Math error! */ dk3bmj_log_i1( (job->opt)->app, DK3_LL_ERROR, 260, DK3_BMJ_LOG_BOTH, job ); } $? "- dk3bm_job_add_pdf_frame %d", back return back; } /** Produce PDF output. @param job Job structure. @return 1 on success, 0 on error. */ static int dk3bm_job_produce_file_pdf(dk3_bm_conversion_job_t *job) { size_t nFrames; /* Number of frames. */ size_t i; /* Current frame index. */ int back = 0; #if DK3_USE_WX int min; /* Original min progress bar value. */ int max; /* Original max progress bar value. */ int xmax; /* Intermediate progress bar value. */ #endif $? "+ dk3bm_job_produce_file_pdf" #if DK3_USE_WX min = job->minpb; max = job->maxpb; job->maxpb = xmax = min + ((14 * (max - min)) / 15); #endif job->pdf = dk3pdf_open_app((job->opt)->app); if(job->pdf) { back = 1; $? ". mode %d", (job->opt)->mode switch((job->opt)->mode) { case DK3_BMEPS_MODE_DOCUMENT: { $? ". mode: document" nFrames = dk3bif_number_of_frames(job->bif); for(i = 0; i < nFrames; i++) { #if DK3_USE_WX job->minpb = min + ((((int)i) * (xmax - min)) / (int)nFrames); job->maxpb = min + (((((int)i) + 1) * (xmax - min)) / (int)nFrames); #endif if(dk3bif_set_frame(job->bif, i)) { if(!dk3bm_job_add_pdf_frame(job, i)) { back = 0; } } else { back = 0; /* ERROR: Failed to set frame! */ dk3bmj_log_i1( (job->opt)->app, DK3_LL_ERROR, 261, DK3_BMJ_LOG_BOTH, job ); } #if DK3_USE_WX $? ". %d", job->maxpb dk3bmj_progress(job->pComm, job->maxpb); #endif } } break; default: { $? ". mode: not a document" if(!dk3bm_job_add_pdf_frame(job, 0)) { back = 0; } } break; } #if DK3_USE_WX $? ". %d", job->maxpb dk3bmj_progress(job->pComm, job->maxpb); job->minpb = job->maxpb; job->maxpb = max; #endif if(!dk3pdf_write_file_progress( job->pdf, job->dfile, job->pComm, job->minpb, job->maxpb) ) { back = 0; dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 72, DK3_BMJ_LOG_JOB, job ); } dk3pdf_close(job->pdf); job->pdf = NULL; } else { /* ERROR: Failed to create PDF job! */ dk3bmj_log_i1( (job->opt)->app, DK3_LL_ERROR, 9, DK3_BMJ_LOG_JOB, job ); } #if DK3_USE_WX job->minpb = min; job->maxpb = max; #endif $? "- dk3bm_job_produce_file_pdf %d", back return back; } /** Produce draft PDF output. @param job Job structure. @return 1 on success, 0 on error. */ static int dk3bm_job_draft_pdf(dk3_bm_conversion_job_t *job) { dk3_pdf_t *pdf; /* PDF writer structure. */ double x0; /* Left border. */ double x1; /* Right border. */ double y0; /* Lower border. */ double y1; /* Upper border. */ double xres = -1.0; /* X resolution. */ double yres = -1.0; /* Y resolution. */ double w; /* Width, using resolution. */ double h; /* Height, using resolution. */ double dx; /* X delta. */ double dy; /* Y delta. */ long mbx0; /* Media box x0. */ long mbx1; /* Media box x1. */ long mby0; /* Media box y0. */ long mby1; /* Media box y1. */ int me = 0; /* Flag: Math error. */ int workmode = 0; /* Work mode. */ int do_rotate = 0; /* Flag: Rotate. */ int back = 1; $? "+ dk3bm_job_draft_pdf" mbx0 = mby0 = 0L; mbx1 = dk3bif_get_width(job->bif); mby1 = dk3bif_get_height(job->bif); x0 = 0.0; y0 = 0.0; x1 = dk3bm_l_to_d(mbx1); y1 = dk3bm_l_to_d(mby1); switch((job->opt)->szmode) { case DK3_BMEPS_SIZE_CHUNK: { $? ". szmode: chunk" xres = dk3bif_get_xres(job->bif); yres = dk3bif_get_yres(job->bif); if((xres > 0.0) || (yres > 0.0)) { if(xres <= 0.0) { xres = 72.0; } if(yres <= 0.0) { yres = 72.0; } if(fabs(xres - 72.0) > dk3bm_epsilon) { workmode = 1; } if(fabs(yres - 72.0) > dk3bm_epsilon) { workmode = 1; } } } break; case DK3_BMEPS_SIZE_SPECIFIED: { $? ". szmode: specified" xres = yres = (job->opt)->resolution; if(xres > 0.0) { if(fabs(xres - 72.0) > dk3bm_epsilon) { workmode = 1; } } } break; case DK3_BMEPS_SIZE_PAPER: { $? ". szmode: paper" workmode = 2; xres = dk3bif_get_xres(job->bif); yres = dk3bif_get_yres(job->bif); if(xres <= 0.0) { xres = 72.0; } if(yres <= 0.0) { yres = 72.0; } if(fabs(xres - 72.0) <= dk3bm_epsilon) { xres = 72.0; } if(fabs(yres - 72.0) <= dk3bm_epsilon) { yres = 72.0; } } break; } switch(workmode) { case 2: { /* Fit to page */ w = dk3ma_d_div_ok(dk3bm_l_to_d(mbx1), xres, &me); $? ". w=%lg", w h = dk3ma_d_div_ok(dk3bm_l_to_d(mby1), yres, &me); $? ". h=%lg", h mbx1 = dk3ma_d_to_l_ok(floor(((job->opt)->ima).ps.w), &me); mby1 = dk3ma_d_to_l_ok(floor(((job->opt)->ima).ps.h), &me); $? ". mbx1=%ld mby1=%ld", mbx1, mby1 x0 = ((job->opt)->ima).ps.i; y0 = ((job->opt)->ima).ps.b; x1 = dk3ma_d_sub_ok(((job->opt)->ima).ps.w, ((job->opt)->ima).ps.o, &me); y1 = dk3ma_d_sub_ok(((job->opt)->ima).ps.h, ((job->opt)->ima).ps.t, &me); $? ". x0=%lg y0=%lg x1=%lg y1=%lg", x0, y0, x1, y1 if((x1 > x0) && (y1 > y0)) { $? ". paper setup ok" if((x1 - x0) > (y1 - y0)) { if(h > w) { $? ". rotate" do_rotate = 1; } } else { if((x1 - x0) < (y1 - y0)) { if(h < w) { $? ". rotate" do_rotate = 1; } } } if(do_rotate) { $? ". do rotate" dx = dk3ma_d_div_ok((x1 - x0), h, &me); dy = dk3ma_d_div_ok((y1 - y0), w, &me); if(dx > dy) { w = dk3ma_d_mul_ok(dy, h, &me); dx = dk3ma_d_add_ok( x0, 0.5 * dk3ma_d_sub_ok((x1 - x0), w, &me), &me ); dy = dk3ma_d_add_ok(dx, w, &me); if(dx >= x0) { x0 = dx; } if(dy <= x1) { x1 = dy; } } else { h = dk3ma_d_mul_ok(dx, w, &me); dx = dk3ma_d_add_ok( y0, 0.5 * dk3ma_d_sub_ok((y1 - y0), h, &me), &me ); dy = dk3ma_d_add_ok(dx, h, &me); if(dx >= y0) { y0 = dx; } if(dy <= y1) { y1 = dy; } } } else { $? ". do not rotate" dx = dk3ma_d_div_ok((x1 - x0), w, &me); dy = dk3ma_d_div_ok((y1 - y0), h, &me); if(dx > dy) { $? ". restrict x" w = dk3ma_d_mul_ok(dy, w, &me); dx = dk3ma_d_add_ok( x0, 0.5 * dk3ma_d_sub_ok((x1 - x0), w, &me), &me ); dy = dk3ma_d_add_ok(dx, w, &me); if(dx >= x0) { x0 = dx; } if(dy <= x1) { x1 = dy; } } else { $? ". restrict y" h = dk3ma_d_mul_ok(dx, h, &me); dx = dk3ma_d_add_ok( y0, 0.5 * dk3ma_d_sub_ok((y1 - y0), h, &me), &me ); dy = dk3ma_d_add_ok(dx, h, &me); if(dx >= y0) { y0 = dx; } if(dy <= y1) { y1 = dy; } } } $? ". x0=%lg y0=%lg x1=%lg y1=%lg", x0, y0, x1, y1 } else { back = 0; /* ERROR: Incorrect page setup. */ dk3bmj_log_i1( (job->opt)->app, DK3_LL_ERROR, 259, DK3_BMJ_LOG_BOTH, job ); } } break; case 1: { /* Use resolution */ w = dk3ma_d_div_ok(dk3bm_l_to_d(mbx1), xres, &me); h = dk3ma_d_div_ok(dk3bm_l_to_d(mby1), yres, &me); w = dk3ma_d_mul_ok(72.0, w, &me); h = dk3ma_d_mul_ok(72.0, h, &me); x1 = ceil(w); y1 = ceil(h); mbx1 = dk3ma_d_to_l_ok(x1, &me); mby1 = dk3ma_d_to_l_ok(y1, &me); x0 = 0.5 * dk3ma_d_sub_ok(x1, w, &me); y0 = 0.5 * dk3ma_d_sub_ok(y1, h, &me); x1 = dk3ma_d_add_ok(x0, w, &me); y1 = dk3ma_d_add_ok(y0, h, &me); if(x0 < 0.0) { x0 = 0.0; } if(y0 < 0.0) { y0 = 0.0; } if(x1 > dk3bm_l_to_d(mbx1)) { x1 = dk3bm_l_to_d(mbx1); } if(y1 > dk3bm_l_to_d(mby1)) { y1 = dk3bm_l_to_d(mby1); } } break; default: { /* 1:1 */ /* Nothing to do, everything is initialized. */ } break; } if(me) { back = 0; /* ERROR: Math error occured! */ dk3bmj_log_i1( (job->opt)->app, DK3_LL_ERROR, 260, DK3_BMJ_LOG_BOTH, job ); } if(back) { back = 0; /* Here we have all information prepared to produce the draft. */ pdf = dk3pdf_open_app((job->opt)->app); if(pdf) { dk3pdf_set_next_mediabox(pdf, mbx0, mbx1, mby0, mby1); if(dk3pdf_open_page(pdf)) { back = 1; dx = 0.01 * (x1 - x0); dy = 0.01 * (y1 - y0); if(dy < dx) dx = dy; if(dx > 2.8) dx = 2.8; dk3pdf_set_nonstroking_gray(pdf, 0.0); dk3pdf_newpath_moveto(pdf, x0, y0); dk3pdf_lineto(pdf, x1, y0); dk3pdf_lineto(pdf, x1, y1); dk3pdf_lineto(pdf, x0, y1); dk3pdf_closepath(pdf); dk3pdf_fill_nz(pdf); dk3pdf_set_nonstroking_gray(pdf, 0.8); dk3pdf_newpath_moveto(pdf, (x0 + dx), (y0 + dx)); dk3pdf_lineto(pdf, (x1 - dx), (y0 + dx)); dk3pdf_lineto(pdf, (x1 - dx), (y1 - dx)); dk3pdf_lineto(pdf, (x0 + dx), (y1 - dx)); dk3pdf_closepath(pdf); dk3pdf_fill_nz(pdf); dk3pdf_set_nonstroking_gray(pdf, 1.0); dy = dx; dx = 10.0 * dx; dk3pdf_newpath_moveto(pdf, (x0 + dx), (y0 + dx)); dk3pdf_lineto(pdf, (x1 - dx), (y0 + dx)); dk3pdf_lineto(pdf, (x1 - dx), (y1 - dx)); dk3pdf_lineto(pdf, (x0 + dx), (y1 - dx)); dk3pdf_closepath(pdf); dk3pdf_fill_nz(pdf); dk3pdf_set_linewidth(pdf, dx); dk3pdf_set_linecap(pdf, DK3_LINECAP_ROUND); dk3pdf_set_stroking_gray(pdf, 0.8); dk3pdf_newpath_moveto(pdf, (x0 + dx), (y0 + dx)); dk3pdf_lineto(pdf, (x1 - dx), (y1 - dx)); dk3pdf_stroke(pdf); dk3pdf_newpath_moveto(pdf, (x0 + dx), (y1 - dx)); dk3pdf_lineto(pdf, (x1 - dx), (y0 + dx)); dk3pdf_stroke(pdf); dk3pdf_close_page(pdf); } else { dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 71, DK3_BMJ_LOG_JOB, job ); } dk3pdf_write_file(pdf, job->dfile); dk3pdf_close(pdf); } else { /* ERROR: Failed to create PDF writer */ dk3bmj_log_i1( (job->opt)->app, DK3_LL_ERROR, 9, DK3_BMJ_LOG_JOB, job ); } } $? "- dk3bm_job_draft_pdf %d", back return back; } /** Produce PDF output. @param job Job structure. @return 1 on success, 0 on error. */ static int dk3bm_job_produce_pdf(dk3_bm_conversion_job_t *job) { int back = 0; #if DK3_USE_WX int min; /* Original min progress bar value. */ int max; /* Original max progress bar value. */ #endif $? "+ dk3bm_job_produce_pdf" #if DK3_USE_WX min = job->minpb; max = job->maxpb; job->minpb = min + ((max - min) / 4); #endif if((job->opt)->draft) { if(job->dfile) { back = dk3bm_job_draft_pdf(job); } else { job->dfile = dk3sf_fopen_app( job->dfn, dk3app_not_localized(53), (job->opt)->app ); if(job->dfile) { back = dk3bm_job_draft_pdf(job); if(!dk3sf_fclose_fn_app(job->dfile, job->dfn, (job->opt)->app)) { back = 0; } job->dfile = NULL; } else { /* ERROR: Failed to open output file! */ dk3bmj_log_i3( (job->opt)->app, DK3_LL_ERROR, 77, 78, job->dfn, DK3_BMJ_LOG_JOB, job ); } } } else { if(dk3bif_read_data(job->bif)) { #if DK3_USE_WX if((job->pComm) && (job->maxpb > job->minpb)) { $? ". %d", job->minpb dk3bmj_progress(job->pComm, job->minpb); } #endif if(job->dfile) { back = dk3bm_job_produce_file_pdf(job); } else { job->dfile = dk3sf_fopen_app( job->dfn, dk3app_not_localized(53), (job->opt)->app ); if(job->dfile) { back = dk3bm_job_produce_file_pdf(job); if(!dk3sf_fclose_fn_app(job->dfile, job->dfn, (job->opt)->app)) { back = 0; } job->dfile = NULL; } else { /* ERROR: Failed to open output file! */ dk3bmj_log_i3( (job->opt)->app, DK3_LL_ERROR, 77, 78, job->dfn, DK3_BMJ_LOG_JOB, job ); } } } else { /* ERROR: Failed to read image data! */ dk3bmj_log_1( (job->opt)->app, DK3_LL_ERROR, job->msg, 61, DK3_BMJ_LOG_BOTH, job ); } } #if DK3_USE_WX job->minpb = min; job->maxpb = max; #endif $? "- dk3bm_job_produce_pdf %d", back return back; } /** Produce bounding box output. @param job Job structure. */ static void dk3bm_produce_bb(dk3_bm_conversion_job_t *job) { dk3_bif_coord_t w; /* Image width. */ dk3_bif_coord_t h; /* Image height. */ $? "+ dk3bm_produce_bb" w = dk3bif_get_width(job->bif); h = dk3bif_get_height(job->bif); fprintf(job->dfile, dk3bm_c8_kw[31], w, h); $? "- dk3bm_produce_bb" } /** Produce bounding box output. @param job Job structure. @return 1 on success, 0 on error. */ static int dk3bm_job_produce_bb(dk3_bm_conversion_job_t *job) { int back = 0; if(job->dfile) { dk3bm_produce_bb(job); back = 1; } else { job->dfile = dk3sf_fopen_app( job->dfn, dk3app_not_localized(24), (job->opt)->app ); if(job->dfile) { dk3bm_produce_bb(job); back = 1; if(!dk3sf_fclose_fn_app(job->dfile, job->dfn, (job->opt)->app)) { back = 0; } job->dfile = NULL; } else { dk3bmj_log_i3( (job->opt)->app, DK3_LL_ERROR, 77, 78, job->dfn, DK3_BMJ_LOG_JOB, job ); } } return back; } /** Run a conversion job for either the opened file or the named file. @param job Conversion job. @return 1 on success, 0 on error. */ static int dk3bm_job_from_program_with_output(dk3_bm_conversion_job_t *job) { int back = 0; $? "+ dk3bm_job_from_program_with_output" job->bif = dk3bif_open_filename_app(job->sfn, job->biftype, (job->opt)->app); if(job->bif) { switch((job->opt)->dr) { case DK3_BMEPS_DRIVER_PS: { back = dk3bm_job_produce_ps(job); } break; case DK3_BMEPS_DRIVER_EPS: { back = dk3bm_job_produce_ps(job); } break; case DK3_BMEPS_DRIVER_PDF: { back = dk3bm_job_produce_pdf(job); } break; default: { back = dk3bm_job_produce_bb(job); } break; } dk3bif_close(job->bif); } else { dk3bmj_log_3( (job->opt)->app, DK3_LL_ERROR, job->msg, 69, 70, job->sfn, DK3_BMJ_LOG_BOTH, job ); } $? "- dk3bm_job_from_program_with_output %d", back return back; } /** Construct an output file name and run. @param job Conversion job. @return 1 on success, 0 on error. */ static int dk3bm_job_from_program_construct_name(dk3_bm_conversion_job_t *job) { dkChar fno[DK3_MAX_PATH]; /* Output file name buffer. */ dkChar *sptr; /* Pointer to file name suffix. */ dkChar const *ns; /* New suffix. */ int back = 0; $? "+ dk3bm_job_from_program_construct_name %d", (job->opt)->dr dk3str_cpy_not_overlapped(fno, job->sfn); sptr = dk3str_get_suffix(fno); if(sptr) { *sptr = dkT('\0'); } ns = dk3bm_output_suffixes[0]; switch((job->opt)->dr) { case DK3_BMEPS_DRIVER_EPS: { ns = dk3bm_output_suffixes[1]; } break; case DK3_BMEPS_DRIVER_PDF: { ns = dk3bm_output_suffixes[2]; } break; case DK3_BMEPS_DRIVER_BB: { ns = dk3bm_output_suffixes[3]; } break; } if((dk3str_len(ns) + dk3str_len(fno)) < DK3_SIZEOF(fno,dkChar)) { dk3str_cat(fno, ns); $? ". output file \"%s\"", fno job->dfn = fno; back = dk3bm_job_from_program_with_output(job); } else { /* ERROR: File name too long! */ dk3bmj_log_i3( (job->opt)->app, DK3_LL_ERROR, 65, 66, job->sfn, DK3_BMJ_LOG_BOTH, job ); } $? "- dk3bm_job_from_program_construct_name %d", back return back; } int dk3bm_process_file_name( dk3_bm_eps_options_t *opt, dkChar const *sfn, int biftype, int min, int max, void *comm ) { dk3_bm_eps_options_t bmeo; /* Conversion options. */ dk3_bm_conversion_job_t job; /* Conversion job. */ #if DK3_ON_WINDOWS int oldmode; /* Original stdout file mode. */ #endif int back = 0; $? "+ dk3bm_process_file_name \"%s\" dr = %d", TR_STR(sfn), opt->dr if((opt) && (sfn)) { $? ". dr = %d", opt->dr if(opt->app) { $? ". app" dk3bmj_init(&job, opt->app); dk3mem_cpy((void *)(&bmeo), (void *)opt, sizeof(dk3_bm_eps_options_t)); job.opt = &bmeo; $? ". dr = %d", bmeo.dr job.sfn = sfn; job.biftype = biftype; #if DK3_USE_WX job.pComm = comm; job.minpb = min; job.maxpb = max; #endif if(dk3bmeo_check(&bmeo, 0, opt->app, &job)) { $? ". check" if(opt->to_stdout) { $? ". write output to stdout" job.dfile = stdout; switch(opt->dr) { case DK3_BMEPS_DRIVER_PDF: { $? ". PDF" #if DK3_ON_WINDOWS oldmode = _setmode(_fileno(stdout), _O_BINARY); #endif back = dk3bm_job_from_program_with_output(&job); #if DK3_ON_WINDOWS _setmode(_fileno(stdout), oldmode); #endif } break; default: { $? ". not PDF" back = dk3bm_job_from_program_with_output(&job); } break; } } else { $? ". write output to file" job.dfile = NULL; back = dk3bm_job_from_program_construct_name(&job); } } else { $? "! Inconsistent options" /* ERROR: Inconsistent options, reported by dk3bmeo_check(). */ dk3bmj_log_1( opt->app, DK3_LL_ERROR, job.msg, 68, DK3_BMJ_LOG_JOB, &job ); } } else { $? "! opt->app" /* ERROR: Application structure not set! */ } } #if DK3_USE_WX if((comm) && (max > min)) { $? ". %d", max dk3bmj_progress(comm, max); } #endif $? "- dk3bm_process_file_name %d", back return back; }