/* 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: dk4bifj.ctr */ /** @file dk4bifj.c The dk4bifj module. */ #line 7 "dk4bifj.ctr" #include "dk4conf.h" #if DK4_HAVE_JPEGLIB_H #ifndef DK4MEM_H_INCLUDED #include "dk4mem.h" #endif #ifndef DK4MAASZ_H_INCLUDED #include "dk4maasz.h" #endif #ifndef DK4BIFTY_H_INCLUDED #include "dk4bifty.h" #endif #ifndef DK4BIF_H_INCLUDED #include "dk4bif.h" #endif #ifndef BIF_H_INCLUDED #include "bif.h" #endif #ifndef JPEGLIB_H_INCLUDED #include #define JPEGLIB_H_INCLUDED 1 #endif #if DK4_HAVE_SETJMP_H #ifndef SETJMP_H_INCLUDED #include #define SETJMP_H_INCLUDED 1 #endif #endif #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #line 53 "dk4bifj.ctr" /** Error manager for jpeglib. */ typedef struct { struct jpeg_error_mgr errmgr; /**< Default error manager. */ #if DK4_HAVE_SETJMP_H jmp_buf jump_buf; /**< Longjump buffer. */ #endif } dk4_bif_jpeg_error_mgr; /** Routine called instead of simple exit on failures. @param cinfo Object containing address of error manager. */ static void dk4bifjpb_error_exit(j_common_ptr cinfo) { dk4_bif_jpeg_error_mgr *errmgr; /* Error manager structure */ #line 76 "dk4bifj.ctr" errmgr = (dk4_bif_jpeg_error_mgr *)(cinfo->err); if (NULL != errmgr) { longjmp(errmgr->jump_buf, 1); } #line 81 "dk4bifj.ctr" } void dk4bifjpeg_nc_release_per_frame_data( void *tsdata, dk4_bif_frame_t *frptr ) { JSAMPLE **rptr; /* Array of row pointers */ dk4_bif_jpeg_per_frame_t *jfptr; /* Per-frame data */ JDIMENSION i; /* Traverse all lines */ #line 96 "dk4bifj.ctr" #if DK4_USE_ASSERT assert(NULL != tsdata); assert(NULL != frptr); #endif jfptr = (dk4_bif_jpeg_per_frame_t *)tsdata; if (NULL != jfptr) { rptr = jfptr->rows; if (NULL != rptr) { #line 104 "dk4bifj.ctr" for (i = 0; (dk4_bif_dim_t)i < frptr->dim_y; i++) { #line 106 "dk4bifj.ctr" if (NULL != *rptr) { dk4mem_free(*rptr); } rptr++; } #line 110 "dk4bifj.ctr" dk4mem_free(jfptr->rows); } #line 113 "dk4bifj.ctr" dk4mem_free(jfptr); } #line 116 "dk4bifj.ctr" } /** Transfer information from JPEG structures into BIF structures. @param bifp Bitmap image file to modify. @param pfd Per-frame data structure to modify. @param cinfo JPEG decompression structure (data source). @param sov Flag: Set output variables in cinfo. */ static void dk4bifjpeg_transfer_header_data( dk4_bif_t *bifp, dk4_bif_jpeg_per_frame_t *pfd, struct jpeg_decompress_struct *cinfo, int sov ) { #line 136 "dk4bifj.ctr" #if DK4_USE_ASSERT assert(NULL != bifp); assert(NULL != pfd); assert(NULL != cinfo); #endif bifp->cf->dim_x = cinfo->image_width; #line 143 "dk4bifj.ctr" bifp->cf->dim_y = cinfo->image_height; #line 145 "dk4bifj.ctr" bifp->cf->l_bdepth = BITS_IN_JSAMPLE; #line 147 "dk4bifj.ctr" bifp->cf->r_bdepth = BITS_IN_JSAMPLE; #line 149 "dk4bifj.ctr" #line 150 "dk4bifj.ctr" bifp->cf->bg[0] = MAXJSAMPLE; bifp->cf->bg[1] = MAXJSAMPLE; bifp->cf->bg[2] = MAXJSAMPLE; bifp->cf->bg[3] = MAXJSAMPLE; bifp->cf->bglbd[0] = MAXJSAMPLE; bifp->cf->bglbd[1] = MAXJSAMPLE; bifp->cf->bglbd[2] = MAXJSAMPLE; bifp->cf->bglbd[3] = MAXJSAMPLE; dk4pxres_setup(&(bifp->cf->resampler), MAXJSAMPLE, MAXJSAMPLE); bifp->cf->n_comp = cinfo->out_color_components; #line 161 "dk4bifj.ctr" bifp->cf->hbg = 0; bifp->cf->res_x = -1.0; bifp->cf->res_y = -1.0; if (0 != cinfo->saw_JFIF_marker) { if ((0 < cinfo->X_density) && (0 < cinfo->Y_density)) { bifp->cf->res_x = (double)(cinfo->X_density); bifp->cf->res_y = (double)(cinfo->Y_density); #line 169 "dk4bifj.ctr" #line 170 "dk4bifj.ctr" if (2 == cinfo->density_unit) { #line 171 "dk4bifj.ctr" bifp->cf->res_x *= 2.54; bifp->cf->res_y *= 2.54; #line 174 "dk4bifj.ctr" #line 175 "dk4bifj.ctr" } if (1 != cinfo->density_unit) { bifp->cf->res_x = -1.0; bifp->cf->res_y = -1.0; } } } switch (cinfo->jpeg_color_space) { case JCS_GRAYSCALE: { #line 184 "dk4bifj.ctr" bifp->cf->l_cs = DK4_CS_GRAY; bifp->cf->f_cs = DK4_CS_GRAY; if (0 != sov) { cinfo->out_color_space = JCS_GRAYSCALE; } } break; case JCS_CMYK: { #line 191 "dk4bifj.ctr" bifp->cf->l_cs = DK4_CS_CMYK; bifp->cf->f_cs = DK4_CS_CMYK; if (0 != sov) { cinfo->out_color_space = JCS_CMYK; } } break; /* 2018-03-20 If the library internal color space is JCS_YCCK or JCS_YCbCr the library functions to access pixel data deliver RGB values. So the default branch sets the color space to RGB. */ #if 0 case JCS_RGB: { #line 205 "dk4bifj.ctr" bifp->cf->l_cs = DK4_CS_RGB; bifp->cf->f_cs = DK4_CS_RGB; } break; case JCS_YCCK: { #line 209 "dk4bifj.ctr" bifp->cf->l_cs = DK4_CS_CMYK; bifp->cf->f_cs = DK4_CS_CMYK; } break; case JCS_YCbCr: { #line 213 "dk4bifj.ctr" bifp->cf->l_cs = DK4_CS_CMYK; bifp->cf->f_cs = DK4_CS_CMYK; } break; #endif default: { #line 218 "dk4bifj.ctr" bifp->cf->l_cs = DK4_CS_RGB; bifp->cf->f_cs = DK4_CS_RGB; if (0 != sov) { cinfo->out_color_space = JCS_RGB; } } break; } pfd->num_comp = cinfo->out_color_components; #line 227 "dk4bifj.ctr" pfd->is_adobe = ((0 != cinfo->saw_Adobe_marker) ? 1 : 0); #line 229 "dk4bifj.ctr" #line 230 "dk4bifj.ctr" } dk4_bif_t * dk4bifjpeg_nc_open_file( FILE *fipo, dkChar const *fn, int honly, dk4_cs_conv_ctx_t const *pcsctx, dk4_bif_jpg_clobbered_t *jpgcp, dk4_er_t *erp ) { struct jpeg_decompress_struct cinfo; /* Jpeglib reader */ dk4_bif_jpeg_error_mgr errmgr; /* Jpeglib error man */ dk4_er_t er; /* Error report */ JSAMPLE **xrptr = NULL; /* Travers rows */ dk4_bif_jpeg_per_frame_t *pfd = NULL; /* Per-frame data */ size_t bpl = 0; /* Bits per line */ size_t i = 0; /* Traverse rows */ #line 252 "dk4bifj.ctr" /* Create bif and frame for one-frame image */ jpgcp->back = dk4biftool_nc_new_for_one_frame( fn, DK4_BIF_TYPE_JPEG, honly, pcsctx, erp ); if (NULL == jpgcp->back) { goto finished; } #line 260 "dk4bifj.ctr" /* Allocate per-frame data structure */ pfd = dk4mem_new(dk4_bif_jpeg_per_frame_t,1,NULL); if (NULL == pfd) { goto finished; } (jpgcp->back->cf)->tsdata = pfd; #line 267 "dk4bifj.ctr" /* Initialize per-frame data structure components */ pfd->rows = NULL; pfd->num_comp = 0; pfd->is_adobe = 0; /* Set up error management */ cinfo.err = jpeg_std_error(&(errmgr.errmgr)); errmgr.errmgr.error_exit = dk4bifjpb_error_exit; #line 279 "dk4bifj.ctr" /* Code below calls setjmp on error */ if (0 != setjmp(errmgr.jump_buf)) { #line 283 "dk4bifj.ctr" dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); goto finished; } /* Create decompression structure */ jpgcp->st = 1; jpeg_create_decompress(&cinfo); #line 292 "dk4bifj.ctr" /* Specify data source */ jpeg_stdio_src(&cinfo, fipo); #line 297 "dk4bifj.ctr" /* Read JPEG header data */ jpeg_read_header(&cinfo, TRUE); #line 302 "dk4bifj.ctr" /* Transfer header data to bif structures. */ dk4bifjpeg_transfer_header_data(jpgcp->back, pfd, &cinfo, 1); #line 307 "dk4bifj.ctr" /* When reading just the header we are done here */ if (0 != honly) { jpgcp->ok = 1; #line 313 "dk4bifj.ctr" goto finished; } /* Start decompression */ jpeg_start_decompress(&cinfo); #line 320 "dk4bifj.ctr" /* Header data are now corrected if necessary, read information again */ dk4bifjpeg_transfer_header_data(jpgcp->back, pfd, &cinfo, 0); #line 325 "dk4bifj.ctr" /* Allocate memory for image data */ dk4error_init(&er); bpl = dk4ma_size_t_mul(jpgcp->back->cf->dim_x, jpgcp->back->cf->n_comp, &er); if (DK4_E_NONE != er.ec) { dk4error_copy(erp, &er); goto finished; } pfd->rows = dk4mem_new(JSAMPROW,jpgcp->back->cf->dim_y,erp); if (NULL == pfd->rows) { goto finished; } xrptr = pfd->rows; for (i = 0; i < (size_t)(jpgcp->back->cf->dim_y); i++) { *(xrptr++) = NULL; } xrptr = pfd->rows; for (i = 0; i < (size_t)(jpgcp->back->cf->dim_y); i++) { *xrptr = dk4mem_new(JSAMPLE,bpl,erp); if (NULL == *xrptr) { goto finished; } xrptr++; } #line 347 "dk4bifj.ctr" /* Read and decompress data */ xrptr = pfd->rows; for (i = 0; i < (size_t)(jpgcp->back->cf->dim_y); i++) { jpeg_read_scanlines(&cinfo, xrptr, 1); xrptr++; } #line 356 "dk4bifj.ctr" /* Finish decompression */ jpeg_finish_decompress(&cinfo); #line 361 "dk4bifj.ctr" /* Everything done, success */ jpgcp->ok = 1; finished: /* Destroy decompression structure */ if (0 < jpgcp->st) { jpeg_destroy_decompress(&cinfo); } if (0 == jpgcp->ok) { if (NULL != jpgcp->back) { dk4bif_close(jpgcp->back); jpgcp->back = NULL; } } #line 381 "dk4bifj.ctr" return jpgcp->back; } int dk4bifjpeg_nc_get_original_pixel( dk4_px_t *dptr, size_t szdptr, dk4_bif_t const *bif, dk4_bif_dim_t rowno, dk4_bif_dim_t colno ) { dk4_er_t er; /* Error report for math op */ dk4_bif_jpeg_per_frame_t *pfd = NULL; /* Per-frame data */ size_t spos; /* Number of values per row */ size_t i; /* Traverse all components */ int back = 0; #line 401 "dk4bifj.ctr" #if DK4_USE_ASSERT assert(NULL != dptr); assert(0 < szdptr); assert(NULL != bif); #endif pfd = (dk4_bif_jpeg_per_frame_t *)((bif->cf)->tsdata); if (NULL != pfd) { if (NULL != pfd->rows) { dk4error_init(&er); spos = dk4ma_size_t_mul(colno, pfd->num_comp, &er); (void)dk4ma_size_t_add(spos, pfd->num_comp, &er); if (DK4_E_NONE == er.ec) { if (szdptr >= pfd->num_comp) { for (i = 0; i < pfd->num_comp; i++) { dptr[i] = ((pfd->rows)[rowno])[spos + i]; } back = 1; } } } } #line 423 "dk4bifj.ctr" return back; } #endif /* if DK4_HAVE_JPEGLIB_H */ /* vim: set ai sw=4 ts=4 : */