diff options
-rw-r--r-- | base/gxi12bit.c | 10 | ||||
-rw-r--r-- | base/gxiclass.h | 2 | ||||
-rw-r--r-- | base/gxicolor.c | 19 | ||||
-rw-r--r-- | base/gxifast.c | 18 | ||||
-rw-r--r-- | base/gximono.c | 14 | ||||
-rw-r--r-- | base/gxipixel.c | 12 | ||||
-rw-r--r-- | base/gxiscale.c | 16 |
7 files changed, 55 insertions, 36 deletions
diff --git a/base/gxi12bit.c b/base/gxi12bit.c index e9e0fc63c..6c4a70d37 100644 --- a/base/gxi12bit.c +++ b/base/gxi12bit.c @@ -106,8 +106,8 @@ iclass_proc(gs_image_class_2_fracs); static irender_proc(image_render_frac); static irender_proc(image_render_icc16); /* icc 16bit case */ -irender_proc_t -gs_image_class_2_fracs(gx_image_enum * penum) +int +gs_image_class_2_fracs(gx_image_enum * penum, irender_proc_t *render_fn) { bool std_cmap_procs; @@ -134,7 +134,8 @@ gs_image_class_2_fracs(gx_image_enum * penum) a simple color space that just is scaled to the device bit depth when remapped. No CM needed */ if_debug0m('b', penum->memory, "[b]render=frac\n"); - return &image_render_frac; + *render_fn = &image_render_frac; + return 0; } else { /* Set up the link now */ const gs_color_space *pcs; @@ -181,7 +182,8 @@ gs_image_class_2_fracs(gx_image_enum * penum) /* Use the direct unpacking proc */ penum->unpack = sample_unpackicc_16; if_debug0m('b', penum->memory, "[b]render=icc16\n"); - return &image_render_icc16; + *render_fn = &image_render_icc16; + return 0; } } return 0; diff --git a/base/gxiclass.h b/base/gxiclass.h index ad8690173..f44d5cd7a 100644 --- a/base/gxiclass.h +++ b/base/gxiclass.h @@ -60,7 +60,7 @@ typedef irender_proc((*irender_proc_t)); * structure as well as returning the rendering procedure. */ #define iclass_proc(proc)\ - irender_proc_t proc(gx_image_enum *penum) + int proc(gx_image_enum *penum, irender_proc_t *render_fn) typedef iclass_proc((*gx_image_class_t)); #endif /* gxiclass_INCLUDED */ diff --git a/base/gxicolor.c b/base/gxicolor.c index b35dfb62f..bfc6025c6 100644 --- a/base/gxicolor.c +++ b/base/gxicolor.c @@ -63,11 +63,11 @@ static irender_proc(image_render_color_thresh); static int image_skip_color_icc_tpr(gx_image_enum *penum, gx_device *dev); -irender_proc_t -gs_image_class_4_color(gx_image_enum * penum) +int +gs_image_class_4_color(gx_image_enum * penum, irender_proc_t *render_fn) { bool std_cmap_procs; - int code; + int code = 0; #if USE_FAST_HT_CODE bool use_fast_thresh = true; #else @@ -119,13 +119,14 @@ gs_image_class_4_color(gx_image_enum * penum) if ( (gs_color_space_get_index(penum->pcs) == gs_color_space_index_DeviceN && penum->pcs->cmm_icc_profile_data == NULL) || penum->use_mask_color || !std_cmap_procs) { - return &image_render_color_DeviceN; + *render_fn = &image_render_color_DeviceN; + return code; } /* Set up the link now */ code = dev_proc(penum->dev, get_profile)(penum->dev, &dev_profile); if (code < 0) - return NULL; /* This function does not return errors, best we can do is say 'we can't handle this' */ + return code; des_num_comp = gsicc_get_device_profile_comps(dev_profile); bpc = penum->dev->color_info.depth / des_num_comp; /* bits per component */ @@ -193,7 +194,8 @@ gs_image_class_4_color(gx_image_enum * penum) if (code == 0) { /* NB: transfer function is pickled into the threshold arrray */ penum->icc_setup.has_transfer = false; - return &image_render_color_thresh; + *render_fn = &image_render_color_thresh; + return code; } } } @@ -220,10 +222,11 @@ gs_image_class_4_color(gx_image_enum * penum) if (code >= 0) { penum->tpr_state = data.state; penum->skip_next_line = image_skip_color_icc_tpr; - return &image_render_color_icc_tpr; + *render_fn = &image_render_color_icc_tpr; + return code; } } - return NULL; + return code; } /* ------ Rendering procedures ------ */ diff --git a/base/gxifast.c b/base/gxifast.c index 8ab774f6c..e5ea6cdc0 100644 --- a/base/gxifast.c +++ b/base/gxifast.c @@ -50,10 +50,10 @@ iclass_proc(gs_image_class_1_simple); static irender_proc(image_render_skip); static irender_proc(image_render_simple); static irender_proc(image_render_landscape); -irender_proc_t -gs_image_class_1_simple(gx_image_enum * penum) + +int +gs_image_class_1_simple(gx_image_enum * penum, irender_proc_t *render_fn) { - irender_proc_t rproc; fixed ox = dda_current(penum->dda.pixel0.x); fixed oy = dda_current(penum->dda.pixel0.y); @@ -82,12 +82,12 @@ gs_image_class_1_simple(gx_image_enum * penum) penum->line = gs_alloc_bytes(penum->memory, penum->line_size, "image line"); if (penum->line == 0) { - return 0; + return gs_error_VMerror; } } if_debug2m('b', penum->memory, "[b]render=simple, unpack=copy; rect.w=%d, dev_width=%ld\n", penum->rect.w, dev_width); - rproc = image_render_simple; + *render_fn = image_render_simple; break; } case image_landscape: @@ -110,7 +110,7 @@ gs_image_class_1_simple(gx_image_enum * penum) penum->line = gs_alloc_bytes(penum->memory, penum->line_size, "image line"); if (penum->line == 0) { - return 0; + return gs_error_VMerror; } #ifdef PACIFY_VALGRIND memset(penum->line, 0, penum->line_size); /* For the number of scan lined < 8 */ @@ -119,7 +119,7 @@ gs_image_class_1_simple(gx_image_enum * penum) if_debug3m('b', penum->memory, "[b]render=landscape, unpack=copy; rect.w=%d, dev_width=%ld, line_size=%ld\n", penum->rect.w, dev_width, line_size); - rproc = image_render_landscape; + *render_fn = image_render_landscape; /* Precompute values needed for rasterizing. */ penum->dxy = float2fixed(penum->matrix.xy + @@ -158,11 +158,11 @@ gs_image_class_1_simple(gx_image_enum * penum) * The only other possible in-range value is v0 = 0, v1 = 1. * The image is completely transparent! */ - rproc = image_render_skip; + *render_fn = image_render_skip; } penum->map[0].decoding = sd_none; } - return rproc; + return 0; } /* ------ Rendering procedures ------ */ diff --git a/base/gximono.c b/base/gximono.c index 276db6964..e3d441e06 100644 --- a/base/gximono.c +++ b/base/gximono.c @@ -59,8 +59,8 @@ iclass_proc(gs_image_class_3_mono); static irender_proc(image_render_mono); static irender_proc(image_render_mono_ht); -irender_proc_t -gs_image_class_3_mono(gx_image_enum * penum) +int +gs_image_class_3_mono(gx_image_enum * penum, irender_proc_t *render_fn) { #if USE_FAST_HT_CODE bool use_fast_code = true; @@ -112,7 +112,7 @@ gs_image_class_3_mono(gx_image_enum * penum) } code = dev_proc(penum->dev, get_profile)(penum->dev, &dev_profile); if (code < 0) - return NULL; /* This function does not return errors, best we can do is say 'we can't handle this' */ + return code; /* Define the rendering intents */ rendering_params.black_point_comp = penum->pgs->blackptcomp; @@ -170,8 +170,10 @@ gs_image_class_3_mono(gx_image_enum * penum) code = image_init_color_cache(penum, penum->bps, penum->spp); if (code >= 0) { code = gxht_thresh_image_init(penum); - if (code >= 0) - return &image_render_mono_ht; + if (code >= 0) { + *render_fn = &image_render_mono_ht; + return code; + } } } not_fast_halftoning: @@ -204,7 +206,7 @@ not_fast_halftoning: /* Reset the clues here, rather than in image_render_mono as * previously. Even doing so this often may be overzealous. */ image_init_clues(penum, penum->bps, penum->spp); - return &image_render_mono; + *render_fn = &image_render_mono; } return 0; } diff --git a/base/gxipixel.c b/base/gxipixel.c index df9772e4b..49ac68437 100644 --- a/base/gxipixel.c +++ b/base/gxipixel.c @@ -994,6 +994,7 @@ gx_image_enum_begin(gx_device * dev, const gs_gstate * pgs, }}; int num_planes = penum->num_planes; bool interleaved = (num_planes == 1 && penum->plane_depths[0] != penum->bps); + irender_proc_t render_fn = NULL; int i; if (interleaved) { @@ -1013,9 +1014,16 @@ gx_image_enum_begin(gx_device * dev, const gs_gstate * pgs, /* Set up pixel0 for image class procedures. */ penum->dda.pixel0 = penum->dda.strip; penum->skip_next_line = NULL; - for (i = 0; i < gx_image_class_table_count; ++i) - if ((penum->render = gx_image_class_table[i](penum)) != 0) + for (i = 0; i < gx_image_class_table_count; ++i) { + code = gx_image_class_table[i](penum, &render_fn); + if (code < 0) + goto fail; + + if (render_fn != NULL) { + penum->render = render_fn; break; + } + } penum->dev = dev; /* Restore this (in case it was changed to cdev or rtdev) */ if (i == gx_image_class_table_count) { /* No available class can handle this image. */ diff --git a/base/gxiscale.c b/base/gxiscale.c index 526bd4308..cc2fc6fe6 100644 --- a/base/gxiscale.c +++ b/base/gxiscale.c @@ -173,8 +173,8 @@ static int mask_suitable_for_interpolation(gx_image_enum *penum) return high_level_color; } -irender_proc_t -gs_image_class_0_interpolate(gx_image_enum * penum) +int +gs_image_class_0_interpolate(gx_image_enum * penum, irender_proc_t *render_fn) { gs_memory_t *mem = penum->memory; stream_image_scale_params_t iss; @@ -550,13 +550,15 @@ gs_image_class_0_interpolate(gx_image_enum * penum) if_debug0m('b', penum->memory, "[b]render=interpolate\n"); if (penum->masked) { if (!mask_col_high_level) { - return (penum->posture == image_portrait ? + *render_fn = (penum->posture == image_portrait ? &image_render_interpolate_masked : &image_render_interpolate_landscape_masked); + return 0; } else { - return (penum->posture == image_portrait ? + *render_fn = (penum->posture == image_portrait ? &image_render_interpolate_masked_hl : &image_render_interpolate_landscape_masked_hl); + return 0; } } else if (use_icc) { /* Set up the link now */ @@ -604,13 +606,15 @@ gs_image_class_0_interpolate(gx_image_enum * penum) if (penum->bps == 16) { penum->unpack = sample_unpackicc_16; } - return (penum->posture == image_portrait ? + *render_fn = (penum->posture == image_portrait ? &image_render_interpolate_icc : &image_render_interpolate_landscape_icc); + return 0; } else { - return (penum->posture == image_portrait ? + *render_fn = (penum->posture == image_portrait ? &image_render_interpolate : &image_render_interpolate_landscape); + return 0; } } |