/* Copyright (C) 2017-2021, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). Changes you make here will be lost if dkct is run again! You should modify the original source and run dkct on it. Original source: dk4pppt.ctr */ /** @file dk4pppt.c The dk4pppt module. */ #include "dk4conf.h" #ifdef DK4_HAVE_MATH_H #ifndef MATH_H_INCLUDED #define _USE_MATH_DEFINES 1 #include #define MATH_H_INCLUDED 1 #endif #endif #ifndef DK4PPPT_H_INCLUDED #include #endif #ifndef GRA_H_INCLUDED #include #endif #ifndef DK4MEM_H_INCLUDED #include #endif #ifndef DK4ENC_H_INCLUDED #include #endif #ifndef DK4FOPD_H_INCLUDED #include #endif #ifndef DK4STR8_H_INCLUDED #include #endif #ifndef DK4STRD_H_INCLUDED #include #endif #ifndef DK4STRMF_H_INCLUDED #include #endif #ifndef DK4PATHD_H_INCLUDED #include #endif #ifndef DK4MPL_H_INCLUDED #include #endif #ifndef DK4ISADM_H_INCLUDED #include #endif #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif /** Constant text fragments. */ static const dkChar * const dk4pppt_dk_kw[] = { /* 0 */ dkT("-i.pdf"), /* 1 */ dkT(".pdf"), /* 2 */ dkT(".ps"), /* 3 */ dkT(".eps"), NULL }; /** Constant text fragments */ static const char * const dk4pppt_c8_kw[] = { /* 0 */ "\\put(", /* 1 */ ",", /* 2 */ "){", /* 3 */ "}%\n", /* 4 */ "\\makebox(0,0)[lb]{", /* 5 */ "\\makebox(0,0)[b]{", /* 6 */ "\\makebox(0,0)[rb]{", /* 7 */ "\\makebox(0,0)[l]{", /* 8 */ "\\makebox(0,0){", /* 9 */ "\\makebox(0,0)[r]{", /* 10 */ "\\makebox(0,0)[lt]{", /* 11 */ "\\makebox(0,0)[t]{", /* 12 */ "\\makebox(0,0)[rt]{", /* 13 */ "}", /* 14 */ "\\smash{", /* 15 */ "{", /* 16 */ "\\PPPTfo", /* 17 */ "\\begin{picture}(0,0)\n", /* 18 */ "\\end{picture}%\n\\setlength{\\unitlength}{1bp}%\n", /* 19 */ "\\includegraphics{", /* 20 */ "}\n", /* 21 */ "\\end{picture}%\n", /* 22 */ "\\begin{picture}(", /* 23 */ ")\n", /* 24 */ "{}", /* 25 */ "\\colorbox{white}{", /* 26 */ "\\ovalbox{", /* 27 */ "\\rotatebox{", /* 28 */ "}{", NULL }; /** Reset a success variable. @param backptr Address of success variable to reset. */ static void dk4pppt_reset(int *backptr) { if (NULL != backptr) { *backptr = 0; } } /** Check whether a value is within a specified range. @param min Minimum value (inclusive). @param max Maximum value (inclusive). @param val Value to check. @return 1 on success, 0 on error. */ static int dk4pppt_in_range(double min, double max, double val) { int back = 0; if ((min <= val) && (max >= val)) { back = 1; } return back; } /** Release preamble lines. @param ps Preamble lines storage. @param pi Preamble lines iterator. */ static void dk4pppt_release_preamble_lines( dk4_sto_t *ps, dk4_sto_it_t *pi ) { dk4_gra_preamble_line_t *pl; if (NULL != ps) { if (NULL != pi) { dk4sto_it_reset(pi); do { pl = (dk4_gra_preamble_line_t *)dk4sto_it_next(pi); if (NULL != pl) { dk4gratool_preamble_delete(pl); } } while (NULL != pl); dk4sto_it_close(pi); } dk4sto_close(ps); } } void dk4pppt_close( dk4_pppt_t *pppt ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (NULL != pppt) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { if (NULL != pppt->out.pgf) { dk4gra_close(pppt->out.pgf); pppt->out.pgf = NULL; } } break; default : { /* PDF+TeX or EPS+TeX */ dk4pppt_release_preamble_lines( pppt->out.ppt.s_f, pppt->out.ppt.i_f ); dk4pppt_release_preamble_lines( pppt->out.ppt.s_p, pppt->out.ppt.i_p ); dk4pppt_release_preamble_lines( pppt->out.ppt.s_o, pppt->out.ppt.i_o ); pppt->out.ppt.s_f = pppt->out.ppt.s_p = pppt->out.ppt.s_o = NULL; pppt->out.ppt.i_f = pppt->out.ppt.i_p = pppt->out.ppt.i_o = NULL; if (NULL != pppt->out.ppt.tms) { dk4stream_close(pppt->out.ppt.tms, NULL); pppt->out.ppt.tms = NULL; } if (NULL != pppt->out.ppt.tmb) { dk4membuf_close(pppt->out.ppt.tmb); pppt->out.ppt.tmb = NULL; } if (NULL != pppt->out.ppt.fc) { dk4fontc_close(pppt->out.ppt.fc); pppt->out.ppt.fc = NULL; } if (NULL != pppt->out.ppt.gra) { dk4gra_close(pppt->out.ppt.gra); pppt->out.ppt.gra = NULL; } if (NULL != pppt->out.ppt.tfn) { dk4mem_free(pppt->out.ppt.tfn); pppt->out.ppt.tfn = NULL; } } break; } dk4mem_free(pppt); } } /** Open a PGF output structure. @param texname Name of TeX output file. The name ends on ".tex". The name of the included *.eps or *.pdf file is derived from this name. @param dr Output driver. @param isdoc Flag: Produce LaTeX document, not just image. @param flags Additional flags for graphics. @param width Image width in bp (PS point). @param height Image height in bp. @param erp Error report, may be NULL. @return Valid pointer to new output structure on success, NULL on error. */ static dk4_pppt_t * dk4pppt_pgf_open( const dkChar *texname, int isdoc, int flags, size_t width, size_t height, dk4_er_t *erp ) { dk4_pppt_t *back = NULL; #if DK4_USE_ASSERT assert(NULL != texname); assert(0 < width); assert(0 < height); #endif back = dk4mem_new(dk4_pppt_t,1,erp); if (NULL != back) { DK4_MEMRES(back,sizeof(dk4_pppt_t)); back->flags = flags; back->isdoc = isdoc; back->dr = DK4_PPPT_DR_PGF; back->out.pgf = dk4gra_open_pgf(texname,width,height,flags,isdoc,erp); if (NULL == back->out.pgf) { dk4mem_free(back); back = NULL; } } return back; } /** Construct output file name based on TeX file name. @param obuf Output buffer. @param szobuf Output buffer size (number of dkChar). @param texname TeX file name. @param dr Driver to produce name for. @param flags Document flags. @param isdoc Flag: Produce entire document. @param erp Error report, may be NULL. @return 1 on success, 0 on error (buffer too short). */ static int dk4pppt_construct_output_file_name( dkChar *obuf, size_t szobuf, const dkChar *texname, dk4_pppt_driver_t dr, int flags, int isdoc, dk4_er_t *erp ) { dkChar *psuffix = NULL; /* File name existing suffix */ size_t kwi = 0; /* Keyword index for suffix to append */ int back = 0; #if DK4_USE_ASSERT assert(NULL != obuf); assert(0 < szobuf); assert(NULL != texname); #endif if (0 != dk4str_cpy_s(obuf, szobuf, texname, erp)) { psuffix = dk4path_get_suffix(obuf, NULL); if (NULL != psuffix) { *psuffix = dkT('\0'); } kwi = 1; if (DK4_PPPT_DR_PDF_TEX == dr) { if (0 != isdoc) { kwi = 0; } } else { kwi = 2; if (0 != (DK4_GRA_DOC_FLAG_EPS & flags)) { kwi = 3; } } back = dk4str_cat_s(obuf, szobuf, dk4pppt_dk_kw[kwi], erp); } if (0 == back) { obuf[0] = dkT('\0'); } return back; } /** Open a non-PGF output structure. @param texname Name of TeX output file. The name ends on ".tex". The name of the included *.eps or *.pdf file is derived from this name. @param dr Output driver. @param isdoc Flag: Produce LaTeX document, not just image. @param flags Additional flags for graphics. @param width Image width in bp (PS point). @param height Image height in bp. @param erp Error report, may be NULL. @return Valid pointer to new output structure on success, NULL on error. */ static dk4_pppt_t * dk4pppt_ppt_open( const dkChar *texname, dk4_pppt_driver_t dr, int isdoc, int flags, size_t width, size_t height, dk4_er_t *erp ) { dkChar ofnbuf[DK4_MAX_PATH]; /* Buffer to construct name */ #if DK4_CHAR_SIZE > 1 char tb[DK4_MAX_PATH]; /* ANSI file name */ #endif dk4_pppt_t *back = NULL; /* Function result */ int res = 0; /* Operation result */ int ok = 0; /* Flag: Everything ok */ #if DK4_USE_ASSERT assert(NULL != texname); #endif res = dk4pppt_construct_output_file_name( ofnbuf, DK4_SIZEOF(ofnbuf,dkChar), texname, dr, flags, isdoc, erp ); if (0 != res) { back = dk4mem_new(dk4_pppt_t,1,erp); if (NULL != back) { DK4_MEMRES(back,sizeof(dk4_pppt_t)); back->flags = flags; back->isdoc = isdoc; back->dr = dr; back->out.ppt.tfn = NULL; back->out.ppt.gra = NULL; back->out.ppt.fc = NULL; back->out.ppt.tmb = NULL; back->out.ppt.tms = NULL; back->out.ppt.s_f = NULL; back->out.ppt.i_f = NULL; back->out.ppt.s_p = NULL; back->out.ppt.i_p = NULL; back->out.ppt.s_o = NULL; back->out.ppt.i_o = NULL; back->out.ppt.dfs = -1.0; back->out.ppt.n_f = 0UL; back->out.ppt.n_p = 0UL; back->out.ppt.n_o = 0UL; back->out.ppt.tfn = dk4str_dup(texname, erp); if (NULL != back->out.ppt.tfn) { if (DK4_PPPT_DR_EPS_TEX == dr) { back->out.ppt.gra = dk4gra_open_ps( ofnbuf, width, height, flags, erp ); } else { back->out.ppt.gra = dk4gra_open_pdf( ofnbuf, width, height, flags, erp ); } if (NULL != back->out.ppt.gra) { back->out.ppt.fc = dk4fontc_open(erp); if (NULL != back->out.ppt.fc) { back->out.ppt.tmb = dk4membuf_open(erp); if (NULL != back->out.ppt.tmb) { back->out.ppt.tms = dk4stream_open_membuf_writer( back->out.ppt.tmb, erp ); if (NULL != back->out.ppt.tms) { #if DK4_CHAR_SIZE > 1 #if DK4_CHAR_SIZE > 2 ok = dk4recode_dk_to_any( tb, sizeof(tb), DK4_FILE_ENCODING_WIN1252, ofnbuf, DK4_ENCODING_32, erp ); #else ok = dk4recode_dk_to_any( tb, sizeof(tb), DK4_FILE_ENCODING_WIN1252, ofnbuf, DK4_ENCODING_UTF16, erp ); #endif #else ok = 1; #endif } } } } } if (0 == ok) { dk4pppt_close(back); back = NULL; } } } return back; } dk4_pppt_t * dk4pppt_open( const dkChar *texname, dk4_pppt_driver_t dr, int isdoc, int flags, size_t width, size_t height, dk4_er_t *erp ) { dk4_pppt_t *back = NULL; int ok = 1; #if DK4_USE_ASSERT assert(NULL != texname); assert(0 < width); assert(0 < height); #endif if ((NULL != texname) && (0 < width) && (0 < height)) { switch (dr) { case DK4_PPPT_DR_PGF : { back = dk4pppt_pgf_open( texname, isdoc, flags, width, height, erp ); } break; case DK4_PPPT_DR_EPS_TEX : { /* Cannot create document for PS output, check here */ if (0 == isdoc) { back = dk4pppt_ppt_open( texname, dr, isdoc, flags, width, height, erp ); } else { dk4error_set_simple_error_code(erp,DK4_E_INVALID_ARGUMENTS); } } break; default : { /* DK4_PPPT_DR_PDF_TEX */ back = dk4pppt_ppt_open( texname, dr, isdoc, flags, width, height, erp ); } break; } if (NULL != back) { switch (dr) { case DK4_PPPT_DR_PGF : { dk4gra_page_with_flags( back->out.pgf, flags, &ok, erp ); } break; default : { dk4gra_page_with_flags( back->out.ppt.gra, flags, &ok, erp ); } break; } if (0 == ok) { dk4pppt_close(back); back = NULL; } } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; } /** Check whether pppt object state grants graphics and text operations. @param pppt Structure to check. @return 1 on success, 0 on error. */ static int dk4pppt_is_state_ok( const dk4_pppt_t *pppt ) { int back = 0; /* Check for valid pointer */ if (NULL == pppt) { goto finished; } /* Remaining checks depend on driver */ switch (pppt->dr) { case DK4_PPPT_DR_PGF : { if (NULL != pppt->out.pgf) { back = 1; } } break; default : { if (NULL != pppt->out.ppt.gra) { if (NULL != pppt->out.ppt.fc) { if (NULL != pppt->out.ppt.tmb) { if (NULL != pppt->out.ppt.tms) { if (NULL != pppt->out.ppt.tfn) { back = 1; } } } } } } break; } finished: return back; } /** Convert backslashes to forward slashes for use of file name in LaTeX. @param fn String to correct. */ static void dk4pppt_to_slash(char *fn) { while ('\0' != *fn) { if ('\\' == *fn) { *fn = '/'; } fn++; } } /** Write file name to includegraphics instruction. @param ostrm Destination output stream. @param fn File name to print. @param backptr Address of success variable to reset on error. @param erp Error report, may be NULL. */ static void dk4pppt_file_name_to_stream( dk4_stream_t *ostrm, const dkChar *fn, int *backptr, dk4_er_t *erp ) { char buf[DK4_MAX_PATH]; char *p1 = NULL; char *p2 = NULL; int res = 0; #if DK4_USE_ASSERT assert(NULL != ostrm); assert(NULL != fn); #endif #if DK4_CHAR_SIZE > 1 #if DK4_CHAR_SIZE > 2 res = dk4recode_dk_to_any( buf, sizeof(buf), DK4_FILE_ENCODING_WIN1252, fn, DK4_ENCODING_32, erp ); #else res = dk4recode_dk_to_any( buf, sizeof(buf), DK4_FILE_ENCODING_WIN1252, fn, DK4_ENCODING_UTF16, erp ); #endif #else res = dk4str8_cpy_s(buf, sizeof(buf), fn, erp); #endif if (0 != res) { dk4pppt_to_slash(buf); if (0 != dk4path_is_absolute(fn)) { res = dk4stream_write_char_string(ostrm, buf, erp); if (0 == res) { if (NULL != backptr) { *backptr = 0; } } } else { p2 = buf; while ('\0' != *p2) { if ('/' == *p2) { p1 = p2; } p2++; } if (NULL != p1) { p1++; } else { p1 = buf; } res = dk4stream_write_char_string(ostrm, p1, erp); if (0 == res) { if (NULL != backptr) { *backptr = 0; } } } } else { if (NULL != backptr) { *backptr = 0; } } } /** Write output data. @param pppt Output structure. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ static int dk4pppt_write( dk4_pppt_t *pppt, dk4_er_t *erp ) { FILE *fout = NULL; dk4_stream_t *ostrm = NULL; int tests = DK4_FOPEN_SC_USER; int res = 0; int back = 0; #if DK4_USE_ASSERT assert(NULL != pppt); #endif switch (pppt->dr) { case DK4_PPPT_DR_PGF : { back = 1; dk4gra_write_and_close(pppt->out.pgf, &back, erp); pppt->out.pgf = NULL; } break; default : { /* Write *.tex file first, as name of graphics file is in gra */ if (0 != dk4isadmin()) { tests = DK4_FOPEN_SC_PRIVILEGED; } fout = dk4fopen(pppt->out.ppt.tfn, dkT("wb"), tests, erp); if (NULL != fout) { ostrm = dk4stream_open_for_file( fout, DK4_STREAM_WRITE, 0, 0, erp ); if (NULL != ostrm) { back = 1; if (0 != pppt->isdoc) { dk4gratool_start_standalone_document( ostrm, pppt->out.ppt.gra, 0, pppt->out.ppt.dfs, pppt->out.ppt.s_f, pppt->out.ppt.i_f, pppt->out.ppt.s_p, pppt->out.ppt.i_p, pppt->out.ppt.s_o, pppt->out.ppt.i_o, &back, erp ); } dk4gratool_stream_string( ostrm, dk4pppt_c8_kw[17], &back, erp ); dk4gratool_stream_string( ostrm, dk4pppt_c8_kw[19], &back, erp ); dk4pppt_file_name_to_stream( ostrm, pppt->out.ppt.gra->fn, &back, erp ); dk4gratool_stream_string( ostrm, dk4pppt_c8_kw[20], &back, erp ); dk4gratool_stream_string( ostrm, dk4pppt_c8_kw[18], &back, erp ); dk4gratool_font_definitions( ostrm, pppt->out.ppt.fc, &back, erp ); dk4gratool_stream_string( ostrm, dk4pppt_c8_kw[22], &back, erp ); dk4gratool_stream_uint( ostrm, pppt->out.ppt.gra->w, 0, &back, erp ); dk4gratool_stream_string( ostrm, dk4pppt_c8_kw[1], &back, erp ); dk4gratool_stream_uint( ostrm, pppt->out.ppt.gra->h, 0, &back, erp ); dk4gratool_stream_string( ostrm, dk4pppt_c8_kw[23], &back, erp ); if (NULL != pppt->out.ppt.tms) { if (0 == dk4stream_close(pppt->out.ppt.tms, erp)) { back = 0; } pppt->out.ppt.tms = NULL; } if (NULL != pppt->out.ppt.tmb) { res = dk4membuf_to_stream(ostrm,pppt->out.ppt.tmb,erp); if (0 == res) { back = 0; } } dk4gratool_stream_string( ostrm, dk4pppt_c8_kw[21], &back, erp ); if (0 != pppt->isdoc) { dk4gratool_end_standalone_document(ostrm, &back, erp); } if (0 == dk4stream_close(ostrm, erp)) { back = 0; } /* Write and close the real graphics */ dk4gra_write_and_close( pppt->out.ppt.gra, &back, erp ); pppt->out.ppt.gra = NULL; } if (0 != fclose(fout)) { back = 0; } } } break; } return back; } int dk4pppt_write_and_close( dk4_pppt_t *pppt, dk4_er_t *erp ) { int back = 0; #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (NULL != pppt) { if (0 != dk4pppt_is_state_ok(pppt)) { back = dk4pppt_write(pppt, erp); } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } dk4pppt_close(pppt); } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; } void dk4pppt_set_gs_for_pattern_only( dk4_pppt_t *pppt, int val, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_set_gs_for_pattern_only( pppt->out.pgf, val, erp ); } break; default : { dk4gra_set_gs_for_pattern_only( pppt->out.ppt.gra, val, erp ); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } } void dk4pppt_gsave( dk4_pppt_t *pppt, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_gsave(pppt->out.pgf, backptr, erp); } break; default : { dk4gra_gsave(pppt->out.ppt.gra, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_grestore( dk4_pppt_t *pppt, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_grestore(pppt->out.pgf, backptr, erp); } break; default : { dk4gra_grestore(pppt->out.ppt.gra, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_set_line_width( dk4_pppt_t *pppt, double lw, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if ((0 != dk4pppt_is_state_ok(pppt)) && (0.0 <= lw)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_set_line_width(pppt->out.pgf, lw, backptr, erp); } break; default : { dk4gra_set_line_width(pppt->out.ppt.gra, lw, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_set_line_style( dk4_pppt_t *pppt, dk4_gra_ls_t ls, double sv, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if ((0 != dk4pppt_is_state_ok(pppt)) && (0.0 <= sv)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_set_line_style(pppt->out.pgf, ls, sv, backptr, erp); } break; default : { dk4gra_set_line_style(pppt->out.ppt.gra, ls, sv, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_set_line_cap( dk4_pppt_t *pppt, dk4_gra_lc_t lc, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_set_line_cap(pppt->out.pgf, lc, backptr, erp); } break; default : { dk4gra_set_line_cap(pppt->out.ppt.gra, lc, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_set_line_join( dk4_pppt_t *pppt, dk4_gra_lj_t lj, double ml, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_set_line_join(pppt->out.pgf, lj, ml, backptr, erp); } break; default : { dk4gra_set_line_join(pppt->out.ppt.gra, lj, ml, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_set_fill_gray( dk4_pppt_t *pppt, double g, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if ((0 != dk4pppt_is_state_ok(pppt)) && (0.0 <= g) && (1.0 >= g)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_set_fill_gray(pppt->out.pgf, g, backptr, erp); } break; default : { dk4gra_set_fill_gray(pppt->out.ppt.gra, g, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_set_fill_rgb( dk4_pppt_t *pppt, double r, double g, double b, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if ((0 != dk4pppt_is_state_ok(pppt)) && (dk4pppt_in_range(0.0, 1.0, r)) && (dk4pppt_in_range(0.0, 1.0, g)) && (dk4pppt_in_range(0.0, 1.0, b)) ) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_set_fill_rgb(pppt->out.pgf, r, g, b, backptr, erp); } break; default : { dk4gra_set_fill_rgb(pppt->out.ppt.gra, r, g, b, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_set_fill_cmyk( dk4_pppt_t *pppt, double c, double m, double y, double k, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if ((0 != dk4pppt_is_state_ok(pppt)) && (dk4pppt_in_range(0.0, 1.0, c)) && (dk4pppt_in_range(0.0, 1.0, m)) && (dk4pppt_in_range(0.0, 1.0, y)) && (dk4pppt_in_range(0.0, 1.0, k)) ) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_set_fill_cmyk(pppt->out.pgf, c, m, y, k, backptr, erp); } break; default : { dk4gra_set_fill_cmyk(pppt->out.ppt.gra,c,m,y,k,backptr,erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_set_stroke_gray( dk4_pppt_t *pppt, double g, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if ((0 != dk4pppt_is_state_ok(pppt)) && (dk4pppt_in_range(0.0, 1.0, g))) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_set_stroke_gray(pppt->out.pgf, g, backptr, erp); } break; default : { dk4gra_set_stroke_gray(pppt->out.ppt.gra, g, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_set_stroke_rgb( dk4_pppt_t *pppt, double r, double g, double b, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if ( (0 != dk4pppt_is_state_ok(pppt)) && (dk4pppt_in_range(0.0, 1.0, r)) && (dk4pppt_in_range(0.0, 1.0, g)) && (dk4pppt_in_range(0.0, 1.0, b)) ) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_set_stroke_rgb(pppt->out.pgf, r, g, b, backptr, erp); } break; default : { dk4gra_set_stroke_rgb(pppt->out.ppt.gra, r, g, b, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_set_stroke_cmyk( dk4_pppt_t *pppt, double c, double m, double y, double k, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if ( (0 != dk4pppt_is_state_ok(pppt)) && (dk4pppt_in_range(0.0, 1.0, c)) && (dk4pppt_in_range(0.0, 1.0, m)) && (dk4pppt_in_range(0.0, 1.0, y)) && (dk4pppt_in_range(0.0, 1.0, k)) ) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_set_stroke_cmyk(pppt->out.pgf, c, m, y, k, backptr, erp); } break; default : { dk4gra_set_stroke_cmyk(pppt->out.ppt.gra,c,m,y,k,backptr,erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_prepare_fill( dk4_pppt_t *pppt, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_prepare_fill(pppt->out.pgf, backptr, erp); } break; default : { dk4gra_prepare_fill(pppt->out.ppt.gra, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_prepare_stroke( dk4_pppt_t *pppt, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_prepare_stroke(pppt->out.pgf, backptr, erp); } break; default : { dk4gra_prepare_stroke(pppt->out.ppt.gra, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_prepare_fill_and_stroke( dk4_pppt_t *pppt, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_prepare_fill_and_stroke(pppt->out.pgf, backptr, erp); } break; default : { dk4gra_prepare_fill_and_stroke(pppt->out.ppt.gra, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } int dk4pppt_can_fill_and_stroke( const dk4_pppt_t *pppt ) { int back = 0; #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { back = dk4gra_can_fill_and_stroke(pppt->out.pgf); } break; default : { back = dk4gra_can_fill_and_stroke(pppt->out.ppt.gra); } break; } } return back; } void dk4pppt_fill( dk4_pppt_t *pppt, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_fill(pppt->out.pgf, backptr, erp); } break; default : { dk4gra_fill(pppt->out.ppt.gra, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_stroke( dk4_pppt_t *pppt, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_stroke(pppt->out.pgf, backptr, erp); } break; default : { dk4gra_stroke(pppt->out.ppt.gra, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_fill_and_stroke( dk4_pppt_t *pppt, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_fill_and_stroke(pppt->out.pgf, backptr, erp); } break; default : { dk4gra_fill_and_stroke(pppt->out.ppt.gra, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_clip( dk4_pppt_t *pppt, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_clip(pppt->out.pgf, backptr, erp); } break; default : { dk4gra_clip(pppt->out.ppt.gra, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_set_pattern_line_width( dk4_pppt_t *pppt, double plw ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (NULL != pppt) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_set_pattern_line_width(pppt->out.pgf, plw); } break; default : { dk4gra_set_pattern_line_width(pppt->out.ppt.gra, plw); } break; } } } void dk4pppt_pattern( dk4_pppt_t *pppt, double xl, double xr, double yb, double yt, dk4_gra_pattern_t pn, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_pattern(pppt->out.pgf, xl, xr, yb, yt, pn, backptr, erp); } break; default : { dk4gra_pattern(pppt->out.ppt.gra,xl,xr,yb,yt,pn,backptr,erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_newpath_moveto( dk4_pppt_t *pppt, double x, double y, dk4_bb_t *bbptr, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_newpath_moveto(pppt->out.pgf, x, y, bbptr, backptr, erp); } break; default : { dk4gra_newpath_moveto(pppt->out.ppt.gra,x,y,bbptr,backptr,erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_lineto( dk4_pppt_t *pppt, double x, double y, dk4_bb_t *bbptr, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_lineto(pppt->out.pgf, x, y, bbptr, backptr, erp); } break; default : { dk4gra_lineto(pppt->out.ppt.gra, x, y, bbptr, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_curveto( dk4_pppt_t *pppt, double xc1, double yc1, double xc2, double yc2, double x, double y, dk4_bb_t *bbptr, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_curveto( pppt->out.pgf, xc1, yc1, xc2, yc2, x, y, bbptr, backptr, erp ); } break; default : { dk4gra_curveto( pppt->out.ppt.gra,xc1,yc1,xc2,yc2,x,y,bbptr,backptr,erp ); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_closepath( dk4_pppt_t *pppt, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_closepath(pppt->out.pgf, backptr, erp); } break; default : { dk4gra_closepath(pppt->out.ppt.gra, backptr, erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_bif_fig_image( dk4_pppt_t *pppt, double xl, double xr, double yb, double yt, dk4_bif_t *bif, const dkChar *fn, size_t fno, int pos, int ifl, dk4_bb_t *bbptr, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); assert(NULL != bif); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_bif_fig_image( pppt->out.pgf, xl, xr, yb, yt, bif, fn, fno, pos, ifl, bbptr, backptr, erp ); } break; default : { dk4gra_bif_fig_image( pppt->out.ppt.gra, xl, xr, yb, yt, bif, fn, fno, pos, ifl, bbptr, backptr, erp ); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_bif_image( dk4_pppt_t *pppt, double xl, double xr, double yb, double yt, dk4_bif_t *bif, const dkChar *fn, size_t fno, int ifl, dk4_bb_t *bbptr, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); assert(NULL != bif); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_bif_image( pppt->out.pgf, xl, xr, yb, yt, bif, fn, fno, ifl, bbptr, backptr, erp ); } break; default : { dk4gra_bif_image( pppt->out.ppt.gra, xl, xr, yb, yt, bif, fn, fno, ifl, bbptr, backptr, erp ); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_image( dk4_pppt_t *pppt, double xl, double xr, double yb, double yt, const dkChar *fn, size_t fno, dk4_cs_conv_ctx_t *ctx, int ifl, dk4_bb_t *bbptr, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); assert(NULL != fn); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_image( pppt->out.pgf, xl, xr, yb, yt, fn, fno, ctx, ifl, bbptr, backptr, erp ); } break; default : { dk4gra_image( pppt->out.ppt.gra, xl, xr, yb, yt, fn, fno, ctx, ifl, bbptr, backptr, erp ); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_fig_image( dk4_pppt_t *pppt, double xl, double xr, double yb, double yt, const dkChar *fn, size_t fno, dk4_cs_conv_ctx_t *ctx, int pos, int ifl, dk4_bb_t *bbptr, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); assert(NULL != fn); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_fig_image( pppt->out.pgf, xl, xr, yb, yt, fn, fno, ctx, pos, ifl, bbptr, backptr, erp ); } break; default : { dk4gra_fig_image( pppt->out.ppt.gra, xl, xr, yb, yt, fn, fno, ctx, pos, ifl, bbptr, backptr, erp ); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_circle( dk4_pppt_t *pppt, double xc, double yc, double r, dk4_bb_t *bbptr, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_circle(pppt->out.pgf, xc, yc, r, bbptr, backptr, erp); } break; default : { dk4gra_circle(pppt->out.ppt.gra,xc,yc,r,bbptr,backptr,erp); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_rectangle( dk4_pppt_t *pppt, double xl, double xr, double yb, double yt, double r, dk4_bb_t *bbptr, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_rectangle(pppt->out.pgf,xl,xr,yb,yt,r,bbptr,backptr,erp); } break; default : { dk4gra_rectangle( pppt->out.ppt.gra, xl, xr, yb, yt, r, bbptr, backptr, erp ); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_arc( dk4_pppt_t *pppt, double xc, double yc, double ra, double start, double end, int cl, dk4_bb_t *bbptr, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_arc( pppt->out.pgf, xc, yc, ra, start, end, cl, bbptr, backptr, erp ); } break; default : { dk4gra_arc( pppt->out.ppt.gra, xc, yc, ra, start, end, cl, bbptr, backptr, erp ); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_ellipse( dk4_pppt_t *pppt, double xc, double yc, double rx, double ry, double rot, dk4_bb_t *bbptr, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_ellipse( pppt->out.pgf, xc, yc, rx, ry, rot, bbptr, backptr, erp ); } break; default : { dk4gra_ellipse( pppt->out.ppt.gra, xc, yc, rx, ry, rot, bbptr, backptr, erp ); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } static void dk4pppt_kw_out( dk4_pppt_t *pppt, size_t kwi, int *backptr, dk4_er_t *erp ) { dk4gratool_stream_string( pppt->out.ppt.tms, dk4pppt_c8_kw[kwi], backptr, erp ); } static void dk4pppt_double_out( dk4_pppt_t *pppt, double val, int *backptr, dk4_er_t *erp ) { dk4gratool_stream_double( pppt->out.ppt.tms, val, backptr, erp ); } /** Handle one text piece, normal or special. @param pppt Output structure. @param x X position. @param y Y position. @param rot Rotation counterclockwise in degree. @param txt Text to write, dkChar for normal text, char for special. @param colspec Color specification, may be NULL to use fill color. @param ie Input encoding for normal text. @param ha Horizontal alignment. @param va Vertical alignment. @param isnt Flag: Normal text. @param fno Font id number. @param fsz Font size. @param fex Flag: Use font exactly as specified. @param uc2l Unicode to LaTeX converter, may be NULL for special text. @param flags Text flags. @param backptr Address of success variable to reset on error. @param erp Error report, may be NULL. */ static void dk4pppt_i_text( dk4_pppt_t *pppt, double x, double y, double rot, const void *txt, const char *colspec, int ie, int ha, int va, int isnt, int fno, double fsz, dk4_gra_tf_t fex, dk4_uc2l_t *uc2l, int flags, int *backptr, dk4_er_t *erp ) { dk4gra_col_t *pcolf = NULL; /* Fill color */ dk4_gra_ps_page_t *pgps = NULL; /* PS page */ dk4_gra_pdf_page_t *pgpdf = NULL; /* PDF page */ size_t fontno = 0; /* Font number */ size_t kwi = 4; /* Keyword index */ int res = 0; /* One operation result */ int dorot = 0; /* Flag: Use rotatebox */ /* Attempt to register font */ if (1.0e-8 < fabs(rot)) { dorot = 1; } if (0 != isnt) { if (0 == dk4fontc_add_font(&fontno, pppt->out.ppt.fc, fno, fsz, fex, erp)) { goto finished; } } /* Find non-stroking color */ switch (pppt->dr) { case DK4_PPPT_DR_PDF_TEX : { pgpdf = (dk4_gra_pdf_page_t *)(pppt->out.ppt.gra->curpg); if (NULL != pgpdf) { pcolf = &(pgpdf->attr.col_fill_requested); } else { goto finished; } } break; case DK4_PPPT_DR_EPS_TEX : { pgps = (dk4_gra_ps_page_t *)(pppt->out.ppt.gra->curpg); if (NULL != pgps) { pcolf = &(pgps->attr.col_fill_requested); } else { goto finished; } } break; default : { /* Empty by intent */ } break; } if (NULL == pcolf) { goto finished; } /* put( */ dk4pppt_kw_out(pppt, 0, backptr, erp); /* X */ dk4pppt_double_out(pppt, x, backptr, erp); /* , */ dk4pppt_kw_out(pppt, 1, backptr, erp); /* Y */ dk4pppt_double_out(pppt, y, backptr, erp); /* ){ */ dk4pppt_kw_out(pppt, 2, backptr, erp); if (0 != dorot) { /* Open rotatebox */ dk4pppt_kw_out(pppt, 27, backptr, erp); dk4pppt_double_out(pppt, rot, backptr, erp); dk4pppt_kw_out(pppt, 28, backptr, erp); } /* Find index of makebox instruction depending on alignment */ switch (va) { case DK4_TEXT_ALIGN_V_TOP : { switch (ha) { case DK4_TEXT_ALIGN_H_CENTERED : { kwi = 11; } break; case DK4_TEXT_ALIGN_H_RIGHT : { kwi = 12; } break; default : { /* left */ kwi = 10; } break; } } break; case DK4_TEXT_ALIGN_V_CENTERED : { switch (ha) { case DK4_TEXT_ALIGN_H_CENTERED : { kwi = 8; } break; case DK4_TEXT_ALIGN_H_RIGHT : { kwi = 9; } break; default : { /* left */ kwi = 7; } break; } } break; default : { /* base or bottom */ switch (ha) { case DK4_TEXT_ALIGN_H_CENTERED : { kwi = 5; } break; case DK4_TEXT_ALIGN_H_RIGHT : { kwi = 6; } break; default : { /* left */ kwi = 4; } break; } } break; } /* Start makebox */ dk4pppt_kw_out(pppt, kwi, backptr, erp); /* Start smash */ if (DK4_TEXT_ALIGN_V_BASELINE == va) { dk4pppt_kw_out(pppt, 14, backptr, erp); } /* Start group */ dk4pppt_kw_out(pppt, 15, backptr, erp); /* Open white box */ if (0 != (DK4_GRA_TEXT_FLAG_WHITE_BOX & flags)) { dk4pppt_kw_out(pppt, 25, backptr, erp); } /* Color */ if (NULL != colspec) { res = dk4stream_write_char_string(pppt->out.ppt.tms, colspec, erp); if (0 == res) { dk4pppt_reset(backptr); } } else { dk4gratool_stream_color(pppt->out.ppt.tms, pcolf, backptr, erp); } /* Open oval box */ if (0 != (DK4_GRA_TEXT_FLAG_OVAL_BOX & flags)) { dk4pppt_kw_out(pppt, 26, backptr, erp); } /* Font */ if (0 != isnt) { dk4pppt_kw_out(pppt, 16, backptr, erp); dk4gratool_stream_num_alpha(pppt->out.ppt.tms, fontno, backptr, erp); dk4pppt_kw_out(pppt, 24, backptr, erp); } /* Text */ if (0 != isnt) { /* normal text */ res = dk4uc2l_string_encoded( pppt->out.ppt.tms, uc2l, (const dkChar *)txt, ie, erp ); if (0 == res) { dk4pppt_reset(backptr); } } else { /* special text */ res = dk4stream_write_char_string( pppt->out.ppt.tms, (const char *)txt, erp ); if (0 == res) { dk4pppt_reset(backptr); } } /* Close oval box */ if (0 != (DK4_GRA_TEXT_FLAG_OVAL_BOX & flags)) { dk4pppt_kw_out(pppt, 13, backptr, erp); } /* Close white box */ if (0 != (DK4_GRA_TEXT_FLAG_WHITE_BOX & flags)) { dk4pppt_kw_out(pppt, 13, backptr, erp); } /* End group */ dk4pppt_kw_out(pppt, 13, backptr, erp); /* End smash */ if (DK4_TEXT_ALIGN_V_BASELINE == va) { dk4pppt_kw_out(pppt, 13, backptr, erp); } /* End makebox */ dk4pppt_kw_out(pppt, 13, backptr, erp); if (0 != dorot) { /* End rotatebox */ dk4pppt_kw_out(pppt, 13, backptr, erp); } /* } newline */ dk4pppt_kw_out(pppt, 3, backptr, erp); finished: return; } void dk4pppt_simple_utf8_text( dk4_pppt_t *pppt, double x, double y, double rot, const char *txt, const char *colspec, dk4_text_align_h_t ha, dk4_text_align_v_t va, int fno, double fsz, dk4_gra_tf_t fex, dk4_uc2l_t *uc2l, int flags, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); assert(NULL != txt); #endif if ((0 != dk4pppt_is_state_ok(pppt)) && (NULL != txt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_pgf_simple_utf8_text( pppt->out.pgf, x, y, rot, txt, colspec, ha, va, fno, fsz, fex, uc2l, flags, backptr, erp ); } break; default : { dk4pppt_i_text( pppt, x, y, rot, txt, colspec, DK4_ENCODING_UTF8, ha, va, 1, fno, fsz, fex, uc2l, flags, backptr, erp ); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_simple_text( dk4_pppt_t *pppt, double x, double y, double rot, const dkChar *txt, const char *colspec, int ie, dk4_text_align_h_t ha, dk4_text_align_v_t va, int fno, double fsz, dk4_gra_tf_t fex, dk4_uc2l_t *uc2l, int flags, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); assert(NULL != txt); #endif if ((0 != dk4pppt_is_state_ok(pppt)) && (NULL != txt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_pgf_simple_text( pppt->out.pgf, x, y, rot, txt, colspec, ie, ha, va, fno, fsz, fex, uc2l, flags, backptr, erp ); } break; default : { dk4pppt_i_text( pppt, x, y, rot, txt, colspec, ie, ha, va, 1, fno, fsz, fex, uc2l, flags, backptr, erp ); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_special_text( dk4_pppt_t *pppt, double x, double y, double rot, const char *txt, const char *colspec, dk4_text_align_h_t ha, dk4_text_align_v_t va, int fno, double fsz, dk4_gra_tf_t fex, int flags, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); assert(NULL != txt); #endif if ((0 != dk4pppt_is_state_ok(pppt)) && (NULL != txt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_pgf_special_text( pppt->out.pgf, x, y, rot, txt, colspec, ha, va, fno, fsz, fex, flags, backptr, erp ); } break; default : { dk4pppt_i_text( pppt, x, y, rot, txt, colspec, DK4_FILE_ENCODING_PLAIN, ha, va, 0, fno, fsz, fex, NULL, flags, backptr, erp ); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } void dk4pppt_set_eorule( dk4_pppt_t *pppt, int val ) { #if DK4_USE_ASSERT assert(NULL != pppt); #endif if (0 != dk4pppt_is_state_ok(pppt)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_set_eorule(pppt->out.pgf, val); } break; default : { dk4gra_set_eorule(pppt->out.ppt.gra, val); } break; } } } void dk4pppt_doc_font_size( dk4_pppt_t *pppt, double fs, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); assert(0.0 < fs); #endif if ((0 != dk4pppt_is_state_ok(pppt)) && (0.0 < fs)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_pgf_doc_font_size(pppt->out.pgf , fs, backptr, erp); } break; default : { pppt->out.ppt.dfs = fs; } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } static void dk4pppt_one_preamble_line( dk4_sto_t **ps, dk4_sto_it_t **pi, size_t *pn, char const *pline, int *backptr, dk4_er_t *erp ) { dk4_gra_preamble_line_t *pl; int back = 0; if (SIZE_MAX > *pn) { if (NULL == *ps) { *ps = dk4sto_open(erp); if (NULL != *ps) { dk4sto_set_comp(*ps, dk4gratool_compare_preamble_lines, 0); } } if (NULL != *ps) { if (NULL == *pi) { *pi = dk4sto_it_open(*ps, erp); } if (NULL != *pi) { pl = dk4gratool_preamble_new(pline, *pn, erp); if (NULL != pl) { if (0 != dk4sto_add(*ps, pl, erp)) { back = 1; } else { dk4gratool_preamble_delete(pl); } } } } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } if (0 == back) { dk4pppt_reset(backptr); } } void dk4pppt_doc_preamble_line( dk4_pppt_t *pppt, const char *line, int tp, int *backptr, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != pppt); assert(NULL != line); #endif if ((0 != dk4pppt_is_state_ok(pppt)) && (NULL != line)) { switch (pppt->dr) { case DK4_PPPT_DR_PGF : { dk4gra_pgf_doc_preamble_line(pppt->out.pgf,line,tp,backptr,erp); } break; default : { switch (tp) { case DK4_GRA_PREAMBLE_FONT : { dk4pppt_one_preamble_line( &(pppt->out.ppt.s_f), &(pppt->out.ppt.i_f), &(pppt->out.ppt.n_f), line, backptr, erp ); } break; case DK4_GRA_PREAMBLE_PACKAGE : { dk4pppt_one_preamble_line( &(pppt->out.ppt.s_p), &(pppt->out.ppt.i_p), &(pppt->out.ppt.n_p), line, backptr, erp ); } break; case DK4_GRA_PREAMBLE_OTHER : { dk4pppt_one_preamble_line( &(pppt->out.ppt.s_o), &(pppt->out.ppt.i_o), &(pppt->out.ppt.n_o), line, backptr, erp ); } break; default : { dk4error_set_simple_error_code( erp, DK4_E_INVALID_ARGUMENTS ); dk4pppt_reset(backptr); } break; } } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); dk4pppt_reset(backptr); } } /* vim: set ai sw=4 ts=4 : */