static void stpi_channel_clear(void *vc) { stpi_channel_group_t *cg = (stpi_channel_group_t *) vc; int i; if (cg->channel_count > 0) for (i = 0; i < cg->channel_count; i++) clear_a_channel(cg, i); STP_SAFE_FREE(cg->alloc_data_1); STP_SAFE_FREE(cg->alloc_data_2); STP_SAFE_FREE(cg->alloc_data_3); STP_SAFE_FREE(cg->c); if (cg->gcr_curve) { stp_curve_destroy(cg->gcr_curve); cg->gcr_curve = NULL; } cg->channel_count = 0; cg->curve_count = 0; cg->aux_output_channels = 0; cg->total_channels = 0; cg->input_channels = 0; cg->initialized = 0; }
static void clear_a_channel(stpi_channel_group_t *cg, int channel) { if (channel < cg->channel_count) { STP_SAFE_FREE(cg->c[channel].sc); STP_SAFE_FREE(cg->c[channel].lut); if (cg->c[channel].curve) { stp_curve_destroy(cg->c[channel].curve); cg->c[channel].curve = NULL; } cg->c[channel].subchannel_count = 0; } }
void stpi_dither_channel_destroy(stpi_dither_channel_t *channel) { int i; STP_SAFE_FREE(channel->ink_list); if (channel->errs) { for (i = 0; i < channel->error_rows; i++) STP_SAFE_FREE(channel->errs[i]); STP_SAFE_FREE(channel->errs); } STP_SAFE_FREE(channel->ranges); stp_dither_matrix_destroy(&(channel->pick)); stp_dither_matrix_destroy(&(channel->dithermat)); }
static void free_eventone_data(stpi_dither_t *d) { int i; eventone_t *et = (eventone_t *) (d->aux_data); for (i = 0; i < CHANNEL_COUNT(d); i++) { if (CHANNEL(d, i).aux_data) { shade_distance_t *shade = (shade_distance_t *) CHANNEL(d,i).aux_data; STP_SAFE_FREE(shade->et_dis); STP_SAFE_FREE(CHANNEL(d, i).aux_data); } } if (et->dummy_channel) { stpi_dither_channel_t *dc = et->dummy_channel; shade_distance_t *shade = (shade_distance_t *) dc->aux_data; STP_SAFE_FREE(shade->et_dis); STP_SAFE_FREE(dc->aux_data); stpi_dither_channel_destroy(dc); STP_SAFE_FREE(et->dummy_channel); } STP_SAFE_FREE(et); }
static void invalidate_auxiliary_data(stp_curve_t *curve) { STP_SAFE_FREE(curve->interval); }
static void stpi_dither_set_ranges(stp_vars_t *v, int color, const stp_shade_t *shade, double density, double darkness) { stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither"); stpi_dither_channel_t *dc = &(CHANNEL(d, color)); const stp_dotsize_t *ranges = shade->dot_sizes; int nlevels = shade->numsizes; int i; STP_SAFE_FREE(dc->ranges); STP_SAFE_FREE(dc->ink_list); dc->nlevels = nlevels > 1 ? nlevels + 1 : nlevels; dc->ranges = (stpi_dither_segment_t *) stp_zalloc(dc->nlevels * sizeof(stpi_dither_segment_t)); dc->ink_list = (stpi_ink_defn_t *) stp_zalloc((dc->nlevels + 1) * sizeof(stpi_ink_defn_t)); dc->bit_max = 0; dc->density = density * 65535; dc->darkness = darkness; stp_init_debug_messages(v); stp_dprintf(STP_DBG_INK, v, "stpi_dither_set_ranges channel %d nlevels %d density %f darkness %f\n", color, nlevels, density, darkness); for (i = 0; i < nlevels; i++) stp_dprintf(STP_DBG_INK, v, " level %d value %f pattern %x\n", i, ranges[i].value, ranges[i].bit_pattern); dc->ranges[0].lower = &dc->ink_list[0]; dc->ranges[0].upper = &dc->ink_list[1]; dc->ink_list[0].range = 0; dc->ink_list[0].value = 0; dc->ink_list[0].bits = 0; if (nlevels == 1) dc->ink_list[1].range = 65535; else dc->ink_list[1].range = ranges[0].value * 65535.0 * density; if (dc->ink_list[1].range > 65535) dc->ink_list[1].range = 65535; dc->ink_list[1].value = ranges[0].value * 65535.0; if (dc->ink_list[1].value > 65535) dc->ink_list[1].value = 65535; dc->ink_list[1].bits = ranges[0].bit_pattern; if (ranges[0].bit_pattern > dc->bit_max) dc->bit_max = ranges[0].bit_pattern; dc->ranges[0].range_span = dc->ranges[0].upper->range; dc->ranges[0].value_span = dc->ranges[0].upper->value; if (dc->nlevels > 1) { for (i = 1; i < nlevels; i++) { int l = i + 1; dc->ranges[i].lower = &dc->ink_list[i]; dc->ranges[i].upper = &dc->ink_list[l]; dc->ink_list[l].range = (ranges[i].value + ranges[i].value) * 32768.0 * density; if (dc->ink_list[l].range > 65535) dc->ink_list[l].range = 65535; dc->ink_list[l].value = ranges[i].value * 65535.0; if (dc->ink_list[l].value > 65535) dc->ink_list[l].value = 65535; dc->ink_list[l].bits = ranges[i].bit_pattern; if (ranges[i].bit_pattern > dc->bit_max) dc->bit_max = ranges[i].bit_pattern; dc->ranges[i].range_span = dc->ink_list[l].range - dc->ink_list[i].range; dc->ranges[i].value_span = dc->ink_list[l].value - dc->ink_list[i].value; } dc->ranges[i].lower = &dc->ink_list[i]; dc->ranges[i].upper = &dc->ink_list[i+1]; dc->ink_list[i+1] = dc->ink_list[i]; dc->ink_list[i+1].range = 65535; dc->ranges[i].range_span = dc->ink_list[i+1].range - dc->ink_list[i].range; dc->ranges[i].value_span = dc->ink_list[i+1].value - dc->ink_list[i].value; } stpi_dither_finalize_ranges(v, dc); stp_flush_debug_messages(v); }