%% options copyright owner = Dirk Krause copyright year = 2012-2014 license = bsd %% header #ifdef __cplusplus extern "C" { #endif /** Driver initialization for tex output. @param job Job structure. @param drw Drawing structure. @return 1 on success, 0 on error. */ int f2lpgf_tex_initialize(f2l_job_t *job, dk3_fig_drawing_t *drw); /** Driver cleanup for tex driver. @param job Job structure. @param drw Drawing structure. */ void f2lpgf_tex_end(f2l_job_t *job, dk3_fig_drawing_t *drw); /** Open output files for tex driver. @param job Job structure. @return 1 on success, 0 on error. */ int f2lpgf_tex_open_output_files(f2l_job_t *job); /** Close output files for tex driver. @param job Job structure. */ void f2lpgf_tex_close_output_files(f2l_job_t *job); /** Write start of output for tex driver. @param job Job structure. @param drw Drawing structure. @return 1 on success, 0 on error. */ int f2lpgf_tex_start_processing(f2l_job_t *job, dk3_fig_drawing_t *drw); /** Write end of output for tex driver. @param job Job structure. @param drw Drawing structure. */ void f2lpgf_tex_end_processing(f2l_job_t *job, dk3_fig_drawing_t *drw); /** Process one text object. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. @param x Point x. @param y Point y. */ void f2lpgf_tex_text_object( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double x, double y ); /** Process one image object. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. @param outbb Bounding box for image. @param drawdir Drawing direction. @param ec Pointer to error code variable, may be NULL. */ void f2lpgf_tex_image_object( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, dk3_bb_t *outbb, int drawdir, int *ec ); /** Start new path. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_tex_newpath( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Move to point. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. @param x Point x. @param y Point y. */ void f2lpgf_tex_moveto( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double x, double y ); /** Draw line to point. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. @param x Point x. @param y Point y. */ void f2lpgf_tex_lineto( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double x, double y ); /** Draw curve to point. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. @param xcs Start control point y. @param ycs Start control point y. @param xce End control point x. @param yce End control point y. @param xe End point x. @param ye End point y. */ void f2lpgf_tex_curveto( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double xcs, double ycs, double xce, double yce, double xe, double ye ); /** Close path. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_tex_closepath( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Fill path. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_tex_fill( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Fill and stroke path. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_tex_fill_stroke( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Fill and clip path. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_tex_fill_clip( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Fill, stroke and clip path. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_tex_fill_stroke_clip( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Clip drawing operations to path. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_tex_clip( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Stroke path. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_tex_stroke( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Save graphics state. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_tex_gsave( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Restore graphics state. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_tex_grestore( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Set color. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. @param r Red. @param g Green. @param b Blue. */ void f2lpgf_tex_setcolor( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double r, double g, double b ); /** Set line width. The line width is not set again if we already have a current line width equal to the new line width. @param job Job structure. @param drw Drawing structure. @param obj Fig object. @param lw New line width in output coordinates. */ void f2lpgf_tex_set_line_width( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double lw ); /** Set line style. @param job Job structure. @param drw Drawing structure. @param obj Object to set up. @param ls Line style, see @ref dk3figlinestyles. @param sv Style value in output coordinates. @param lw Dot length in output coordinates. */ void f2lpgf_tex_set_line_style( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, int ls, double sv, double lw ); /** Set line end. @param job Job structure. @param drw Drawing structure. @param obj Fig object. @param le Line end, see @ref dk3figlinecap. */ void f2lpgf_tex_set_line_end( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, int le ); /** Set line join. @param job Job structure. @param drw Drawing structure. @param obj Fig object. @param lj Line join style, see @ref dk3figlinejoin. */ void f2lpgf_tex_set_line_join( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, int lj ); /** Set current color or stroking color (PGF, PDF). @param job Job structure. @param drw Drawing structure. @param rgb New color value. */ void f2lpgf_tex_set_color_1( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_rgb_color_t *rgb ); /** Set non-stroking color (PGF, PDF). @param job Job structure. @param drw Drawing structure. @param rgb New color value. */ void f2lpgf_tex_set_color_2( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_rgb_color_t *rgb ); /** Write debugging line to output file. @param job Job structure. @param msg Message to write to output file. */ void f2lpgf_tex_debug( f2l_job_t *job, char const *msg ); /** Driver initialization for pgf output. @param job Job structure. @param drw Drawing structure. @return 1 on success, 0 on error. */ int f2lpgf_pgf_initialize(f2l_job_t *job, dk3_fig_drawing_t *drw); /** Driver cleanup for pgf driver. @param job Job structure. @param drw Drawing structure. */ void f2lpgf_pgf_end(f2l_job_t *job, dk3_fig_drawing_t *drw); /** Open output files for pgf driver. @param job Job structure. @return 1 on success, 0 on error. */ int f2lpgf_pgf_open_output_files(f2l_job_t *job); /** Close output files for tex driver. @param job Job structure. */ void f2lpgf_pgf_close_output_files(f2l_job_t *job); /** Write start of output for pgf driver. @param job Job structure. @param drw Drawing structure. @return 1 on success, 0 on error. */ int f2lpgf_pgf_start_processing(f2l_job_t *job, dk3_fig_drawing_t *drw); /** Write end of output for pgf driver. @param job Job structure. @param drw Drawing structure. */ void f2lpgf_pgf_end_processing(f2l_job_t *job, dk3_fig_drawing_t *drw); /** Process one text object. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. @param x Point x. @param y Point y. */ void f2lpgf_pgf_text_object( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double x, double y ); /** Process one image object. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. @param outbb Bounding box for image. @param drawdir Drawing direction. @param ec Pointer to error code variable, may be NULL. */ void f2lpgf_pgf_image_object( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, dk3_bb_t *outbb, int drawdir, int *ec ); /** Start new path. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_pgf_newpath( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Move to point. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. @param x Point x. @param y Point y. */ void f2lpgf_pgf_moveto( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double x, double y ); /** Draw line to point. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. @param x Point x. @param y Point y. */ void f2lpgf_pgf_lineto( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double x, double y ); /** Draw curve to point. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. @param xcs Start control point y. @param ycs Start control point y. @param xce End control point x. @param yce End control point y. @param xe End point x. @param ye End point y. */ void f2lpgf_pgf_curveto( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double xcs, double ycs, double xce, double yce, double xe, double ye ); /** Close path. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_pgf_closepath( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Fill path. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_pgf_fill( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Fill and stroke path. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_pgf_fill_stroke( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Fill and clip path. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_pgf_fill_clip( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Fill,stroke and clip path. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_pgf_fill_stroke_clip( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Clip drawing operations to path. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_pgf_clip( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Stroke path. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_pgf_stroke( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Save graphics state. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_pgf_gsave( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Restore graphics state. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. */ void f2lpgf_pgf_grestore( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ); /** Set color. @param job Job structure. @param drw Drawing structure. @param obj Current object to process. @param r Red. @param g Green. @param b Blue. */ void f2lpgf_pgf_setcolor( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double r, double g, double b ); /** Set line width. The line width is not set again if we already have a current line width equal to the new line width. @param job Job structure. @param drw Drawing structure. @param obj Fig object. @param lw New line width in output coordinates. */ void f2lpgf_pgf_set_line_width( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double lw ); /** Set line style. @param job Job structure. @param drw Drawing structure. @param obj Object to set up. @param ls Line style, see @ref dk3figlinestyles. @param sv Style value in output coordinates. @param lw Dot length in output coordinates. */ void f2lpgf_pgf_set_line_style( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, int ls, double sv, double lw ); /** Set line end. @param job Job structure. @param drw Drawing structure. @param obj Fig object. @param le Line end, see @ref dk3figlinecap. */ void f2lpgf_pgf_set_line_end( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, int le ); /** Set line join. @param job Job structure. @param drw Drawing structure. @param obj Fig object. @param lj Line join style, see @ref dk3figlinejoin. */ void f2lpgf_pgf_set_line_join( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, int lj ); /** Set current color or stroking color (PGF, PDF). @param job Job structure. @param drw Drawing structure. @param rgb New color value. */ void f2lpgf_pgf_set_color_1( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_rgb_color_t *rgb ); /** Set non-stroking color (PGF, PDF). @param job Job structure. @param drw Drawing structure. @param rgb New color value. */ void f2lpgf_pgf_set_color_2( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_rgb_color_t *rgb ); /** Write debugging line to output file. @param job Job structure. @param msg Message to write to output file. */ void f2lpgf_pgf_debug( f2l_job_t *job, char const *msg ); #ifdef __cplusplus } #endif %% module #include "dk3all.h" #include "dk3bezcu.h" #include "fig2lat.h" #include "f2lud.h" #include "f2lsvg.h" #include "f2lpgf.h" #include "dk3figto.h" #include "dkt-version.h" #include "dk3bif.h" #include "dk3bm.h" #include "dk3figto.h" $!trace-include /** Driver specific details for entire drawing. */ typedef struct { dk3_sto_t *sFonts; /**< Storage for fonts. */ dk3_sto_it_t *iFonts; /**< Iterator for font storage. */ unsigned long nFonts; /**< Number of fonts in sFonts. */ } f2l_pgf_drawing_info_t; /** Keywords used by the module. */ static char const * const f2lpgf_c8_kw[] = { $!string-table # # 0: Newline # \n # # 1: Space # # # 2: Begin of PGF picture # \\begin{pgfpicture}\n # # 3: End of PGF picture # \\end{pgfpicture}%\n # # 4: Begin PGF scope # \\begin{pgfscope}\n # # 5: End PGF scope # \\end{pgfscope}\n # # 6: Begin of rectangle path # \\pgfpathrectangle{\\pgfpointorigin}{ # # 7: End of rectangle path # }\n # # 8: Start of pgfpoint command # \\pgfpoint{ # # 9: Middle of pgfpoint command # , # # 10: End of command # } # # 11: pgfpoint command for long values # \\pgfpoint{%ldbp}{%ldbp} # # 12: Unit bp # bp # # 13: Use path as bounding box # \\pgfusepath{use as bounding box}\n # # 14: Clip to path # \\pgfusepath{clip}\n # # 15: Set even/odd winding rule # \\pgfseteorule\n # # 16: moveto command # \\pgfpathmoveto{ # # 17: lineto command # \\pgfpathlineto{ # # 18: curveto command # \\pgfpathcurveto{ # # 19: next argument # }{ # # 20: closepath command # \\pgfpathclose\n # # 21: fill command # \\pgfusepath{fill}\n # # 22: fill and stroke command # \\pgfusepath{fill,stroke}\n # # 23: fill and clip command # \\pgfusepath{fill,clip}\n # # 24: fill, stroke and clip command # \\pgfusepath{fill,stroke,clip}\n # # 25: stroke command # \\pgfusepath{stroke}\n # # 26: setlinewidth command # \\pgfsetlinewidth{ # # 27: Dash style: solid line # \\pgfsetdash{ # # 28: Opening curly bracket # { # # 29: projecting line cap # \\pgfsetrectcap\n # # 30: round line cap # \\pgfsetroundcap\n # # 31: Butted line cap # \\pgfsetbuttcap\n # # 32: Bevel line join # \\pgfsetbeveljoin\n # # 33: Round line join # \\pgfsetroundjoin\n # # 34: Miter line join # \\pgfsetmiterjoin\n # # 35: Define stroke color command # \\definecolor{FigToLatColorS}{rgb}{ # # 36: Define non-stroke color command # \\definecolor{FigToLatColorN}{rgb}{ # # 37: Set stroke color # \\pgfsetstrokecolor{FigToLatColorS}\n # # 38: Set non-stroke color # \\pgfsetfillcolor{FigToLatColorN}\n # # 39: Start of comment # % # # 40: Translate # \\pgftransformshift{ # # 41: Rotate # \\pgftransformrotate{%d}\n # # 42: X scale # \\pgftransformxscale{ # # 43: Y scale # \\pgftransformyscale{ # # 44: Text start for image inclusion # \\pgftext[left,base,at={\\pgfpointorigin}]{\\pgfimage[interpolate=true,width=1bp,height=1bp]{ # # 45: Image end # }}\n # # 46: Start pgftext command # \\pgftext[ # # 47: Center of pgftext command # ]{ # # 48: Left aligned text # base,left # # 49: Centered text # base # # 50: Right aligned text # base,right # # 51: at option for text # ,at={ # # 52: rotation option for text # ,rotate= $!end }; $* Tool functions $* /** Delete driver-specific details. @param ptr Details structure to delete. */ static void f2lpgf_pdi_delete(f2l_pgf_drawing_info_t *ptr) { void *vptr; /* Current text handling structure to delete. */ if(ptr) { if(ptr->sFonts) { if(ptr->iFonts) { dk3sto_it_reset(ptr->iFonts); while(NULL != (vptr = dk3sto_it_next(ptr->iFonts))) { dk3_delete(vptr); } dk3sto_it_close(ptr->iFonts); } dk3sto_close(ptr->sFonts); } ptr->sFonts = NULL; ptr->iFonts = NULL; ptr->nFonts = 0UL; dk3_delete(ptr); } } /** Create structure for driver-specific details. @param job Job structure. @param drw Drawing structure. @return Pointer to new structure on success, NULL on error. */ static f2l_pgf_drawing_info_t * f2lpgf_pdi_new(f2l_job_t *job, dk3_fig_drawing_t *drw) { f2l_pgf_drawing_info_t *back = NULL; int ok = 0; back = dk3_new_app(f2l_pgf_drawing_info_t,1,job->app); if(back) { back->sFonts = NULL; back->iFonts = NULL; back->nFonts = 0UL; back->sFonts = dk3sto_open_app(job->app); if(back->sFonts) { dk3sto_set_comp(back->sFonts, dk3fig_tool_text_handling_compare, 0); back->iFonts = dk3sto_it_open(back->sFonts); if(back->iFonts) { ok = 1; } } if(!(ok)) { f2lpgf_pdi_delete(back); back = NULL; } } else { } return back; } /** Write point (long coordinates). @param of Output file. @param x X position. @param y X position. */ static void f2lpgf_write_point_long(FILE *of, long x, long y) { fprintf(of, f2lpgf_c8_kw[11], x, y); } /** Write point (double coordinates). @param of Output file. @param x X position. @param y Y position. */ static void f2lpgf_write_point_double(FILE *of, double x, double y) { fputs(f2lpgf_c8_kw[8], of); dk3ma_print_double_c8_no_sci(of, x); fputs(f2lpgf_c8_kw[12], of); fputs(f2lpgf_c8_kw[19], of); dk3ma_print_double_c8_no_sci(of, y); fputs(f2lpgf_c8_kw[12], of); fputs(f2lpgf_c8_kw[10], of); } /** Set line dash. @param of Output file. @param xsv Stroke and gap lengths. @param nsv Number of elements in xsv. @param ph Phase (Used length at start of line). */ static void f2lpgf_set_line_dash(FILE *of, double *xsv, size_t nsv, double ph) { size_t i; /* Index to traverse xsv. */ fputs(f2lpgf_c8_kw[27], of); for(i = 0; i < nsv; i++) { fputs(f2lpgf_c8_kw[28], of); dk3ma_print_double_c8_no_sci(of, xsv[i]); fputs(f2lpgf_c8_kw[12], of); fputs(f2lpgf_c8_kw[10], of); } fputs(f2lpgf_c8_kw[19], of); dk3ma_print_double_c8_no_sci(of, ph); fputs(f2lpgf_c8_kw[12], of); fputs(f2lpgf_c8_kw[7], of); } /** Define current color. @param of Output file. @param tp Color type. @param rgb RGB color structure. */ static void f2lpgf_define_color(FILE *of, int tp, dk3_rgb_color_t *rgb) { fputs(f2lpgf_c8_kw[((tp) ? 36 : 35)], of); dk3ma_print_double_c8_no_sci(of, rgb->r); fputs(f2lpgf_c8_kw[9], of); dk3ma_print_double_c8_no_sci(of, rgb->g); fputs(f2lpgf_c8_kw[9], of); dk3ma_print_double_c8_no_sci(of, rgb->b); fputs(f2lpgf_c8_kw[10], of); } /** Write image file name to output file. @param of Output file. @param fn File name. */ static void fl2pgf_image_file_name(FILE *of, char const *fn) { char const *ptr; /* Current character to process. */ ptr = fn; while(*ptr) { switch(*ptr) { case '\\': { fputc('/', of); } break; default: { fputc(*ptr, of); } break; } ptr++; } } /** Write text rotation angle. @param of Output file. @param rot Rotation in radians. @param job Job structure. */ static void f2lpgf_write_text_rotation(FILE *of, double rot, f2l_job_t *job) { int ec = 0; /* Mathematical error code. */ double an; /* Rotation in degree. */ double ri; /* Integer value of an. */ if(1.0e-6 < fabs(rot)) { an = dk3ma_d_mul_ok(rot, 180.0, &ec) / M_PI; ri = dk3ma_d_rint(an); #if 0 if(1.0e-3 > fabs(dk3ma_d_rint(dk3ma_d_sub_ok(an, ri, &ec)))) { an = ri; } #else /* 2013-01-27: The rint result in the code above is always 0. */ if(1.0e-3 > fabs(dk3ma_d_sub_ok(an, ri, &ec))) { an = ri; } #endif fputs(f2lpgf_c8_kw[52], of); dk3ma_print_double_c8_no_sci(of, an); if(ec) { /* ERROR: Math error */ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 35); f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_MATH); $? ". exitcode" } } } $* PGF output driver functions $* int f2lpgf_pgf_initialize(f2l_job_t *job, dk3_fig_drawing_t *drw) { f2l_pgf_drawing_info_t *pdi = NULL; /* Driver spec det. */ dkChar const *oldsourcefile = NULL; /* Source file name. */ dk3_fig_obj_t *pobj; /* Current object. */ unsigned long oldsourceline = 0UL; /* Source file line. */ int ff = 0; /* Font flags. */ int back = 0; $? "+ f2lpgf_pgf_initialize" if((job) && (drw)) { pdi = f2lpgf_pdi_new(job, drw); if(pdi) { drw->dsd = (void *)pdi; back = 1; oldsourcefile = dk3app_get_source_file(job->app); oldsourceline = dk3app_get_source_line(job->app); dk3sto_it_reset(drw->iobj); while(NULL != (pobj = (dk3_fig_obj_t *)dk3sto_it_next(drw->iobj))) { dk3app_set_source_line(job->app, pobj->li); switch(pobj->ot) { case DK3_FIG_OBJ_TEXT: { $? ". text" ff = (pobj->dt).txt.ff; if(!(ff & DK3_FIG_FONT_FLAG_HIDDEN)) { $? ". not hidden" if(!(ff & DK3_FIG_FONT_FLAG_SPECIAL)) { $? ". not special" if(ff & DK3_FIG_FONT_FLAG_PS) { $? ". PS font" if(job->ntf) { $? ". ntf" pobj->dsd = (void *)f2l_tool_register_font( pdi->sFonts, pdi->iFonts, &(pdi->nFonts), (pobj->dt).txt.fo, (pobj->dt).txt.fs, job->app ); if(!(pobj->dsd)) { back = 0; f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_SYSTEM); $? ". exitcode" } } else { $? ". no ntf" } } } } } } } dk3app_set_source_file(job->app, oldsourcefile); dk3app_set_source_line(job->app, oldsourceline); } else { f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_SYSTEM); $? ". exitcode" } } $? "- f2lpgf_pgf_initialize %d", back return back; } void f2lpgf_pgf_end(f2l_job_t *job, dk3_fig_drawing_t *drw) { $? "+ f2lpgf_pgf_end" if((job) && (drw)) { if(drw->dsd) { f2lpgf_pdi_delete((f2l_pgf_drawing_info_t *)(drw->dsd)); } } $? "- f2lpgf_pgf_end" } int f2lpgf_pgf_open_output_files(f2l_job_t *job) { int back = 0; $? "+ f2lpgf_pgf_open_output_files" job->of1 = dk3sf_fopen_app(job->on1, dkT("w"), job->app); if(job->of1) { back = 1; } else { f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_SYSTEM); $? ". exitcode" } $? "- f2lpgf_pgf_open_output_files %d", back return back; } void f2lpgf_pgf_close_output_files(f2l_job_t *job) { $? "+ f2lpgf_pgf_close_output_files" if(job->of1) { dk3sf_fclose_app(job->of1, job->app); } $? "- f2lpgf_pgf_close_output_files" } int f2lpgf_pgf_start_processing(f2l_job_t *job, dk3_fig_drawing_t *drw) { f2l_pgf_drawing_info_t *pdi; /* Driver specific details. */ int back = 0; $? "+ f2lpgf_pgf_start_processing" pdi = (f2l_pgf_drawing_info_t *)(drw->dsd); if(pdi) { $? ". have pdi" back = 1; /* Font definitions */ f2l_tool_start_tex_part_with_picture( job->of1, job, drw, NULL, pdi->iFonts, pdi->nFonts, 0 ); } else { $? "! no pdi" } fputs(f2lpgf_c8_kw[2], job->of1); /* Bounding box */ fputs(f2lpgf_c8_kw[6], job->of1); f2lpgf_write_point_long(job->of1, job->lwidth, job->lheight); fputs(f2lpgf_c8_kw[7], job->of1); fputs(f2lpgf_c8_kw[13], job->of1); fputs(f2lpgf_c8_kw[15], job->of1); /* Begin PGF scope */ fputs(f2lpgf_c8_kw[4], job->of1); /* Clip path */ fputs(f2lpgf_c8_kw[6], job->of1); f2lpgf_write_point_long(job->of1, job->lwidth, job->lheight); fputs(f2lpgf_c8_kw[7], job->of1); fputs(f2lpgf_c8_kw[14], job->of1); $? "- f2lpgf_pgf_start_processing %d", back return back; } void f2lpgf_pgf_end_processing(f2l_job_t *job, dk3_fig_drawing_t *drw) { $? "+ f2lpgf_pgf_end_processing" /* End PGF scope */ fputs(f2lpgf_c8_kw[5], job->of1); /* End PGF picture */ fputs(f2lpgf_c8_kw[3], job->of1); $? "- f2lpgf_pgf_end_processing" } void f2lpgf_pgf_text_object( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double x, double y ) { f2l_pgf_drawing_info_t *pdi = NULL; /* Driver specific details. */ unsigned long nFonts = 0UL; /* Number of text handlings. */ $? "+ f2lpgf_pgf_text_object" pdi = (f2l_pgf_drawing_info_t *)(drw->dsd); if(pdi) { nFonts = pdi->nFonts; } fputs(f2lpgf_c8_kw[46], job->of1); /* align */ switch(obj->st) { case 2: { fputs(f2lpgf_c8_kw[50], job->of1); } break; case 1: { fputs(f2lpgf_c8_kw[49], job->of1); } break; default: { fputs(f2lpgf_c8_kw[48], job->of1); } break; } /* position */ fputs(f2lpgf_c8_kw[51], job->of1); f2lpgf_write_point_double(job->of1, x, y); fputs(f2lpgf_c8_kw[10], job->of1); /* rotation */ f2lpgf_write_text_rotation(job->of1, (obj->dt).txt.an, job); fputs(f2lpgf_c8_kw[47], job->of1); /* text */ f2l_tool_inner_text_object(job->of1, job, drw, obj, nFonts); fputs(f2lpgf_c8_kw[7], job->of1); (job->gs).hc1 = 0; (job->gs).hc2 = 0; $? "- f2lpgf_pgf_text_object" } void f2lpgf_pgf_image_object( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, dk3_bb_t *outbb, int drawdir, int *ec ) { dk3_coordinates_transformation_t trans; /* Graphics state tr. */ dk3_bif_t *bif; /* Bitmap image file. */ double w = 0.0; /* Image width. */ double h = 0.0; /* Image height. */ double xres = -1.0; /* X resolution, none by default. */ double yres = -1.0; /* Y resolution, none by default. */ int res = 0; /* Result from transformation search. */ $? "+ f2lpgf_pgf_image_object" if((obj->dt).pol.fn) { bif = dk3bif_open_c8_filename_app( (obj->dt).pol.fn, DK3_BIF_IMAGE_TYPE_UNKNOWN, job->app ); if(bif) { w = (double)dk3bif_get_width(bif); h = (double)dk3bif_get_height(bif); xres = dk3bif_get_xres(bif); yres = dk3bif_get_yres(bif); dk3bif_close(bif); res = dk3bm_find_transformation( &trans, outbb, drawdir, w, h, xres, yres, ec ); if(res) { /* gsave */ fputs(f2lpgf_c8_kw[4], job->of1); /* translate */ fputs(f2lpgf_c8_kw[40], job->of1); f2lpgf_write_point_double( job->of1, trans.x_translate, trans.y_translate ); fputs(f2lpgf_c8_kw[7], job->of1); /* rotate */ if(trans.rot) { fprintf(job->of1, f2lpgf_c8_kw[41], 90 * trans.rot); } /* scale */ fputs(f2lpgf_c8_kw[42], job->of1); dk3ma_print_double_c8_no_sci(job->of1, trans.x_scale); fputs(f2lpgf_c8_kw[7], job->of1); fputs(f2lpgf_c8_kw[43], job->of1); dk3ma_print_double_c8_no_sci(job->of1, trans.y_scale); fputs(f2lpgf_c8_kw[7], job->of1); /* image */ fputs(f2lpgf_c8_kw[44], job->of1); fl2pgf_image_file_name(job->of1, (obj->dt).pol.fn); fputs(f2lpgf_c8_kw[45], job->of1); /* grestore */ fputs(f2lpgf_c8_kw[5], job->of1); } else { /* ERROR: Failed to calculate graphics state transformation */ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 40); f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_MATH); $? ". exitcode" } } else { /* ERROR: Failed to open bitmap image! */ f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_SYSTEM); $? ". exitcode" } } $? "- f2lpgf_pgf_image_object" } void f2lpgf_pgf_newpath( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { $? "+ f2lpgf_pgf_newpath" /* Nothing to do here, new paths are automatically started by moveto. */ $? "- f2lpgf_pgf_newpath" } void f2lpgf_pgf_moveto( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double x, double y ) { $? "+ f2lpgf_pgf_moveto" fputs(f2lpgf_c8_kw[16], job->of1); f2lpgf_write_point_double(job->of1, x, y); fputs(f2lpgf_c8_kw[7], job->of1); $? "- f2lpgf_pgf_moveto" } void f2lpgf_pgf_lineto( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double x, double y ) { $? "+ f2lpgf_pgf_lineto" fputs(f2lpgf_c8_kw[17], job->of1); f2lpgf_write_point_double(job->of1, x, y); fputs(f2lpgf_c8_kw[7], job->of1); $? "- f2lpgf_pgf_lineto" } void f2lpgf_pgf_curveto( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double xcs, double ycs, double xce, double yce, double xe, double ye ) { $? "+ f2lpgf_pgf_curveto" fputs(f2lpgf_c8_kw[18], job->of1); f2lpgf_write_point_double(job->of1, xcs, ycs); fputs(f2lpgf_c8_kw[19], job->of1); f2lpgf_write_point_double(job->of1, xce, yce); fputs(f2lpgf_c8_kw[19], job->of1); f2lpgf_write_point_double(job->of1, xe, ye); fputs(f2lpgf_c8_kw[7], job->of1); $? "- f2lpgf_pgf_curveto" } void f2lpgf_pgf_closepath( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { $? "+ f2lpgf_pgf_closepath" fputs(f2lpgf_c8_kw[20], job->of1); $? "- f2lpgf_pgf_closepath" } void f2lpgf_pgf_fill( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { $? "+ f2lpgf_pgf_fill" fputs(f2lpgf_c8_kw[21], job->of1); $? "- f2lpgf_pgf_fill" } void f2lpgf_pgf_fill_stroke( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { $? "+ f2lpgf_pgf_fill_stroke" fputs(f2lpgf_c8_kw[22], job->of1); $? "- f2lpgf_pgf_fill_stroke" } void f2lpgf_pgf_fill_clip( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { $? "+ f2lpgf_pgf_fill_clip" fputs(f2lpgf_c8_kw[23], job->of1); $? "- f2lpgf_pgf_fill_clip" } void f2lpgf_pgf_fill_stroke_clip( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { $? "+ f2lpgf_pgf_fill_stroke_clip" fputs(f2lpgf_c8_kw[24], job->of1); $? "- f2lpgf_pgf_fill_stroke_clip" } void f2lpgf_pgf_clip( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { $? "+ f2lpgf_pgf_clip" fputs(f2lpgf_c8_kw[14], job->of1); $? "- f2lpgf_pgf_clip" } void f2lpgf_pgf_stroke( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { $? "+ f2lpgf_pgf_stroke" fputs(f2lpgf_c8_kw[25], job->of1); $? "- f2lpgf_pgf_stroke" } void f2lpgf_pgf_gsave( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { $? "+ f2lpgf_pgf_gsave" fputs(f2lpgf_c8_kw[4], job->of1); $? "- f2lpgf_pgf_gsave" } void f2lpgf_pgf_grestore( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { $? "+ f2lpgf_pgf_grestore" fputs(f2lpgf_c8_kw[5], job->of1); $? "- f2lpgf_pgf_grestore" } void f2lpgf_pgf_set_line_width( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double lw ) { $? "+ f2lpgf_pgf_set_line_width" fputs(f2lpgf_c8_kw[26], job->of1); dk3ma_print_double_c8_no_sci(job->of1, lw); fputs(f2lpgf_c8_kw[12], job->of1); fputs(f2lpgf_c8_kw[7], job->of1); $? "- f2lpgf_pgf_set_line_width" } void f2lpgf_pgf_set_line_style( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, int ls, double sv, double lw ) { double xsv[32]; /* Lengths of strokes and gaps. */ double ph; /* Phase (used length at start). */ double gw; /* Gap width. */ size_t nsv; /* Number of elements in xsv. */ $? "+ f2lpgf_pgf_set_line_style" ph = 0.0; nsv = 0; xsv[0] = 0.0; gw = f2lto_find_gap_length(job, lw, sv); switch(ls) { case DK3_FIG_LS_DASH_TRIPLE_DOTTED: { xsv[0] = sv; xsv[1] = gw; xsv[2] = lw; xsv[3] = gw; xsv[4] = lw; xsv[5] = gw; xsv[6] = lw; xsv[7] = gw; nsv = 8; } break; case DK3_FIG_LS_DASH_DOUBLE_DOTTED: { xsv[0] = sv; xsv[1] = gw; xsv[2] = lw; xsv[3] = gw; xsv[4] = lw; xsv[5] = gw; nsv = 6; } break; case DK3_FIG_LS_DASH_DOTTED: { xsv[0] = sv; xsv[1] = gw; xsv[2] = lw; xsv[3] = gw; nsv = 4; } break; case DK3_FIG_LS_DOTTED: { xsv[0] = lw; xsv[1] = gw; nsv = 2; } break; case DK3_FIG_LS_DASHED: { xsv[0] = sv; xsv[1] = gw; nsv = 2; } break; } f2lpgf_set_line_dash(job->of1, xsv, nsv, ph); $? "- f2lpgf_pgf_set_line_style" } void f2lpgf_pgf_set_line_end( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, int le ) { $? "+ f2lpgf_pgf_set_line_end" switch(le) { case DK3_FIG_LC_PROJECTING: { fputs(f2lpgf_c8_kw[29], job->of1); } break; case DK3_FIG_LC_ROUND: { fputs(f2lpgf_c8_kw[30], job->of1); } break; default: { fputs(f2lpgf_c8_kw[31], job->of1); } break; } $? "- f2lpgf_pgf_set_line_end" } void f2lpgf_pgf_set_line_join( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, int lj ) { $? "+ f2lpgf_pgf_set_line_join" switch(lj) { case DK3_FIG_LJ_BEVEL: { fputs(f2lpgf_c8_kw[32], job->of1); } break; case DK3_FIG_LJ_ROUND: { fputs(f2lpgf_c8_kw[33], job->of1); } break; default: { fputs(f2lpgf_c8_kw[34], job->of1); } break; } $? "- f2lpgf_pgf_set_line_join" } void f2lpgf_pgf_set_color_1( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_rgb_color_t *rgb ) { $? "+ f2lpgf_pgf_set_color_1" f2lpgf_define_color(job->of1, 0, rgb); fputs(f2lpgf_c8_kw[37], job->of1); $? "- f2lpgf_pgf_set_color_1" } void f2lpgf_pgf_set_color_2( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_rgb_color_t *rgb ) { $? "+ f2lpgf_pgf_set_color_2" f2lpgf_define_color(job->of1, 1, rgb); fputs(f2lpgf_c8_kw[38], job->of1); $? "- f2lpgf_pgf_set_color_2" } void f2lpgf_pgf_setcolor( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double r, double g, double b ) { dk3_rgb_color_t rgb; /* Color cell. */ $? "+ f2lpgf_pgf_setcolor" rgb.r = r; rgb.g = g; rgb.b = b; f2lpgf_pgf_set_color_1(job, drw, &rgb); rgb.r = r; rgb.g = g; rgb.b = b; f2lpgf_pgf_set_color_2(job, drw, &rgb); $? "- f2lpgf_pgf_setcolor" } void f2lpgf_pgf_debug( f2l_job_t *job, char const *msg ) { $? "+ f2lpgf_pgf_debug" fputs(f2lpgf_c8_kw[39], job->of1); fputs(msg, job->of1); fputc('\n', job->of1); $? "- f2lpgf_pgf_debug" } $* TeX output driver functions. $* int f2lpgf_tex_initialize(f2l_job_t *job, dk3_fig_drawing_t *drw) { int back = 0; back = f2lpgf_pgf_initialize(job, drw); return back; } void f2lpgf_tex_end(f2l_job_t *job, dk3_fig_drawing_t *drw) { f2lpgf_pgf_end(job, drw); } int f2lpgf_tex_open_output_files(f2l_job_t *job) { int back = 0; back = f2lpgf_pgf_open_output_files(job); return back; } void f2lpgf_tex_close_output_files(f2l_job_t *job) { f2lpgf_pgf_close_output_files(job); } int f2lpgf_tex_start_processing(f2l_job_t *job, dk3_fig_drawing_t *drw) { int back = 0; f2l_tool_begin_latex_document(job->of1, job, drw); back = f2lpgf_pgf_start_processing(job, drw); return back; } void f2lpgf_tex_end_processing(f2l_job_t *job, dk3_fig_drawing_t *drw) { f2lpgf_pgf_end_processing(job, drw); f2l_tool_end_latex_document(job->of1, job, drw); } void f2lpgf_tex_text_object( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double x, double y ) { f2lpgf_pgf_text_object(job, drw, obj, x, y); } void f2lpgf_tex_image_object( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, dk3_bb_t *outbb, int drawdir, int *ec ) { f2lpgf_pgf_image_object(job, drw, obj, outbb, drawdir, ec); } void f2lpgf_tex_newpath( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { f2lpgf_pgf_newpath(job, drw, obj); } void f2lpgf_tex_moveto( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double x, double y ) { f2lpgf_pgf_moveto(job, drw, obj, x, y); } void f2lpgf_tex_lineto( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double x, double y ) { f2lpgf_pgf_lineto(job, drw, obj, x, y); } void f2lpgf_tex_curveto( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double xcs, double ycs, double xce, double yce, double xe, double ye ) { f2lpgf_pgf_curveto(job, drw, obj, xcs, ycs, xce, yce, xe, ye); } void f2lpgf_tex_closepath( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { f2lpgf_pgf_closepath(job, drw, obj); } void f2lpgf_tex_fill( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { f2lpgf_pgf_fill(job, drw, obj); } void f2lpgf_tex_fill_stroke( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { f2lpgf_pgf_fill_stroke(job, drw, obj); } void f2lpgf_tex_fill_clip( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { f2lpgf_pgf_fill_clip(job, drw, obj); } void f2lpgf_tex_fill_stroke_clip( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { f2lpgf_pgf_fill_stroke_clip(job, drw, obj); } void f2lpgf_tex_clip( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { f2lpgf_pgf_clip(job, drw, obj); } void f2lpgf_tex_stroke( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { f2lpgf_pgf_stroke(job, drw, obj); } void f2lpgf_tex_gsave( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { f2lpgf_pgf_gsave(job, drw, obj); } void f2lpgf_tex_grestore( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { f2lpgf_pgf_grestore(job, drw, obj); } void f2lpgf_tex_setcolor( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double r, double g, double b ) { f2lpgf_pgf_setcolor(job, drw, obj, r, g, b); } void f2lpgf_tex_set_line_width( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, double lw ) { f2lpgf_pgf_set_line_width(job, drw, obj, lw); } void f2lpgf_tex_set_line_style( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, int ls, double sv, double lw ) { f2lpgf_pgf_set_line_style(job, drw, obj, ls, sv, lw); } void f2lpgf_tex_set_line_end( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, int le ) { f2lpgf_pgf_set_line_end(job, drw, obj, le); } void f2lpgf_tex_set_line_join( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, int lj ) { f2lpgf_pgf_set_line_join(job, drw, obj, lj); } void f2lpgf_tex_set_color_1( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_rgb_color_t *rgb ) { f2lpgf_pgf_set_color_1(job, drw, rgb); } void f2lpgf_tex_set_color_2( f2l_job_t *job, dk3_fig_drawing_t *drw, dk3_rgb_color_t *rgb ) { f2lpgf_pgf_set_color_2(job, drw, rgb); } void f2lpgf_tex_debug( f2l_job_t *job, char const *msg ) { f2lpgf_pgf_debug(job, msg); }