summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--base/gxi12bit.c10
-rw-r--r--base/gxiclass.h2
-rw-r--r--base/gxicolor.c19
-rw-r--r--base/gxifast.c18
-rw-r--r--base/gximono.c14
-rw-r--r--base/gxipixel.c12
-rw-r--r--base/gxiscale.c16
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;
}
}