%% options copyright owner = Dirk Krause copyright year = 2017-xxxx SPDX-License-Identifier: BSD-3-Clause %% module #include "dk4conf.h" #if DK4_HAVE_MATH_H #ifndef MATH_H_INCLUDED #if DK4_ON_WINDOWS #ifndef _USE_MATH_DEFINES #define _USE_MATH_DEFINES 1 #endif #endif #include #define MATH_H_INCLUDED 1 #endif #endif #ifndef DK4UFI_H_INCLUDED #include "dk4ufi.h" #endif #ifndef DK4BIF_H_INCLUDED #include "dk4bif.h" #endif #ifndef DK4GRA_H_INCLUDED #include "dk4gra.h" #endif #ifndef GRA_H_INCLUDED #include "gra.h" #endif #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif $!trace-include /** Constant text fragments for PGF output. */ static const char * const dk4gra_pgf_img_kw[] = { /* 0 */ "\\begin{pgfscope}\n", /* 1 */ "\\end{pgfscope}\n", /* 2 */ "\\pgftransformshift{\\pgfpoint{", /* 3 */ "bp}{", /* 4 */ "bp}}\n", /* 5 */ "\\pgftransformrotate{", /* 6 */ "}\n", /* 7 */ "\\pgftransformxscale{", /* 8 */ "\\pgftransformyscale{", /* 9 */ "}\n", /* 10 */ "\\pgftext[left,base,at=\\pgfpointorigin]{\\pgfuseimage{PPPTim", /* 11 */ "}}\n", NULL }; int dk4gra_pgf_bif_fig_image( dk4_gra_t *gra, double *cotra, dk4_bif_t *bif, const dkChar *fn, int ifl, dk4_er_t *erp ) { dk4_gra_pgf_img_no_t to; /* Test object */ dk4_gra_pgf_img_no_t *tptr = NULL; /* Search existing or add new */ dk4_gra_pgf_page_t *bptr = NULL; /* Current page */ int back = 0; $? "+ dk4gra_pgf_bif_fig_image \"%!ds\"", TR_STR(fn) #if DK4_USE_ASSERT assert(NULL != gra); assert(NULL != bif); assert(NULL != cotra); assert(NULL != fn); #endif /* Check arguments */ if ((NULL == gra) || (NULL == cotra) || (NULL == bif) || (NULL == fn)) { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); goto finished; } bptr = (dk4_gra_pgf_page_t *)(gra->curpg); if (NULL == bptr->memstrm) { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); goto finished; } /* Check image file types, pdflatex can handle JPEG and PNG only */ switch (dk4bif_get_image_type(bif)) { case DK4_BIF_TYPE_NETPBM : case DK4_BIF_TYPE_TIFF : { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); goto finished; } break; } to.fn = (dkChar *)fn; to.hufi = dk4ufi_get(&(to.ufi), fn, erp); to.intp = ((0 != (DK4_GRA_IMG_FLAG_INTERPOLATION & ifl)) ? (1) : (0)); to.imgno = gra->out.pgf.n_images; if ( (0 != (DK4_GRA_IMG_FLAG_DCT & ifl)) && (DK4_BIF_TYPE_JPEG == bif->imgtype) ) { if (0 == (DK4_GRA_IMG_FLAG_DCT_INTERPOLATION & ifl)) { to.intp = 0; } } tptr = (dk4_gra_pgf_img_no_t *)dk4sto_it_find_like( gra->out.pgf.i_images, &to, 0 ); if (NULL == tptr) { if (SIZE_MAX > gra->out.pgf.n_images) { tptr = dk4gra_pgf_img_open( fn, gra->out.pgf.n_images, to.intp, erp ); if (NULL != tptr) { gra->out.pgf.n_images += (size_t)1U; if (0 != dk4sto_add(gra->out.pgf.s_images, tptr, erp)) { if (0 == dk4sto_add(gra->out.pgf.s_imagno, tptr, erp)) { tptr = NULL; } } else { dk4gra_pgf_img_close(tptr); } } } else { dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); } } if (NULL != tptr) { back = 1; /* begin pgfscope */ dk4gratool_stream_string( bptr->memstrm, dk4gra_pgf_img_kw[0], &back, erp ); /* pgftransformshift */ if ( (DK4_GRA_EPSILON_COORDINATES < fabs(cotra[0])) || (DK4_GRA_EPSILON_COORDINATES < fabs(cotra[1])) ) { dk4gratool_stream_string( bptr->memstrm, dk4gra_pgf_img_kw[2], &back, erp ); dk4gratool_stream_double(bptr->memstrm, cotra[0], &back, erp); dk4gratool_stream_string( bptr->memstrm, dk4gra_pgf_img_kw[3], &back, erp ); dk4gratool_stream_double(bptr->memstrm, cotra[1], &back, erp); dk4gratool_stream_string( bptr->memstrm, dk4gra_pgf_img_kw[4], &back, erp ); } /* pgftransformrotate */ if (DK4_GRA_EPSILON_COORDINATES < fabs(cotra[2])) { dk4gratool_stream_string( bptr->memstrm, dk4gra_pgf_img_kw[5], &back, erp ); dk4gratool_stream_double(bptr->memstrm, cotra[2], &back, erp); dk4gratool_stream_string( bptr->memstrm, dk4gra_pgf_img_kw[6], &back, erp ); } /* pgftransformxscale */ if (DK4_GRA_EPSILON_COORDINATES < fabs(cotra[3] - 1.0)) { dk4gratool_stream_string( bptr->memstrm, dk4gra_pgf_img_kw[7], &back, erp ); dk4gratool_stream_double(bptr->memstrm, cotra[3], &back, erp); dk4gratool_stream_string( bptr->memstrm, dk4gra_pgf_img_kw[9], &back, erp ); } /* pgftransformyscale */ if (DK4_GRA_EPSILON_COORDINATES < fabs(cotra[4] - 1.0)) { dk4gratool_stream_string( bptr->memstrm, dk4gra_pgf_img_kw[8], &back, erp ); dk4gratool_stream_double(bptr->memstrm, cotra[4], &back, erp); dk4gratool_stream_string( bptr->memstrm, dk4gra_pgf_img_kw[9], &back, erp ); } /* show image */ dk4gratool_stream_string( bptr->memstrm, dk4gra_pgf_img_kw[10], &back, erp ); dk4gratool_stream_num_alpha(bptr->memstrm, tptr->imgno, &back, erp); dk4gratool_stream_string( bptr->memstrm, dk4gra_pgf_img_kw[11], &back, erp ); /* end pgfscope */ dk4gratool_stream_string( bptr->memstrm, dk4gra_pgf_img_kw[1], &back, erp ); } finished: $? "- dk4gra_pgf_bif_fig_image %d", back return back; } /* vim: set ai sw=4 ts=4 : */