/* 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: dk4bifn.ctr */ /** @file dk4bifn.c The dk4bifn module. */ #line 8 "dk4bifn.ctr" #include "dk4conf.h" #if DK4_HAVE_SYS_TYPES_H #ifndef SYS_TYPES_H_INCLUDED #include #define SYS_TYPES_H_INCLUDED1 #endif #endif #if DK4_HAVE_STDINT_H #ifndef STDINT_H_INCLUDED #include #define STDINT_H_INCLUDED 1 #endif #endif #if DK4_HAVE_LIMITS_H #ifndef LIMITS_H_INCLUDED #include #define LIMITS_H_INCLUDED 1 #endif #endif #ifndef DK4TYPES_H_INCLUDED #include "dk4types.h" #endif #ifndef DK4MEM_H_INCLUDED #include "dk4mem.h" #endif #ifndef DK4MAASZ_H_INCLUDED #include "dk4maasz.h" #endif #ifndef DK4STR8_H_INCLUDED #include "dk4str8.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 DK4MAI8DSZ_H_INCLUDED #include "dk4mai8dsz.h" #endif #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #line 70 "dk4bifn.ctr" /** Data to save between applying bytes. */ typedef struct { dk4_bif_t *bif; /**< The result. */ size_t nums[4]; /**< Width, height, maxval. */ int magnum; /**< Magic number. */ int tupt; /**< Tuple type for DK4_NETPBM_P7. */ } dk4_bif_netpbm_builder_t; /** Pointer to unsigned character. */ typedef unsigned char *dk4_puchar_t; static const char * const dk4netpbm_p7_kw[] = { /* 0 */ "WIDTH", /* 1 */ "HEIGHT", /* 2 */ "DEPTH", /* 3 */ "MAXVAL", /* 4 */ "TUPLTYPE", /* 5 */ "ENDHDR", NULL #line 117 "dk4bifn.ctr" }; /** Tuple types. */ static const char * const dk4netpbm_p7_tut[] = { /* 0 */ "BLACKANDWHITE", /* 1 */ "GRAYSCALE", /* 2 */ "RGB", /* 3 */ "BLACKANDWHITE_ALPHA", /* 4 */ "GRAYSCALE_ALPHA", /* 5 */ "RGB_ALPHA", NULL #line 132 "dk4bifn.ctr" }; void dk4bifnetpbm_nc_release_per_frame_data( void *tsdata ) { dk4_bif_netpbm_per_frame_t *pfd; /* Per-frame data */ size_t i; /* Traverse all rows */ #line 144 "dk4bifn.ctr" #if DK4_USE_ASSERT assert(NULL != tsdata); #endif if (NULL != tsdata) { pfd = (dk4_bif_netpbm_per_frame_t *)tsdata; if (NULL != pfd->rows) { #line 150 "dk4bifn.ctr" for (i = 0; i < (size_t)(pfd->h); i++) { #line 152 "dk4bifn.ctr" dk4mem_release((pfd->rows)[i]); } dk4mem_free(pfd->rows); } pfd->rows = NULL; #line 157 "dk4bifn.ctr" pfd->w = 0; #line 158 "dk4bifn.ctr" pfd->h = 0; #line 159 "dk4bifn.ctr" pfd->ch = 0; #line 160 "dk4bifn.ctr" pfd->bpr = 0; #line 161 "dk4bifn.ctr" pfd->tupt = 0; #line 162 "dk4bifn.ctr" pfd->maxval = 0; #line 163 "dk4bifn.ctr" pfd->bpc = 0; #line 164 "dk4bifn.ctr" pfd->magnum = 0; dk4mem_free(tsdata); } #line 168 "dk4bifn.ctr" } static int dk4_bif_netpbm_check_input( size_t w, size_t h, size_t maxval, dk4_er_t *erp ) { int back = 0; #line 183 "dk4bifn.ctr" #line 184 "dk4bifn.ctr" #line 185 "dk4bifn.ctr" #line 186 "dk4bifn.ctr" if ((0 < w) && (0 < h) && (0 < maxval)) { if ((dk4_um_t)(LONG_MAX) >= (dk4_um_t)w) { if ((dk4_um_t)(LONG_MAX) >= (dk4_um_t)h) { if ((dk4_um_t)(DK4_U16_MAX) >= (dk4_um_t)maxval) { back = 1; } } } } if (0 == back) { dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } #line 199 "dk4bifn.ctr" return back; } static dk4_bif_netpbm_per_frame_t * dk4bifnetpbm_tsdata_new( int magnum, int tupt, size_t ch, size_t w, size_t h, size_t maxval, dk4_er_t *erp ) { dk4_er_t er; /* Error report for math op */ dk4_bif_netpbm_per_frame_t *back = NULL; size_t i = 0; /* Traverse all rows */ int ok = 0; /* Flag: Success, no errors */ #line 221 "dk4bifn.ctr" if (0 != dk4_bif_netpbm_check_input(w, h, maxval, erp)) { back = dk4mem_new(dk4_bif_netpbm_per_frame_t,1,erp); if (NULL != back) { #line 224 "dk4bifn.ctr" dk4error_init(&er); back->rows = NULL; back->w = (dk4_bif_dim_t)w; #line 227 "dk4bifn.ctr" back->h = (dk4_bif_dim_t)h; #line 228 "dk4bifn.ctr" back->ch = 0; /* Number of channels */ back->vpr = 0; /* Values per row */ back->bpr = 0; /* Bytes per row */ back->magnum = magnum; #line 232 "dk4bifn.ctr" back->tupt = tupt; #line 233 "dk4bifn.ctr" back->maxval = (dk4_px_t)maxval; #line 234 "dk4bifn.ctr" back->bpc = (dk4_px_bit_depth_t)dk4pxbit_get_bitno((dk4_px_t)maxval); #line 236 "dk4bifn.ctr" switch (magnum) { case DK4_NETPBM_P1 : case DK4_NETPBM_P4 : { back->ch = 1; back->vpr = w; back->bpr = w / 8; if (0 != (w % 8)) { back->bpr += 1; } } break; case DK4_NETPBM_P2 : case DK4_NETPBM_P5 : { back->ch = 1; back->vpr = w; back->bpr = back->vpr; if (255 < maxval) { back->bpr = dk4ma_size_t_mul(2, back->vpr, &er); } } break; case DK4_NETPBM_P3 : case DK4_NETPBM_P6 : { back->ch = 3; back->vpr = dk4ma_size_t_mul(3, w, &er); back->bpr = back->vpr; if (255 < maxval) { back->bpr = dk4ma_size_t_mul(2, back->vpr, &er); } } break; case DK4_NETPBM_P7 : { switch (tupt) { case DK4_NETPBM_TT_BLACKANDWHITE : { back->ch = 1; back->vpr = w; back->bpr = w; } break; case DK4_NETPBM_TT_GRAYSCALE : { back->ch = 1; back->vpr = w; back->bpr = back->vpr; if (255 < maxval) { back->bpr = dk4ma_size_t_mul(2, back->vpr, &er); } } break; case DK4_NETPBM_TT_RGB : { back->ch = 3; back->vpr = dk4ma_size_t_mul(3, w, &er); back->bpr = back->vpr; if (255 < maxval) { back->bpr = dk4ma_size_t_mul(2, back->vpr, &er); } } break; case DK4_NETPBM_TT_BLACKANDWHITE_ALPHA : { back->ch = 2; back->vpr = dk4ma_size_t_mul(2, w, &er); back->bpr = back->vpr; } break; case DK4_NETPBM_TT_GRAYSCALE_ALPHA : { back->ch = 2; back->vpr = dk4ma_size_t_mul(2, w, &er); back->bpr = back->vpr; if (255 < maxval) { back->bpr = dk4ma_size_t_mul(2, back->vpr, &er); } } break; case DK4_NETPBM_TT_RGB_ALPHA : { back->ch = 4; back->vpr = dk4ma_size_t_mul(4, w, &er); back->bpr = back->vpr; if (255 < maxval) { back->bpr = dk4ma_size_t_mul(2, back->vpr, &er); } } break; default : { #line 304 "dk4bifn.ctr" back->ch = ch; back->vpr = dk4ma_size_t_mul(ch, w, &er); back->bpr = back->vpr; if (255 < maxval) { back->bpr = dk4ma_size_t_mul(2, back->vpr, &er); } } break; } } break; } (void)dk4ma_size_t_mul(h,sizeof(dk4_puchar_t),&er); if (DK4_E_NONE == er.ec) { #line 316 "dk4bifn.ctr" if (0 < back->bpr) { back->rows = dk4mem_new(dk4_puchar_t,h,erp); if (NULL != back->rows) { #line 319 "dk4bifn.ctr" for (i = 0; i < h; i++) { (back->rows)[i] = NULL; } ok = 1; for (i = 0; i < h; i++) { (back->rows)[i] = dk4mem_new(unsigned char,back->bpr,erp); if (NULL != (back->rows)[i]) { DK4_MEMRES((back->rows)[i],back->bpr); #line 327 "dk4bifn.ctr" } else { #line 329 "dk4bifn.ctr" ok = 0; } } } } } else { #line 336 "dk4bifn.ctr" dk4error_copy(erp, &er); } if (0 == ok) { #line 339 "dk4bifn.ctr" dk4bifnetpbm_nc_release_per_frame_data(back); back = NULL; } #if TRACE_DEBUG else { #line 345 "dk4bifn.ctr" #line 346 "dk4bifn.ctr" #line 347 "dk4bifn.ctr" #line 348 "dk4bifn.ctr" #line 349 "dk4bifn.ctr" #line 350 "dk4bifn.ctr" #line 351 "dk4bifn.ctr" #line 352 "dk4bifn.ctr" #line 353 "dk4bifn.ctr" #line 354 "dk4bifn.ctr" } #endif } #if TRACE_DEBUG else { #line 359 "dk4bifn.ctr" } #endif } #if TRACE_DEBUG else { #line 364 "dk4bifn.ctr" } #endif #line 367 "dk4bifn.ctr" return back; } /** Copy original data to frame information. @param cf Frame data to fill. @param pfd Original per frame data. */ static void dk4bifnetpbm_fill_frame( dk4_bif_frame_t *cf, void const *voptr ) { dk4_bif_netpbm_per_frame_t const *pfd; #line 385 "dk4bifn.ctr" #if DK4_USE_ASSERT assert(NULL != cf); #endif pfd = (dk4_bif_netpbm_per_frame_t *)voptr; cf->n_comp = cf->dim_x = pfd->w; cf->dim_y = pfd->h; switch (pfd->magnum) { case DK4_NETPBM_P1 : { cf->l_cs = cf->f_cs = DK4_CS_GRAY; cf->l_bdepth = cf->r_bdepth = 1; } break; case DK4_NETPBM_P2 : { cf->l_cs = cf->f_cs = DK4_CS_GRAY; cf->l_bdepth = cf->r_bdepth = pfd->bpc; } break; case DK4_NETPBM_P3 : { cf->l_cs = cf->f_cs = DK4_CS_RGB; cf->l_bdepth = cf->r_bdepth = pfd->bpc; } break; case DK4_NETPBM_P4 : { cf->l_cs = cf->f_cs = DK4_CS_GRAY; cf->l_bdepth = cf->r_bdepth = pfd->bpc; } break; case DK4_NETPBM_P5 : { cf->l_cs = cf->f_cs = DK4_CS_GRAY; cf->l_bdepth = cf->r_bdepth = pfd->bpc; } break; case DK4_NETPBM_P6 : { cf->l_cs = cf->f_cs = DK4_CS_RGB; cf->l_bdepth = cf->r_bdepth = pfd->bpc; } break; case DK4_NETPBM_P7 : { switch (pfd->tupt) { case DK4_NETPBM_TT_BLACKANDWHITE : { cf->l_cs = cf->f_cs = DK4_CS_GRAY; cf->l_bdepth = cf->r_bdepth = 1; } break; case DK4_NETPBM_TT_GRAYSCALE : { cf->l_cs = cf->f_cs = DK4_CS_GRAY; cf->l_bdepth = cf->r_bdepth = pfd->bpc; } break; case DK4_NETPBM_TT_RGB : { cf->l_cs = cf->f_cs = DK4_CS_RGB; cf->l_bdepth = cf->r_bdepth = pfd->bpc; } break; case DK4_NETPBM_TT_BLACKANDWHITE_ALPHA : { cf->l_cs = cf->f_cs = DK4_CS_GRAY_ALPHA; cf->l_bdepth = cf->r_bdepth = 1; } break; case DK4_NETPBM_TT_GRAYSCALE_ALPHA : { cf->l_cs = cf->f_cs = DK4_CS_GRAY_ALPHA; cf->l_bdepth = cf->r_bdepth = pfd->bpc; } break; case DK4_NETPBM_TT_RGB_ALPHA : { cf->l_cs = cf->f_cs = DK4_CS_RGB_ALPHA; cf->l_bdepth = cf->r_bdepth = pfd->bpc; } break; default : { #line 445 "dk4bifn.ctr" switch (pfd->ch) { case 1: { cf->l_cs = cf->f_cs = DK4_CS_GRAY; cf->l_bdepth = cf->r_bdepth = pfd->bpc; } break; case 2: { cf->l_cs = cf->f_cs = DK4_CS_GRAY_ALPHA; cf->l_bdepth = cf->r_bdepth = pfd->bpc; } break; case 3: { cf->l_cs = cf->f_cs = DK4_CS_RGB; cf->l_bdepth = cf->r_bdepth = pfd->bpc; } break; case 4: { cf->l_cs = cf->f_cs = DK4_CS_RGB_ALPHA; cf->l_bdepth = cf->r_bdepth = pfd->bpc; } break; } } break; } } break; } cf->bglbd[0] = pfd->maxval; cf->bglbd[1] = pfd->maxval; cf->bglbd[2] = pfd->maxval; cf->bglbd[3] = pfd->maxval; if (pfd->maxval != dk4pxbit_get_max(pfd->bpc)) { cf->fmres = 1; cf->fmrmv = pfd->maxval; dk4pxres_setup_from_maxval(&(cf->resampler), pfd->maxval, pfd->bpc); cf->bg[0] = dk4pxbit_get_max(pfd->bpc); cf->bg[1] = cf->bg[2] = cf->bg[3] = cf->bg[0]; } else { dk4pxres_setup(&(cf->resampler), cf->l_bdepth, cf->l_bdepth); cf->bg[0] = pfd->maxval; cf->bg[1] = pfd->maxval; cf->bg[2] = pfd->maxval; cf->bg[3] = pfd->maxval; } #if TRACE_DEBUG #line 487 "dk4bifn.ctr" #line 488 "dk4bifn.ctr" #line 489 "dk4bifn.ctr" #line 490 "dk4bifn.ctr" #line 491 "dk4bifn.ctr" #line 492 "dk4bifn.ctr" #line 493 "dk4bifn.ctr" #line 494 "dk4bifn.ctr" #line 495 "dk4bifn.ctr" #line 496 "dk4bifn.ctr" #line 497 "dk4bifn.ctr" #line 498 "dk4bifn.ctr" #line 499 "dk4bifn.ctr" #line 500 "dk4bifn.ctr" #line 501 "dk4bifn.ctr" #line 502 "dk4bifn.ctr" #line 503 "dk4bifn.ctr" #line 504 "dk4bifn.ctr" #line 505 "dk4bifn.ctr" #line 506 "dk4bifn.ctr" #line 507 "dk4bifn.ctr" #line 508 "dk4bifn.ctr" #endif #line 510 "dk4bifn.ctr" } /** Initialize builder before applying any data. @param pbuilder Builder to initialize. @return 1 on success, 0 on error (memory). */ static int dk4_bif_netpbm_builder_initialize( dk4_bif_netpbm_builder_t *pbuilder, const dkChar *fn, int honly, dk4_cs_conv_ctx_t const *pcsctx, dk4_er_t *erp ) { int back = 0; #line 530 "dk4bifn.ctr" #if DK4_USE_ASSERT assert(NULL != pbuilder); #endif pbuilder->bif = NULL; pbuilder->magnum = 0; pbuilder->bif = dk4biftool_nc_new_for_one_frame( fn, DK4_BIF_TYPE_NETPBM, honly, pcsctx, erp ); if (NULL != pbuilder->bif) { back = 1; } #line 543 "dk4bifn.ctr" return back; } /** Clean up builder. @param pbuilder Builder to clean up. */ static void dk4_bif_netpbm_builder_cleanup(dk4_bif_netpbm_builder_t *pbuilder) { #line 556 "dk4bifn.ctr" #if DK4_USE_ASSERT assert(NULL != pbuilder); #endif if (NULL != pbuilder->bif) { dk4bif_close(pbuilder->bif); pbuilder->bif = NULL; } #line 564 "dk4bifn.ctr" } /** Attempt to read magic number and one whitespace from file. For a sequence of frames (sequence of NetPBM images) we might have white spaces between frame data and the magic number of the following frame, so we ignore leading white spaces if the havefr flag is set. @param pbuilder Image builder structure. @param fipo Input file, opened for binary reading. @param havefr Flag: Already have previous frame. @param erp Error report, may be NULL. @return 1 on success, 0 on end of file, -1 on error. */ static int dk4bifnetpbm_read_magic_number( dk4_bif_netpbm_builder_t *pbuilder, FILE *fipo, int havefr, dk4_er_t *erp ) { int cc = 1; /* Flag: Can continue */ int c = 0; /* Input character */ int inco = 0; /* Flag: In comment */ int back = -1; #line 594 "dk4bifn.ctr" #if DK4_USE_ASSERT assert(NULL != pbuilder); assert(NULL != fipo); #endif do { c = fgetc(fipo); switch (c) { case EOF : { cc = -1; back = 0; } break; case 'P' : { cc = 0; } break; case '#' : { inco = 1; do { c = fgetc(fipo); switch (c) { case EOF : { inco = 0; cc = -1; back = 0; } break; case '\n' : { inco = 0; } break; } } while (1 == inco); } break; case ' ' : case '\t' : case '\r' : case '\n' : case '\v' : case '\f' : { if (0 == havefr) { cc = -1; dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } } break; default : { cc = -1; dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } break; } } while (1 == cc); switch (cc) { case 0 : { /* P was read */ back = 1; c = fgetc(fipo); switch (c) { case '1' : { pbuilder->magnum = DK4_NETPBM_P1; } break; case '2' : { pbuilder->magnum = DK4_NETPBM_P2; } break; case '3' : { pbuilder->magnum = DK4_NETPBM_P3; } break; case '4' : { pbuilder->magnum = DK4_NETPBM_P4; } break; case '5' : { pbuilder->magnum = DK4_NETPBM_P5; } break; case '6' : { pbuilder->magnum = DK4_NETPBM_P6; } break; case '7' : { pbuilder->magnum = DK4_NETPBM_P7; } break; default : { back = -1; dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } break; } if (1 == back) { c = fgetc(fipo); back = -1; switch (c) { case ' ' : case '\t' : case '\r' : case '\n' : case '\v' : case '\f' : { back = 1; } break; } } } break; default : { /* Failed */ /* Empty by intent. */ } break; } #line 692 "dk4bifn.ctr" return back; } static size_t dk4bifnetpbm_digit(char c) { size_t back = 0; #line 703 "dk4bifn.ctr" switch (c) { case '1' : { back = 1; } break; case '2' : { back = 2; } break; case '3' : { back = 3; } break; case '4' : { back = 4; } break; case '5' : { back = 5; } break; case '6' : { back = 6; } break; case '7' : { back = 7; } break; case '8' : { back = 8; } break; case '9' : { back = 9; } break; } #line 715 "dk4bifn.ctr" return back; } /** Read NetPBM header (2 or 3 decimal numbers), optionally containing a comment. We must have - white space(s), - 2 or 3 decimal numbers separated by white space(s), - one white space at end as separator between header and data. @param fipo Input file, opened for binary reading. @param numbuf Destination buffer for decimal numbers. @param sznb Buffer size (number of numbers). @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ static int dk4bifnetpbm_read_header_16( FILE *fipo, size_t *numbuf, size_t sznb, dk4_er_t *erp ) { dk4_er_t er; /* Error report */ size_t i; /* Traverse all numbers */ size_t val = 0; /* Value to store in current number */ size_t found = 0; /* Number of completed numbers */ int back = 0; int inco = 0; /* Flag: In comment */ int st = 0; /* State: 0=in space, 1=in number */ int c = 0; /* Current character to process */ int cc = 1; /* Flag: 1=can continue, 0=finished, -1=error */ #line 751 "dk4bifn.ctr" #if DK4_USE_ASSERT assert(NULL != fipo); assert(NULL != numbuf); assert(0 < sznb); #endif for (i = 0; i < sznb; i++) { numbuf[i] = 0; } dk4error_init(&er); do { c = fgetc(fipo); switch (c) { case EOF : { cc = -1; if (0 != st) { numbuf[found++] = val; val = 0; } } break; case '#' : { if (0 != st) { numbuf[found++] = val; val = 0; st = 0; } inco = 1; do { c = fgetc(fipo); switch (c) { case EOF : { inco = 0; cc = -1; } break; case '\n' : { inco = 0; } break; } } while (1 == inco); } break; case '0' : case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' : { if (0 != st) { val = dk4ma_size_t_add( dk4ma_size_t_mul(val, 10, &er), dk4bifnetpbm_digit(c), &er ); } else { val = dk4bifnetpbm_digit(c); st = 1; } } break; case ' ': case '\t': case '\r': case '\n': case '\v': case '\f': { if (0 != st) { numbuf[found++] = val; val = 0; if (found == sznb) { cc = 0; back = 1; } } else { if (found == sznb) { cc = 0; back = 1; } } st = 0; } break; default : { cc = -1; } break; } } while (1 == cc); if (DK4_E_NONE != er.ec) { back = 0; } #if TRACE_DEBUG for (i = 0; i < found; i++) { #line 828 "dk4bifn.ctr" } #endif if (1 == back) { for (i = 0; i < found; i++) { if (0 == numbuf[i]) { back = 0; } } } else { dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } #line 841 "dk4bifn.ctr" return back; } /** Check configuration data from P7 lines. @param w Image width. @param h Image height. @param ch Number of channels in image. @param maxval Maximum component value. @param tuptp Address of tuple type variable. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ static int dk4bifnetpbm_check_p7( size_t w, size_t h, size_t ch, size_t maxval, int *tuptp, dk4_er_t *erp ) { int back = 0; #line 868 "dk4bifn.ctr" #line 869 "dk4bifn.ctr" #line 870 "dk4bifn.ctr" #line 871 "dk4bifn.ctr" #line 872 "dk4bifn.ctr" #line 873 "dk4bifn.ctr" if ((0 == ch) && (0 <= *tuptp)) { switch (*tuptp) { case DK4_NETPBM_TT_BLACKANDWHITE : { ch = 1; } break; case DK4_NETPBM_TT_GRAYSCALE : { ch = 1; } break; case DK4_NETPBM_TT_RGB : { ch = 3; } break; case DK4_NETPBM_TT_BLACKANDWHITE_ALPHA : { ch = 2; } break; case DK4_NETPBM_TT_GRAYSCALE_ALPHA : { ch = 2; } break; case DK4_NETPBM_TT_RGB_ALPHA : { ch = 4; } break; #if TRACE_DEBUG default : { #line 896 "dk4bifn.ctr" } break; #endif } } else { if ((0 < ch) && (0 > *tuptp)) { switch (ch) { case 1 : { *tuptp = DK4_NETPBM_TT_GRAYSCALE; } break; case 2 : { *tuptp = DK4_NETPBM_TT_GRAYSCALE_ALPHA; } break; case 3 : { *tuptp = DK4_NETPBM_TT_RGB; } break; case 4 : { *tuptp = DK4_NETPBM_TT_RGB_ALPHA; } break; } } } if (0 != dk4_bif_netpbm_check_input(w, h, maxval, erp)) { if ((0 != ch) && (0 <= *tuptp)) { switch (*tuptp) { case DK4_NETPBM_TT_BLACKANDWHITE : { if (1 == ch) { back = 1; } } break; case DK4_NETPBM_TT_GRAYSCALE : { if (1 == ch) { back = 1; } } break; case DK4_NETPBM_TT_RGB : { if (3 == ch) { back = 1; } } break; case DK4_NETPBM_TT_BLACKANDWHITE_ALPHA : { if (2 == ch) { back = 1; } } break; case DK4_NETPBM_TT_GRAYSCALE_ALPHA : { if (2 == ch) { back = 1; } } break; case DK4_NETPBM_TT_RGB_ALPHA : { if (4 == ch) { back = 1; } } break; #if TRACE_DEBUG default : { #line 942 "dk4bifn.ctr" } break; #endif } } } #line 948 "dk4bifn.ctr" return back; } /** Read binary data for one row. @param row Address of row buffer to fill. @param fipo Input file, opened for binary reading. @param nbytes Number of bytes for row. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ static int dk4bifnetpbm_read_row( unsigned char *row, FILE *fipo, size_t nbytes, dk4_er_t *erp ) { size_t rdbytes = 0; /* Number of bytes read */ int back = 1; #line 972 "dk4bifn.ctr" #if DK4_USE_ASSERT assert(NULL != row); assert(NULL != fipo); #endif /* Normally one fread attempt should be sufficient. But sometimes multiple attempts are needed if an fread returns a small portion of data only. Reading 0 bytes means either end of file or read error. */ do { rdbytes = fread(row, 1, nbytes, fipo); if (0 < rdbytes) { if (rdbytes >= nbytes) { nbytes = 0; } else { nbytes -= rdbytes; row = &(row[rdbytes]); } } else { back = 0; } } while ((0 < nbytes) && (1 == back)); if (0 == back) { dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } #line 1001 "dk4bifn.ctr" return back; } /** Read binary raster data. @param tsdata Per-frame NetPBM data. @param fipo Input file, opened for binary reading. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ static int dk4bifnetpbm_read_binary( void *tsdata, FILE *fipo, dk4_er_t *erp ) { dk4_bif_netpbm_per_frame_t *pfd = NULL; /* Per-frame data */ unsigned char **row = NULL; /* Array of row pointers */ size_t i; /* Traverse all rows */ int back = 0; #line 1025 "dk4bifn.ctr" #if DK4_USE_ASSERT assert(NULL != tsdata); assert(NULL != fipo); #endif pfd = (dk4_bif_netpbm_per_frame_t *)tsdata; row = pfd->rows; back = 1; for (i = 0; i < (size_t)(pfd->h); i++) { if (0 == dk4bifnetpbm_read_row(*(row++), fipo, pfd->bpr, erp)) { back = 0; i = pfd->h; } } #line 1038 "dk4bifn.ctr" return back; } /** Read frame contents (NetPBM image) after magic number P7. @param pbuilder Image builder structure. @param fipo Input file, opened for binary reading. @param havefr Flag: Already have frame. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ static int dk4bifnetpbm_read_p7( dk4_bif_netpbm_builder_t *pbuilder, FILE *fipo, int havefr, dk4_er_t *erp ) { dk4_er_t er; /* Error report */ char *tok[256]; /* Tokens in input line */ char il[256]; /* Input line */ const char *ep = NULL; /* End pointer */ size_t ilp = 0; /* Current position in input line */ size_t ntok = 0; /* Number of tokens in line */ size_t w = 0; /* Image width */ size_t h = 0; /* Image height */ size_t ch = 0; /* Number of channels */ size_t maxval = 0; /* Maximum component value */ int back = 0; /* Function result */ int cc = 1; /* Can continue (1=yes, 0=no, -1=error) */ int hdt = 0; /* Header line type */ int res = 0; /* Operation result */ int tupt = -1; /* Tuple type */ int c; #line 1077 "dk4bifn.ctr" #if DK4_USE_ASSERT assert(NULL != pbuilder); assert(NULL != fipo); #endif DK4_MEMRES(il,sizeof(il)); dk4error_init(&er); do { c = fgetc(fipo); switch (c) { case EOF : { cc = -1; } break; case '\n' : { il[ilp] = '\0'; ntok = dk4str8_tokenize(tok, 256, il, NULL, erp); #line 1093 "dk4bifn.ctr" if (0 < ntok) { hdt = dk4str8_array_index(dk4netpbm_p7_kw, tok[0], 0); #line 1096 "dk4bifn.ctr" switch (hdt) { case 0: { /* WIDTH */ if (1 < ntok) { ep = NULL; res = dk4ma_input_c8_dec_size_t_simple( &w, tok[1], &ep, 1, erp ); if (0 == res) { cc = -1; } } else { cc = -1; } } break; case 1: { /* HEIGHT */ if (1 < ntok) { ep = NULL; res = dk4ma_input_c8_dec_size_t_simple( &h, tok[1], &ep, 1, erp ); if (0 == res) { cc = -1; } } else { cc = -1; } } break; case 2: { /* DEPTH */ if (1 < ntok) { ep = NULL; res = dk4ma_input_c8_dec_size_t_simple( &ch, tok[1], &ep, 1, erp ); if (0 == res) { cc = -1; } } else { cc = -1; } } break; case 3: { /* MAXVAL */ if (1 < ntok) { ep = NULL; res = dk4ma_input_c8_dec_size_t_simple( &maxval, tok[1], &ep, 1, erp ); if (0 == res) { cc = -1; } } else { cc = -1; } } break; case 4: { /* TUPLTYPE */ if (1 < ntok) { tupt = dk4str8_array_index( dk4netpbm_p7_tut, tok[1], 0 ); if (0 > tupt) { #line 1160 "dk4bifn.ctr" #line 1161 "dk4bifn.ctr" /* 2018-03-14 Simply ignore unkown tuple types. */ } } else { cc = -1; } } break; case 5: { /* ENDHDR */ cc = -1; res = dk4bifnetpbm_check_p7( w, h, ch, maxval, &tupt, erp ); if (0 != res) { back = 1; if (0 != havefr) { back = dk4biftool_nc_add_frame( pbuilder->bif, erp ); } if (1 == back) { back = 0; pbuilder->bif->cf->tsdata = dk4bifnetpbm_tsdata_new( DK4_NETPBM_P7,tupt,ch,w,h,maxval,erp ); if (NULL != pbuilder->bif->cf->tsdata) { cc = 0; dk4bifnetpbm_fill_frame( pbuilder->bif->cf, pbuilder->bif->cf->tsdata ); } } } } break; default : { cc = -1; } break; } } else { /* Empty line is ok */ } DK4_MEMRES(il,sizeof(il)); ilp = 0; } break; default : { il[ilp++] = (char)c; if (sizeof(il) <= ilp) { cc = -1; } } break; } } while (1 == cc); #line 1218 "dk4bifn.ctr" #line 1219 "dk4bifn.ctr" #line 1220 "dk4bifn.ctr" #line 1221 "dk4bifn.ctr" #line 1222 "dk4bifn.ctr" if (0 == cc) { /* Read raster data */ back = dk4bifnetpbm_read_binary( pbuilder->bif->cf->tsdata, fipo, erp ); } #line 1231 "dk4bifn.ctr" return back; } /** Read bit values as text. @param tsdata Per-frame NetPBM data. @param fipo Input file, opened for binary reading. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ static int dk4bifnetpbm_read_bits_text( void *tsdata, FILE *fipo, dk4_er_t *erp ) { dk4_bif_netpbm_per_frame_t *pfd; /* Per-frame data */ size_t rowno = 0; /* Current row number */ size_t valno = 0; /* Current value number */ size_t byteno = 0; /* Byte number within row */ size_t bitno = 0; /* Bit number within byte */ int back = 1; int cc = 1; /* Flag: Can continue */ int c; /* Current input character */ unsigned char uc; /* Byte to save */ #line 1260 "dk4bifn.ctr" #if DK4_USE_ASSERT assert(NULL != tsdata); assert(NULL != fipo); #endif pfd = (dk4_bif_netpbm_per_frame_t *)tsdata; do { c = fgetc(fipo); switch (c) { case EOF : { cc = -1; back = 0; } break; case '0' : case '1' : { if ('1' == c) { byteno = valno / 8; bitno = valno % 8; uc = (unsigned char)dk4pxbit_get_bit(7 - bitno); ((pfd->rows)[rowno])[byteno] |= uc; } valno++; if (valno >= pfd->vpr) { valno = 0; rowno++; if (rowno >= (size_t)(pfd->h)) { cc = 0; } } } break; case ' ' : case '\t' : case '\r' : case '\n' : case '\v' : case '\f' : { } break; default : { cc = -1; } break; } } while (1 == cc); if (0 == cc) { do { c = fgetc(fipo); } while ((EOF != c) && (0 == feof(fipo)) && (0 == ferror(fipo))); } if (0 == back) { dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } #line 1309 "dk4bifn.ctr" return back; } /** Read pixel component values as text. @param tsdata Per-frame NetPBM data. @param fipo Input file, opened for binary reading. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ static int dk4bifnetpbm_read_values_from_text( void *tsdata, FILE *fipo, dk4_er_t *erp ) { dk4_er_t er; /* Error report for math */ dk4_bif_netpbm_per_frame_t *pfd = NULL; /* Per-frame data */ size_t rowno = 0; /* Current row number */ size_t valno = 0; /* Current value number */ size_t value = 0; /* Sample value */ int back = 1; int st = 0; /* State: 1=in number */ int cc = 1; /* Flag: Can continue */ int c; /* Current character */ unsigned char uc; /* Byte to save */ #line 1339 "dk4bifn.ctr" #if DK4_USE_ASSERT assert(NULL != tsdata); assert(NULL != fipo); #endif pfd = (dk4_bif_netpbm_per_frame_t *)tsdata; dk4error_init(&er); do { c = fgetc(fipo); switch (c) { case EOF : { if (0 != st) { cc = -1; back = 0; if (value <= pfd->maxval) { if (256 > pfd->maxval) { uc = (unsigned char)value; ((pfd->rows)[rowno])[valno] = uc; } else { uc = (value >> 8) & 0x00FFU; ((pfd->rows)[rowno])[2 * valno] = uc; uc = value & 0x00FFU; ((pfd->rows)[rowno])[2 * valno + 1] = uc; } valno++; if (valno >= pfd->vpr) { valno = 0; rowno++; if (rowno >= (size_t)(pfd->h)) { back = 1; } } } } else { cc = -1; back = 0; } } break; case '0' : case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' : { if (0 != st) { value = dk4ma_size_t_add( dk4ma_size_t_mul(value, 10, &er), dk4bifnetpbm_digit(c), &er ); } else { value = dk4bifnetpbm_digit(c); } st = 1; } break; case ' ' : case '\t' : case '\r' : case '\n' : case '\v' : case '\f' : { if (0 != st) { if (value <= pfd->maxval) { if (256 > pfd->maxval) { uc = (unsigned char)value; ((pfd->rows)[rowno])[valno] = uc; } else { uc = (value >> 8) & 0x00FFU; ((pfd->rows)[rowno])[2 * valno] = uc; uc = value & 0x00FFU; ((pfd->rows)[rowno])[2 * valno + 1] = uc; } valno++; if (valno >= pfd->vpr) { valno = 0; rowno++; if (rowno >= (size_t)(pfd->h)) { back = 1; cc = 0; } } } else { cc = -1; back = 0; } } st = 0; } break; default : { cc = -1; back = 0; } break; } } while (1 == cc); if (0 == cc) { do { c = fgetc(fipo); } while ((EOF != c) && (0 == feof(fipo)) && (0 == ferror(fipo))); } if (DK4_E_NONE != er.ec) { back = 0; } if (0 == back) { dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } #line 1444 "dk4bifn.ctr" return back; } /** Read frame contents (NetPBM image) after magic number. @param pbuilder Image builder structure. @param fipo Input file, opened for binary reading. @param havefr Flag: Already have a frame. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ static int dk4bifnetpbm_read_frame_contents( dk4_bif_netpbm_builder_t *pbuilder, FILE *fipo, int havefr, dk4_er_t *erp ) { int back = 0; #line 1467 "dk4bifn.ctr" #if DK4_USE_ASSERT assert(NULL != pbuilder); assert(NULL != fipo); #endif switch (pbuilder->magnum) { case DK4_NETPBM_P1 : case DK4_NETPBM_P4 : { back = dk4bifnetpbm_read_header_16( fipo, &(pbuilder->nums[0]), 2, erp ); if (1 == back) { #line 1479 "dk4bifn.ctr" back = 0; if (0 != havefr) { if (0 != dk4biftool_nc_add_frame(pbuilder->bif, erp)) { back = 1; } } else { back = 1; } if (0 != back) { back = 0; pbuilder->bif->cf->tsdata = dk4bifnetpbm_tsdata_new( pbuilder->magnum, pbuilder->tupt, 1, pbuilder->nums[0], pbuilder->nums[1], 1, erp ); if (NULL != pbuilder->bif->cf->tsdata) { dk4bifnetpbm_fill_frame( pbuilder->bif->cf, pbuilder->bif->cf->tsdata ); if (DK4_NETPBM_P4 == pbuilder->magnum) { back = dk4bifnetpbm_read_binary( pbuilder->bif->cf->tsdata, fipo, erp ); } else { back = dk4bifnetpbm_read_bits_text( pbuilder->bif->cf->tsdata, fipo, erp ); } } } } } break; case DK4_NETPBM_P2 : case DK4_NETPBM_P3 : case DK4_NETPBM_P5 : case DK4_NETPBM_P6 : { back = dk4bifnetpbm_read_header_16( fipo, &(pbuilder->nums[0]), 3, erp ); if (1 == back) { #line 1523 "dk4bifn.ctr" back = 0; if (0 != havefr) { if (0 != dk4biftool_nc_add_frame(pbuilder->bif, erp)) { back = 1; } } else { back = 1; } if (0 != back) { back = 0; switch (pbuilder->magnum) { case DK4_NETPBM_P2 : case DK4_NETPBM_P5 : { pbuilder->bif->cf->tsdata = dk4bifnetpbm_tsdata_new( pbuilder->magnum, pbuilder->tupt, 1, pbuilder->nums[0], pbuilder->nums[1], pbuilder->nums[2], erp ); } break; default : { pbuilder->bif->cf->tsdata = dk4bifnetpbm_tsdata_new( pbuilder->magnum, pbuilder->tupt, 3, pbuilder->nums[0], pbuilder->nums[1], pbuilder->nums[2], erp ); } break; } if (NULL != pbuilder->bif->cf->tsdata) { dk4bifnetpbm_fill_frame( pbuilder->bif->cf, pbuilder->bif->cf->tsdata ); switch (pbuilder->magnum) { case DK4_NETPBM_P5 : case DK4_NETPBM_P6 : { back = dk4bifnetpbm_read_binary( pbuilder->bif->cf->tsdata, fipo, erp ); } break; default : { back = dk4bifnetpbm_read_values_from_text( pbuilder->bif->cf->tsdata, fipo, erp ); } break; } } } } } break; case DK4_NETPBM_P7 : { back = dk4bifnetpbm_read_p7(pbuilder, fipo, havefr, erp); } break; default : { dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } break; } #line 1580 "dk4bifn.ctr" return back; } /** Read one frame (one image) from the input file and add it to builder. @param pbuilder Image builder structure. @param fipo Input file, opened for binary reading. @param havefr Flag: Already have previous frame. @param erp Error report, may be NULL. @return 1 on success, 0 on end of file, -1 on error. */ static int dk4bifnetpbm_read_frame( dk4_bif_netpbm_builder_t *pbuilder, FILE *fipo, int havefr, dk4_er_t *erp ) { int back = -1; #line 1603 "dk4bifn.ctr" #if DK4_USE_ASSERT assert(NULL != pbuilder); assert(NULL != fipo); #endif back = dk4bifnetpbm_read_magic_number(pbuilder, fipo, havefr, erp); if (1 == back) { back = dk4bifnetpbm_read_frame_contents(pbuilder, fipo, havefr, erp); if (1 != back) { back = -1; } } #line 1615 "dk4bifn.ctr" return back; } dk4_bif_t * dk4bifnetpbm_nc_open_file( FILE *fipo, dkChar const *fn, int honly, dk4_cs_conv_ctx_t const *pcsctx, dk4_er_t *erp ) { dk4_bif_t *back = NULL; int res = 0; /* Operation result */ int havefr = 0; /* Flag: frames found */ dk4_bif_netpbm_builder_t builder; /* Builder structure */ #line 1634 "dk4bifn.ctr" #if DK4_USE_ASSERT assert(NULL != fipo); #endif /* Initialize the builder */ if (0 != dk4_bif_netpbm_builder_initialize(&builder,fn,honly,pcsctx,erp)) { /* Attempt to read all frames from input */ do { res = dk4bifnetpbm_read_frame(&builder, fipo, havefr, erp); switch (res) { case 1: { havefr = 1; } break; } } while (0 < res); /* On success (at least one frame was read, end of file was found after last frame) return the builders collected data */ if ((-1 != res) && (0 != havefr)) { back = builder.bif; builder.bif = NULL; } /* Finally clean up the builder */ dk4_bif_netpbm_builder_cleanup(&builder); } #line 1666 "dk4bifn.ctr" return back; } /** Combine two bytes into one 16 bit unsigned integer for pixel component. @param msb Most significant byte. @param lsb Least significant byte. @return Pixel component value. */ static dk4_px_t dk4bifnetpbm_combine_bytes(unsigned char msb, unsigned char lsb) { dk4_px_t back; #line 1682 "dk4bifn.ctr" back = ((((dk4_px_t)msb) << 8) & ((dk4_px_t)0xFF00U)) | (((dk4_px_t)lsb) & ((dk4_px_t)0x00FFU)); #line 1685 "dk4bifn.ctr" return back; } int dk4bifnetpbm_nc_get_original_pixel( dk4_px_t *dptr, dk4_bif_t const *bif, dk4_bif_dim_t rowno, dk4_bif_dim_t colno ) { dk4_bif_netpbm_per_frame_t *pfd = NULL; /* Per-frame data */ size_t byteno; /* Byte number to retrieve */ size_t bitno; /* Bit number within byte */ size_t i; /* Traverse components */ int back = 0; unsigned char uc; /* Byte read from buffer */ #line 1704 "dk4bifn.ctr" #if DK4_USE_ASSERT assert(NULL != dptr); assert(NULL != bif); #endif if (NULL == bif->cf) { goto finished; } if (NULL == bif->cf->tsdata) { goto finished; } pfd = (dk4_bif_netpbm_per_frame_t *)(bif->cf->tsdata); if (NULL == pfd->rows) { goto finished; } switch (pfd->magnum) { case DK4_NETPBM_P1 : case DK4_NETPBM_P4 : { byteno = (size_t)colno / 8; bitno = (size_t)colno % 8; uc = ((pfd->rows)[rowno])[byteno]; if (0 != (dk4pxbit_get_bit(7 - bitno) & uc)) { *dptr = 0; } else { *dptr = 1; } back = 1; } break; case DK4_NETPBM_P2 : case DK4_NETPBM_P5 : { if (256 > pfd->maxval) { *dptr = (dk4_px_t)(((pfd->rows)[rowno])[colno]); } else { *dptr = dk4bifnetpbm_combine_bytes( ((pfd->rows)[rowno])[2 * colno], ((pfd->rows)[rowno])[2 * colno + 1] ); } back = 1; } break; case DK4_NETPBM_P3 : case DK4_NETPBM_P6 : { if (256 > pfd->maxval) { dptr[0] = (dk4_px_t)(((pfd->rows)[rowno])[3 * colno]); dptr[1] = (dk4_px_t)(((pfd->rows)[rowno])[3 * colno + 1]); dptr[2] = (dk4_px_t)(((pfd->rows)[rowno])[3 * colno + 2]); } else { dptr[0] = dk4bifnetpbm_combine_bytes( ((pfd->rows)[rowno])[6 * colno], ((pfd->rows)[rowno])[6 * colno + 1] ); dptr[1] = dk4bifnetpbm_combine_bytes( ((pfd->rows)[rowno])[6 * colno + 2], ((pfd->rows)[rowno])[6 * colno + 3] ); dptr[2] = dk4bifnetpbm_combine_bytes( ((pfd->rows)[rowno])[6 * colno + 4], ((pfd->rows)[rowno])[6 * colno + 5] ); } back = 1; } break; case DK4_NETPBM_P7 : { switch (pfd->tupt) { case DK4_NETPBM_TT_BLACKANDWHITE : { if (0 != ((pfd->rows)[rowno])[colno]) { *dptr = 1; } else { *dptr = 0; } back = 1; } break; case DK4_NETPBM_TT_GRAYSCALE : { if (256 > pfd->maxval) { *dptr = (dk4_px_t)(((pfd->rows)[rowno])[colno]); } else { *dptr = dk4bifnetpbm_combine_bytes( ((pfd->rows)[rowno])[2 * colno], ((pfd->rows)[rowno])[2 * colno + 1] ); } back = 1; } break; case DK4_NETPBM_TT_RGB : { if (256 > pfd->maxval) { dptr[0] = (dk4_px_t)(((pfd->rows)[rowno])[3*colno]); dptr[1] = (dk4_px_t)(((pfd->rows)[rowno])[3*colno+1]); dptr[2] = (dk4_px_t)(((pfd->rows)[rowno])[3*colno+2]); } else { dptr[0] = dk4bifnetpbm_combine_bytes( ((pfd->rows)[rowno])[6 * colno], ((pfd->rows)[rowno])[6 * colno + 1] ); dptr[1] = dk4bifnetpbm_combine_bytes( ((pfd->rows)[rowno])[6 * colno + 2], ((pfd->rows)[rowno])[6 * colno + 3] ); dptr[2] = dk4bifnetpbm_combine_bytes( ((pfd->rows)[rowno])[6 * colno + 4], ((pfd->rows)[rowno])[6 * colno + 5] ); } back = 1; } break; case DK4_NETPBM_TT_BLACKANDWHITE_ALPHA : { if (0 != ((pfd->rows)[rowno])[2 * colno]) { dptr[0] = 1; } else { dptr[0] = 0; } if (0 != ((pfd->rows)[rowno])[2 * colno + 1]) { dptr[1] = 1; } else { dptr[1] = 0; } back = 1; } break; case DK4_NETPBM_TT_GRAYSCALE_ALPHA : { if (256 > pfd->maxval) { dptr[0] = (dk4_px_t)(((pfd->rows)[rowno])[2*colno]); dptr[1] = (dk4_px_t)(((pfd->rows)[rowno])[2*colno+1]); } else { dptr[0] = dk4bifnetpbm_combine_bytes( ((pfd->rows)[rowno])[4 * colno], ((pfd->rows)[rowno])[4 * colno + 1] ); dptr[1] = dk4bifnetpbm_combine_bytes( ((pfd->rows)[rowno])[4 * colno + 2], ((pfd->rows)[rowno])[4 * colno + 3] ); } back = 1; } break; case DK4_NETPBM_TT_RGB_ALPHA : { if (256 > pfd->maxval) { dptr[0] = (dk4_px_t)(((pfd->rows)[rowno])[4*colno]); dptr[1] = (dk4_px_t)(((pfd->rows)[rowno])[4*colno+1]); dptr[2] = (dk4_px_t)(((pfd->rows)[rowno])[4*colno+2]); dptr[3] = (dk4_px_t)(((pfd->rows)[rowno])[4*colno+3]); } else { dptr[0] = dk4bifnetpbm_combine_bytes( ((pfd->rows)[rowno])[8 * colno], ((pfd->rows)[rowno])[8 * colno + 1] ); dptr[1] = dk4bifnetpbm_combine_bytes( ((pfd->rows)[rowno])[8 * colno + 2], ((pfd->rows)[rowno])[8 * colno + 3] ); dptr[2] = dk4bifnetpbm_combine_bytes( ((pfd->rows)[rowno])[8 * colno + 4], ((pfd->rows)[rowno])[8 * colno + 5] ); dptr[3] = dk4bifnetpbm_combine_bytes( ((pfd->rows)[rowno])[8 * colno + 6], ((pfd->rows)[rowno])[8 * colno + 7] ); } back = 1; } break; default : { #line 1871 "dk4bifn.ctr" if (256 > pfd->maxval) { for (i = 0; i < pfd->ch; i++) { dptr[i] = (dk4_px_t)( ((pfd->rows)[rowno])[pfd->ch * colno + i] ); } } else { for (i = 0; i < pfd->ch; i++) { dptr[i] = dk4bifnetpbm_combine_bytes( ((pfd->rows)[rowno])[2*(pfd->ch * colno + i)], ((pfd->rows)[rowno])[2*(pfd->ch * colno + i)+1] ); } } back = 1; } break; } } break; } finished: #line 1895 "dk4bifn.ctr" return back; } /* vim: set ai sw=4 ts=4 : */