/* Copyright (C) 2017-2020, 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: dk4grpdi.ctr */ /** @file dk4grpdi.c The dk4grpdi module. */ #line 9 "dk4grpdi.ctr" #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 DK4MEM_H_INCLUDED #include "dk4mem.h" #endif #ifndef DK4GRA_H_INCLUDED #include "dk4gra.h" #endif #ifndef GRA_H_INCLUDED #include "gra.h" #endif #ifndef DK4BIF_H_INCLUDED #include "dk4bif.h" #endif #ifndef BIF_H_INCLUDED #include "bif.h" #endif #ifndef DK4BIFA_H_INCLUDED #include "dk4bifa.h" #endif #ifndef DK4UFI_H_INCLUDED #include "dk4ufi.h" #endif #ifndef DK4MAO8D_H_INCLUDED #include "dk4mao8d.h" #endif #ifndef DK4STRD_H_INCLUDED #include "dk4strd.h" #endif #ifndef DK4FOPD_H_INCLUDED #include "dk4fopd.h" #endif #ifndef DK4STRM_H_INCLUDED #include "dk4strm.h" #endif #ifndef DK4STRMCO_H_INCLUDED #include "dk4strmco.h" #endif #ifndef DK4BITSH_H_INCLUDED #include "dk4bitsh.h" #endif #ifndef DK4EDSTM_H_INCLUDED #include "dk4edstm.h" #endif #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #line 89 "dk4grpdi.ctr" /** Text fragments to write background color. */ static const char * const dk4gra_pdfi_kw[] = { /* 0 */ " ", /* 1 */ "g", /* 2 */ "rg", /* 3 */ "k", /* 4 */ " 0 0 m 0 1 l 1 1 l 1 0 l h f\n", NULL #line 111 "dk4grpdi.ctr" }; /** Write instruction to fill rectangle (0,0)--(0,1)--(1,1)--(1,0)--closepath. @param os Output stream (memory buffer stream). @param colval Color components array. @param ncolval Number of color components. @param fii Fill color instruction index. @param backptr Address of success variable to reset on error. @param erp Error report, may be NULL. */ static void dk4gra_pdf_fill_rectangle( dk4_stream_t *os, double *colval, size_t ncolval, size_t fii, int *backptr, dk4_er_t *erp ) { size_t i; for (i = 0; i < ncolval; i++) { dk4gratool_stream_double(os, colval[i], backptr, erp); dk4gratool_stream_string(os, dk4gra_pdfi_kw[0], backptr, erp); } dk4gratool_stream_string(os, dk4gra_pdfi_kw[fii], backptr, erp); dk4gratool_stream_string(os, dk4gra_pdfi_kw[4], backptr, erp); } /** Setup text XObject for a given image. Note: No dynamic memory is used here, a pointer to the original fn is stored in the XObject. @param xo XObject to fill with data. @param gra Graphics output structure. @param bif Bitmap image file. @param fn Bitmap image file name. @param fno Frame number in bitmap image file. @param ipol Flag: Allow interpolation. @param ajpg Flag: Allow direct re-use of DCT encoded data from JPEG. @param ijpg Flag: Allow interpolation for DCT encoded data. @param anb Flag: Analyze bit depth. @param anc Flag: Analyze colors. @param ana Flag: Analyze alpha channel use. @param erp Error report, may be NULL. */ static void dk4gra_pdf_xo_setup( dk4_gra_pdf_img_xo_t *xo, dk4_gra_t *gra, dk4_bif_t *bif, const dkChar *fn, size_t fno, int ipol, int ajpg, int ijpg, int acol, int anb, int anc, int ana, dk4_er_t *erp ) { dk4_bif_jpeg_per_frame_t *pjpgf; #line 183 "dk4grpdi.ctr" dk4mem_reset(xo, sizeof(dk4_gra_pdf_img_xo_t), NULL); xo->fn = NULL; xo->i_mb = NULL; xo->m_mb = NULL; xo->fno = 0; xo->objno = 0; xo->mobjno = 0; xo->unxon = 0; xo->width = 0; xo->height = 0; xo->dct = 0; xo->ipol = 0; xo->cs = 0; #line 196 "dk4grpdi.ctr" xo->hufi = 0; xo->deci = 0; xo->bpc = 0; xo->fn = fn; if (NULL == fn) { xo->unxon = gra->out.pdf.unxo; gra->out.pdf.unxo = gra->out.pdf.unxo + 1; } xo->fno = fno; xo->objno = gra->out.pdf.nextobj; xo->width = dk4bif_get_width(bif); xo->height = dk4bif_get_height(bif); if ((DK4_BIF_TYPE_JPEG == bif->imgtype) && (0 != ajpg)) { #line 210 "dk4grpdi.ctr" xo->dct = 1; xo->ipol = (((0 != ipol) && (0 != ijpg)) ? (1) : (0)); xo->cs = dk4bif_get_color_space(bif); xo->bpc = dk4bif_get_original_bit_depth(bif); pjpgf = (dk4_bif_jpeg_per_frame_t *)(bif->cf->tsdata); if (NULL != pjpgf) { if ((DK4_CS_CMYK == xo->cs) && (0 != pjpgf->is_adobe)) { xo->deci = 1; } } #line 221 "dk4grpdi.ctr" #line 222 "dk4grpdi.ctr" } else { #line 225 "dk4grpdi.ctr" xo->ipol = ipol; if (0 == dk4bif_analyze( &(xo->cs), &(xo->bpc), bif, anb, anc, ana, erp ) ) { #line 230 "dk4grpdi.ctr" xo->cs = dk4bif_get_color_space(bif); xo->bpc = dk4bif_get_original_bit_depth(bif); } #line 234 "dk4grpdi.ctr" #line 235 "dk4grpdi.ctr" #line 236 "dk4grpdi.ctr" if (0 == acol) { switch (xo->cs) { case DK4_CS_RGB : case DK4_CS_CMYK : { xo->cs = DK4_CS_GRAY; #line 240 "dk4grpdi.ctr" } break; case DK4_CS_RGB_ALPHA : { xo->cs = DK4_CS_GRAY_ALPHA; #line 243 "dk4grpdi.ctr" } break; } } #line 247 "dk4grpdi.ctr" #line 248 "dk4grpdi.ctr" #line 249 "dk4grpdi.ctr" } if (8 < xo->bpc) { xo->bpc = 8; #line 252 "dk4grpdi.ctr" } if (NULL != fn) { xo->hufi = dk4ufi_get(&(xo->ufi), fn, erp); #if TRACE_DEBUG if (0 != xo->hufi) { #line 258 "dk4grpdi.ctr" #line 259 "dk4grpdi.ctr" } #endif } #line 263 "dk4grpdi.ctr" #line 264 "dk4grpdi.ctr" #line 265 "dk4grpdi.ctr" #line 266 "dk4grpdi.ctr" #line 267 "dk4grpdi.ctr" #line 268 "dk4grpdi.ctr" #line 269 "dk4grpdi.ctr" #line 270 "dk4grpdi.ctr" #line 271 "dk4grpdi.ctr" #line 272 "dk4grpdi.ctr" #line 273 "dk4grpdi.ctr" #line 274 "dk4grpdi.ctr" } /** Add image data to i_mb component of xo, directly transfer DCT encoded data from JPEG file. @param xo XObject to fill with data. @param gra Graphics output structure. @param curpg Current page. @param bif Bitmap image file. @param fn Bitmap image file name. @param fno Frame number in bitmap image file. @param ipol Flag: Allow interpolation. @param ajpg Flag: Allow direct re-use of DCT encoded data from JPEG. @param ijpg Flag: Allow interpolation for DCT encoded data. @param anb Flag: Analyze bit depth. @param anc Flag: Analyze colors. @param ana Flag: Analyze alpha channel use. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ static int dk4gra_pdf_add_jpeg_data( dk4_gra_pdf_img_xo_t *xo, dk4_er_t *erp ) { char mybuf[128]; FILE *fipo = NULL; char *bptr = mybuf; char *aptr = NULL; size_t szbptr = sizeof(mybuf); size_t rdb; int fotest = DK4_FOPEN_SC_IS_REGULAR; int back = 0; int cc = 0; #line 312 "dk4grpdi.ctr" /* Attempt to allocate a larger buffer dynamically */ aptr = (char *)calloc(4096,1); if (NULL != aptr) { bptr = aptr; szbptr = 4096; } fipo = dk4fopen(xo->fn, dkT("rb"), fotest, erp); if (NULL == fipo) { #line 321 "dk4grpdi.ctr" goto finished; } do { cc = 0; rdb = fread(bptr, 1, szbptr, fipo); #line 326 "dk4grpdi.ctr" if (0 < rdb) { cc = 1; if (1 != dk4membuf_store(xo->i_mb, bptr, rdb, erp)) { #line 330 "dk4grpdi.ctr" cc = -1; } } } while (1 == cc); if (0 == cc) { back = 1; } #if TRACE_DEBUG #if 0 if (0 != dk4membuf_size(&rdb, curpg->membuf, NULL)) { #line 340 "dk4grpdi.ctr" } else { #line 343 "dk4grpdi.ctr" } #endif #endif finished: if (NULL != aptr) { dk4mem_free(aptr); } if (NULL != fipo) { fclose(fipo); } #line 351 "dk4grpdi.ctr" return back; } /** Add image data to i_mb component of xo, use dk4_bif_t methods to access pixel data. @param xo XObject to fill with data. @param gra Graphics output structure. @param bptr Current page. @param bif Bitmap image file. @param fn Bitmap image file name. @param fno Frame number in bitmap image file. @param ipol Flag: Allow interpolation. @param ajpg Flag: Allow direct re-use of DCT encoded data from JPEG. @param ijpg Flag: Allow interpolation for DCT encoded data. @param anb Flag: Analyze bit depth. @param anc Flag: Analyze colors. @param ana Flag: Analyze alpha channel use. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ static int dk4gra_pdf_add_bif_data( dk4_gra_pdf_img_xo_t *xo, dk4_bif_t *bif, dk4_er_t *erp ) { dk4_px_t pix[8]; dk4_bit_shift_t bs; dk4_stream_t *mbstrm = NULL; dk4_stream_t *costrm = NULL; size_t nco = 1; size_t y = 0; size_t x = 0; size_t i = 0; int back = 0; unsigned char uc = 0; #line 393 "dk4grpdi.ctr" /* Open streams to write compressed data to memory buffer */ mbstrm = dk4stream_open_membuf_writer(xo->i_mb, erp); if (NULL == mbstrm) { #line 397 "dk4grpdi.ctr" goto finished; } costrm = dk4strmco_open( mbstrm, DK4_STRMCO_PP_NONE, DK4_STRMCO_CO_FLATE, DK4_STRMCO_OE_NONE, 0, erp ); if (NULL == costrm) { #line 404 "dk4grpdi.ctr" goto finished; } /* Find color space size */ #line 410 "dk4grpdi.ctr" nco = dk4cs_color_space_size(xo->cs); #line 412 "dk4grpdi.ctr" if ((DK4_CS_GRAY_ALPHA == xo->cs) || (DK4_CS_RGB_ALPHA == xo->cs)) { nco--; } #line 416 "dk4grpdi.ctr" back = 1; dk4bif_set_output_bit_depth(bif, xo->bpc); if (8 == xo->bpc) { for (y = 0; y < (size_t)(xo->height); y++) { for (x = 0; x < (size_t)(xo->width); x++) { if ( 0 == dk4bif_get_pixel( pix, 8, bif, (dk4_bif_dim_t)y, (dk4_bif_dim_t)x, xo->cs ) ) { back = 0; #line 430 "dk4grpdi.ctr" } for (i = 0; i < nco; i++) { if (0 == dk4stream_write_byte(costrm,(char)(pix[i]),erp)) { back = 0; #line 434 "dk4grpdi.ctr" } } } } } else { for (y = 0; y < (size_t)(xo->height); y++) { dk4bit_shift_init(&bs, erp); for (x = 0; x < (size_t)(xo->width); x++) { if ( 0 == dk4bif_get_pixel( pix, 8, bif, (dk4_bif_dim_t)y, (dk4_bif_dim_t)x, xo->cs ) ) { back = 0; #line 450 "dk4grpdi.ctr" } for (i = 0; i < nco; i++) { dk4gratool_put_pixel_value( costrm, &bs, pix[i], xo->bpc, &back, erp ); } } switch (dk4bit_shift_finish(&bs, erp)) { case DK4_EDSTM_FINISHED : { uc = dk4bit_shift_output(&bs, erp); if (0 == dk4stream_write_byte(costrm, (char)uc, erp)) { back = 0; #line 462 "dk4grpdi.ctr" } } break; case DK4_EDSTM_ERROR : { back = 0; } break; } } } /* Cleanup */ finished: if (NULL != costrm) { if (0 == dk4stream_close(costrm, erp)) { #line 477 "dk4grpdi.ctr" back = 0; } } if (NULL != mbstrm) { if (0 == dk4stream_close(mbstrm, erp)) { #line 482 "dk4grpdi.ctr" back = 0; } } #line 486 "dk4grpdi.ctr" return back; } /** Add image data to xo. to obtain image data. @param xo XObject to fill with data. @param gra Graphics output structure. @param bptr Current page. @param bif Bitmap image file. @param fn Bitmap image file name. @param fno Frame number in bitmap image file. @param ipol Flag: Allow interpolation. @param ajpg Flag: Allow direct re-use of DCT encoded data from JPEG. @param ijpg Flag: Allow interpolation for DCT encoded data. @param anb Flag: Analyze bit depth. @param anc Flag: Analyze colors. @param ana Flag: Analyze alpha channel use. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ static int dk4gra_pdf_add_image_data( dk4_gra_pdf_img_xo_t *xo, dk4_bif_t *bif, int ajpg, dk4_er_t *erp ) { int back = 0; #line 519 "dk4grpdi.ctr" if ((DK4_BIF_TYPE_JPEG == bif->imgtype) && (0 != ajpg)) { #line 521 "dk4grpdi.ctr" back = dk4gra_pdf_add_jpeg_data(xo, erp); } else { #line 525 "dk4grpdi.ctr" back = dk4gra_pdf_add_bif_data(xo, bif, erp); } #line 528 "dk4grpdi.ctr" return back; } /** Add image mask data to m_mb component of xo. @param xo XObject to fill with data. @param gra Graphics output structure. @param bptr Current page. @param bif Bitmap image file. @param fn Bitmap image file name. @param fno Frame number in bitmap image file. @param ipol Flag: Allow interpolation. @param ajpg Flag: Allow direct re-use of DCT encoded data from JPEG. @param ijpg Flag: Allow interpolation for DCT encoded data. @param anb Flag: Analyze bit depth. @param anc Flag: Analyze colors. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ static int dk4gra_pdf_add_image_mask( dk4_gra_pdf_img_xo_t *xo, dk4_bif_t *bif, dk4_er_t *erp ) { dk4_px_t pix[8]; dk4_bit_shift_t bs; dk4_stream_t *mbstrm = NULL; dk4_stream_t *costrm = NULL; size_t y; size_t x; size_t numco; int back = 0; unsigned char uc; #line 566 "dk4grpdi.ctr" /* Open streams to write compressed data to memory buffer */ mbstrm = dk4stream_open_membuf_writer(xo->m_mb, erp); if (NULL == mbstrm) { #line 570 "dk4grpdi.ctr" goto finished; } costrm = dk4strmco_open( mbstrm, DK4_STRMCO_PP_NONE, DK4_STRMCO_CO_FLATE, DK4_STRMCO_OE_NONE, 0, erp ); if (NULL == costrm) { #line 577 "dk4grpdi.ctr" goto finished; } /* Success so far */ back = 1; numco = dk4cs_color_space_size(xo->cs); numco--; if (8 == xo->bpc) { for (y = 0; y < (size_t)(xo->height); y++) { for (x = 0; x < (size_t)(xo->width); x++) { if ( 0 == dk4bif_get_pixel( pix, 8, bif, (dk4_bif_dim_t)y, (dk4_bif_dim_t)x, xo->cs ) ) { back = 0; #line 596 "dk4grpdi.ctr" } uc = (unsigned char)(pix[numco]); if (0 == dk4stream_write_byte(costrm, (char)uc, erp)) { back = 0; #line 600 "dk4grpdi.ctr" } } } } else { for (y = 0; y < (size_t)(xo->height); y++) { dk4bit_shift_init(&bs, erp); for (x = 0; x < (size_t)(xo->width); x++) { if ( 0 == dk4bif_get_pixel( pix, 8, bif, (dk4_bif_dim_t)y, (dk4_bif_dim_t)x, xo->cs ) ) { back = 0; #line 615 "dk4grpdi.ctr" } dk4gratool_put_pixel_value( costrm, &bs, pix[numco], xo->bpc, &back, erp ); } switch (dk4bit_shift_finish(&bs, erp)) { case DK4_EDSTM_FINISHED : { uc = dk4bit_shift_output(&bs, erp); if (0 == dk4stream_write_byte(costrm, (char)uc, erp)) { back = 0; #line 625 "dk4grpdi.ctr" } } break; case DK4_EDSTM_ERROR : { back = 0; } break; } } } /* Clean up before returning */ finished: if (NULL != costrm) { if (0 == dk4stream_close(costrm, erp)) { #line 639 "dk4grpdi.ctr" back = 0; } } if (NULL != mbstrm) { if (0 == dk4stream_close(mbstrm, erp)) { #line 644 "dk4grpdi.ctr" back = 0; } } #line 648 "dk4grpdi.ctr" return back; } /** create a new object. @param xo Source XObject. @param gra Graphics output structure. @param bptr Current page. @param bif Bitmap image file. @param fn Bitmap image file name. @param fno Frame number in bitmap image file. @param ipol Flag: Allow interpolation. @param ajpg Flag: Allow direct re-use of DCT encoded data from JPEG. @param ijpg Flag: Allow interpolation for DCT encoded data. @param anb Flag: Analyze bit depth. @param anc Flag: Analyze colors. @param ana Flag: Analyze alpha channel use. @param erp Error report, may be NULL. @return Valid pointer to new XObject, NULL on error. */ static dk4_gra_pdf_img_xo_t * dk4gra_pdf_xo_create( dk4_gra_pdf_img_xo_t *xo, dk4_gra_t *gra, dk4_bif_t *bif, int ajpg, dk4_er_t *erp ) { dk4_gra_pdf_img_xo_t *back = NULL; int ok = 0; #line 684 "dk4grpdi.ctr" /* Allocate memory */ back = dk4mem_new(dk4_gra_pdf_img_xo_t,1,erp); if (NULL == back) { #line 688 "dk4grpdi.ctr" goto finished; } /* Copy existing information */ dk4mem_cpy(back, xo, sizeof(dk4_gra_pdf_img_xo_t), NULL); /* Create own copy of file name */ if (NULL != xo->fn) { back->fn = dk4str_dup(xo->fn, erp); if (NULL == back->fn) { #line 700 "dk4grpdi.ctr" goto finished; } } else { back->fn = NULL; } /* Open memory buffers */ #line 710 "dk4grpdi.ctr" back->i_mb = dk4membuf_open(erp); if (NULL == back->i_mb) { #line 712 "dk4grpdi.ctr" goto finished; } if ((DK4_CS_GRAY_ALPHA == xo->cs) || (DK4_CS_RGB_ALPHA == xo->cs)) { back->m_mb = dk4membuf_open(erp); if (NULL == back->m_mb) { #line 717 "dk4grpdi.ctr" goto finished; } } ok = dk4gra_pdf_add_image_data( back, bif, ajpg, erp ); if (0 != ok) { #line 724 "dk4grpdi.ctr" if ((DK4_CS_GRAY_ALPHA == xo->cs) || (DK4_CS_RGB_ALPHA == xo->cs)) { ok = dk4gra_pdf_add_image_mask(back,bif,erp); #if TRACE_DEBUG if (0 == ok) { #line 728 "dk4grpdi.ctr" } #endif } } if (0 != ok) { if (0 == dk4sto_add(gra->out.pdf.s_images, back, erp)) { ok = 0; #line 735 "dk4grpdi.ctr" } else { if (0 == dk4sto_add(gra->out.pdf.s_imagno, back, erp)) { ok = 0; #line 739 "dk4grpdi.ctr" } } } #if TRACE_DEBUG else { #line 744 "dk4grpdi.ctr" } #endif finished: /* Clean up and return NULL on errors */ if ((NULL != back) && (0 == ok)) { /* Delete XObject */ dk4gra_pdf_xo_delete(back); back = NULL; } /* If we have a new object, correct next object number in gra */ if (NULL != back) { gra->out.pdf.nextobj += 1; if (NULL != back->m_mb) { back->mobjno = gra->out.pdf.nextobj; gra->out.pdf.nextobj += 1; } } #line 768 "dk4grpdi.ctr" return back; } /** Find object or create a new one. @param xo XObject to fill with data. @param gra Graphics output structure. @param bptr Current page. @param bif Bitmap image file. @param fn Bitmap image file name. @param fno Frame number in bitmap image file. @param ipol Flag: Allow interpolation. @param ajpg Flag: Allow direct re-use of DCT encoded data from JPEG. @param ijpg Flag: Allow interpolation for DCT encoded data. @param anb Flag: Analyze bit depth. @param anc Flag: Analyze colors. @param ana Flag: Analyze alpha channel use. @param erp Error report, may be NULL. @return Valid pointer to found or new XObject, NULL on error. */ static dk4_gra_pdf_img_xo_t * dk4gra_pdf_find_or_create( dk4_gra_pdf_img_xo_t *xo, dk4_gra_t *gra, dk4_bif_t *bif, int ajpg, dk4_er_t *erp ) { dk4_gra_pdf_img_xo_t *back = NULL; #line 802 "dk4grpdi.ctr" back = (dk4_gra_pdf_img_xo_t *)dk4sto_it_find_like( gra->out.pdf.i_images, xo, 0 ); if (NULL == back) { #line 806 "dk4grpdi.ctr" back = dk4gra_pdf_xo_create(xo, gra, bif, ajpg, erp); } #if TRACE_DEBUG else { #line 810 "dk4grpdi.ctr" } #endif #line 813 "dk4grpdi.ctr" return back; } /** Register XObject for use on page (add to the pages container of used XObjects if not yet present). @param bptr Current page. @param xo XObject to use on page. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ static int dk4gra_pdf_register_xo_for_page( dk4_gra_pdf_page_t *bptr, dk4_gra_pdf_img_xo_t *xo, dk4_er_t *erp ) { int back = 0; #line 835 "dk4grpdi.ctr" if (NULL == bptr->s_uxo) { bptr->s_uxo = dk4sto_open(erp); if (NULL == bptr->s_uxo) { #line 838 "dk4grpdi.ctr" goto finished; } dk4sto_set_comp(bptr->s_uxo, dk4gra_pdf_compare_used_xo, 0); } if (NULL == bptr->i_uxo) { bptr->i_uxo = dk4sto_it_open(bptr->s_uxo, erp); if (NULL == bptr->i_uxo) { #line 845 "dk4grpdi.ctr" goto finished; } } if (NULL != dk4sto_it_find_like(bptr->i_uxo, xo, 0)) { back = 1; #line 850 "dk4grpdi.ctr" } else { if (0 != dk4sto_add(bptr->s_uxo, xo, erp)) { back = 1; #line 854 "dk4grpdi.ctr" } #if TRACE_DEBUG else { #line 857 "dk4grpdi.ctr" } #endif } finished: #line 862 "dk4grpdi.ctr" return back; } int dk4gra_pdf_bif_fig_image( dk4_gra_t *gra, double *cotra, dk4_bif_t *bif, const dkChar *fn, size_t fno, int ifl, dk4_er_t *erp ) { dk4_gra_pdf_img_xo_t testxo; dk4_gra_pdf_img_xo_t *xo; dk4_gra_pdf_page_t *bptr; double cm[6]; dk4_px_t gbg[4]; double cosphi; double sinphi; size_t i; int back = 0; #line 888 "dk4grpdi.ctr" #if DK4_USE_ASSERT assert(NULL != gra); assert(NULL != cotra); assert(NULL != bif); assert(NULL != fn); #endif #line 895 "dk4grpdi.ctr" #line 896 "dk4grpdi.ctr" #line 897 "dk4grpdi.ctr" #line 898 "dk4grpdi.ctr" #line 899 "dk4grpdi.ctr" #line 900 "dk4grpdi.ctr" #line 901 "dk4grpdi.ctr" #line 902 "dk4grpdi.ctr" #line 903 "dk4grpdi.ctr" bptr = (dk4_gra_pdf_page_t *)(gra->curpg); if (NULL == bptr->outstrm) { #line 905 "dk4grpdi.ctr" dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); goto finished; } if (0 == (DK4_GRA_IMG_FLAG_COLOR & ifl)) { #line 909 "dk4grpdi.ctr" if (DK4_CS_GRAY != dk4bif_get_color_space(bif)) { #line 910 "dk4grpdi.ctr" if (DK4_CS_GRAY_ALPHA != dk4bif_get_color_space(bif)) { ifl &= (~(DK4_GRA_IMG_FLAG_DCT)); #line 912 "dk4grpdi.ctr" } } } #line 916 "dk4grpdi.ctr" dk4gra_pdf_xo_setup( &testxo, gra, bif, fn, fno, ((0 != (DK4_GRA_IMG_FLAG_INTERPOLATION & ifl)) ? (1) : (0)), ((0 != (DK4_GRA_IMG_FLAG_DCT & ifl)) ? (1) : (0)), ((0 != (DK4_GRA_IMG_FLAG_DCT_INTERPOLATION & ifl)) ? (1) : (0)), ((0 != (DK4_GRA_IMG_FLAG_COLOR & ifl)) ? (1) : (0)), ((0 != (DK4_GRA_IMG_FLAG_ANALYZE_BPC & ifl)) ? (1) : (0)), ((0 != (DK4_GRA_IMG_FLAG_ANALYZE_COLOR & ifl)) ? (1) : (0)), ((0 != (DK4_GRA_IMG_FLAG_ANALYZE_ALPHA & ifl)) ? (1) : (0)), erp ); xo = dk4gra_pdf_find_or_create( &testxo, gra, bif, ((0 != (DK4_GRA_IMG_FLAG_DCT & ifl)) ? (1) : (0)), erp ); if (NULL != xo) { #line 933 "dk4grpdi.ctr" if (0 != dk4gra_pdf_register_xo_for_page(bptr, xo, erp)) { #line 935 "dk4grpdi.ctr" back = 1; dk4gra_pdf_save_attributes(gra); dk4gra_i_gsave(gra, &back, erp); #if 1 /* One CTM for combined translate, rotate and scale */ for (i = 0; i < sizeof(cm)/sizeof(double); i++) { cm[i] = 0.0; } cosphi = cos((M_PI * cotra[2]) / 180.0); sinphi = sin((M_PI * cotra[2]) / 180.0); cm[0] = cotra[3] * cosphi; cm[1] = cotra[3] * sinphi; cm[2] = 0.0 - cotra[4] * sinphi; cm[3] = cotra[4] * cosphi; if ( (DK4_GRA_EPSILON_COORDINATES < fabs(cotra[0])) || (DK4_GRA_EPSILON_COORDINATES < fabs(cotra[1])) ) { cm[4] = cotra[0]; cm[5] = cotra[1]; } dk4gra_pdf_i_values_and_kw(bptr->outstrm, cm, 6, 70, &back, erp); #else /* Old code - no longer used - performing multiple CTM changes for a sequence of translate, rotate, and scale operations */ #line 963 "dk4grpdi.ctr" /* translate */ if ( (DK4_GRA_EPSILON_COORDINATES < fabs(cotra[0])) || (DK4_GRA_EPSILON_COORDINATES < fabs(cotra[1])) ) { for (i = 0; i < sizeof(cm)/sizeof(double); i++) { cm[i] = 0.0; } cm[0] = 1.0; cm[3] = 1.0; cm[4] = cotra[0]; cm[5] = cotra[1]; dk4gra_pdf_i_values_and_kw(bptr->outstrm,cm,6,70,&back,erp); } /* rotate */ if (DK4_GRA_EPSILON_COORDINATES < fabs(cotra[2])) { for (i = 0; i < sizeof(cm)/sizeof(double); i++) { cm[i] = 0.0; } cm[0] = cosphi; cm[1] = sinphi; cm[2] = 0.0 - sinphi; cm[3] = cosphi; dk4gra_pdf_i_values_and_kw(bptr->outstrm,cm,6,70,&back, erp); } /* scale */ for (i = 0; i < sizeof(cm)/sizeof(double); i++) { cm[i] = 0.0; } cm[0] = cotra[3]; cm[3] = cotra[4]; dk4gra_pdf_i_values_and_kw(bptr->outstrm, cm, 6, 70, &back, erp); #endif /* Fill image background with background color if required */ if (0 != (DK4_GRA_IMG_FLAG_FILL_BACKGROUND & ifl)) { #line 995 "dk4grpdi.ctr" switch (bif->cf->l_cs) { case DK4_CS_RGB_ALPHA : { if (0 != (DK4_GRA_IMG_FLAG_COLOR & ifl)) { #line 999 "dk4grpdi.ctr" for (i = 0; i < 3; i++) { cm[i] = ((double)(bif->cf->bglbd[i])) / ((double)dk4pxbit_get_max(bif->cf->l_bdepth)); if (0.0 > cm[i]) { cm[i] = 0.0; } if (1.0 < cm[i]) { cm[i] = 1.0; } } dk4gra_pdf_fill_rectangle( bptr->outstrm, cm, 3, 2, &back, erp ); } else { dk4cs_px_convert( gbg, DK4_CS_GRAY, DK4_SIZEOF(gbg,dk4_px_t), &(bif->cf->bglbd[0]), DK4_CS_RGB, 3, NULL, 0, dk4pxbit_get_max(bif->cf->l_bdepth), &(bif->cs_ctx), erp ); for (i = 0; i < 1; i++) { cm[i] = ((double)(gbg[i])) / ((double)dk4pxbit_get_max(bif->cf->l_bdepth)); if (0.0 > cm[i]) { cm[i] = 0.0; } if (1.0 < cm[i]) { cm[i] = 1.0; } } dk4gra_pdf_fill_rectangle( bptr->outstrm, cm, 1, 1, &back, erp ); } } break; case DK4_CS_GRAY_ALPHA : { #line 1030 "dk4grpdi.ctr" for (i = 0; i < 1; i++) { cm[i] = ((double)(bif->cf->bglbd[i])) / ((double)dk4pxbit_get_max(bif->cf->l_bdepth)); if (0.0 > cm[i]) { cm[i] = 0.0; } if (1.0 < cm[i]) { cm[i] = 1.0; } } dk4gra_pdf_fill_rectangle( bptr->outstrm, cm, 1, 1, &back, erp ); } break; } } /* Write Do operator to stream */ /* /X */ dk4gra_pdf_i_outstream_kw(bptr->outstrm, 71, &back, erp); /* number */ dk4gratool_stream_uint(bptr->outstrm, xo->objno, 0, &back, erp); /* space and Do */ dk4gra_pdf_i_outstream_kw(bptr->outstrm, 72, &back, erp); dk4gra_i_grestore(gra, 0, &back, erp); dk4gra_pdf_restore_attributes(gra); } #if TRACE_DEBUG else { #line 1057 "dk4grpdi.ctr" } #endif } #if TRACE_DEBUG else { #line 1062 "dk4grpdi.ctr" } #endif finished: #line 1067 "dk4grpdi.ctr" return back; } /* vim: set ai sw=4 ts=4 : */