/* setcolorspace */ int gs_setcolorspace(gs_state * pgs, const gs_color_space * pcs) { int code = 0; gs_color_space cs_old = *pgs->color_space; gs_client_color cc_old = *pgs->ccolor; if (pgs->in_cachedevice) return_error(gs_error_undefined); if (pcs->id != pgs->color_space->id) { pcs->type->adjust_cspace_count(pcs, 1); *pgs->color_space = *pcs; if ( (code = pcs->type->install_cspace(pcs, pgs)) < 0 || (pgs->overprint && (code = gs_do_set_overprint(pgs)) < 0) ) { *pgs->color_space = cs_old; pcs->type->adjust_cspace_count(pcs, -1); } else cs_old.type->adjust_cspace_count(&cs_old, -1); } if (code >= 0) { cs_full_init_color(pgs->ccolor, pcs); cs_old.type->adjust_color_count(&cc_old, &cs_old, -1); gx_unset_dev_color(pgs); } return code; }
/* setcolor */ int gs_setcolor(gs_state * pgs, const gs_client_color * pcc) { gs_color_space * pcs = pgs->color[0].color_space; gs_client_color cc_old = *pgs->color[0].ccolor; gx_device_color *dev_color = pgs->color[0].dev_color; bool do_unset = true; if (pgs->in_cachedevice) return_error(gs_error_undefined); /* PLRM3 page 215. */ if (dev_color->ccolor_valid && gx_dc_is_pure(dev_color)) { /* change of colorspace will set type to _none */ int i; int ncomps = cs_num_components(pcs); for(i=0; i < ncomps; i++) if (dev_color->ccolor.paint.values[i] != pcc->paint.values[i]) break; do_unset = i < ncomps; /* if i == ncomps, color unchanged, optimized */ } if (do_unset) gx_unset_dev_color(pgs); (*pcs->type->adjust_color_count)(pcc, pcs, 1); *pgs->color[0].ccolor = *pcc; (*pcs->type->restrict_color)(pgs->color[0].ccolor, pcs); (*pcs->type->adjust_color_count)(&cc_old, pcs, -1); return 0; }
/* setalpha */ int gs_setalpha(gs_state * pgs, floatp alpha) { pgs->alpha = (gx_color_value) (alpha < 0 ? 0 : alpha > 1 ? gx_max_color_value : alpha * gx_max_color_value); gx_unset_dev_color(pgs); return 0; }
/* Remap=0 is used by the interpreter. */ int gs_setcolortransfer_remap(gs_gstate * pgs, gs_mapping_proc red_proc, gs_mapping_proc green_proc, gs_mapping_proc blue_proc, gs_mapping_proc gray_proc, bool remap) { gx_transfer *ptran = &pgs->set_transfer; gx_transfer old; gs_id new_ids = gs_next_ids(pgs->memory, 4); gx_device * dev = pgs->device; old = *ptran; rc_unshare_struct(ptran->gray, gx_transfer_map, &st_transfer_map, pgs->memory, goto fgray, "gs_setcolortransfer"); rc_unshare_struct(ptran->red, gx_transfer_map, &st_transfer_map, pgs->memory, goto fred, "gs_setcolortransfer"); rc_unshare_struct(ptran->green, gx_transfer_map, &st_transfer_map, pgs->memory, goto fgreen, "gs_setcolortransfer"); rc_unshare_struct(ptran->blue, gx_transfer_map, &st_transfer_map, pgs->memory, goto fblue, "gs_setcolortransfer"); ptran->gray->proc = gray_proc; ptran->gray->id = new_ids; ptran->red->proc = red_proc; ptran->red->id = new_ids + 1; ptran->green->proc = green_proc; ptran->green->id = new_ids + 2; ptran->blue->proc = blue_proc; ptran->blue->id = new_ids + 3; ptran->red_component_num = gs_color_name_component_number(dev, "Red", 3, ht_type_colorscreen); ptran->green_component_num = gs_color_name_component_number(dev, "Green", 5, ht_type_colorscreen); ptran->blue_component_num = gs_color_name_component_number(dev, "Blue", 4, ht_type_colorscreen); ptran->gray_component_num = gs_color_name_component_number(dev, "Gray", 4, ht_type_colorscreen); if (remap) { load_transfer_map(pgs, ptran->red, 0.0); load_transfer_map(pgs, ptran->green, 0.0); load_transfer_map(pgs, ptran->blue, 0.0); load_transfer_map(pgs, ptran->gray, 0.0); gx_set_effective_transfer(pgs); gx_unset_dev_color(pgs); } else gx_set_effective_transfer(pgs); return 0; fblue: rc_assign(ptran->green, old.green, "setcolortransfer"); fgreen: rc_assign(ptran->red, old.red, "setcolortransfer"); fred: rc_assign(ptran->gray, old.gray, "setcolortransfer"); fgray: return_error(gs_error_VMerror); }
/* setcmykcolor */ int gs_setcmykcolor(gs_state *pgs, floatp c, floatp m, floatp y, floatp k) { gs_client_color *pcc = pgs->ccolor; if ( pgs->in_cachedevice ) return_error(gs_error_undefined); cs_adjust_counts(pgs, -1); pcc->paint.values[0] = c; pcc->paint.values[1] = m; pcc->paint.values[2] = y; pcc->paint.values[3] = k; pcc->pattern = 0; /* for GC */ pgs->color_space->type = &gs_color_space_type_DeviceCMYK; gx_unset_dev_color(pgs); return 0; }
int gs_setundercolorremoval_remap(gs_state *pgs, gs_mapping_proc proc, bool remap) { rc_unshare_struct(pgs->undercolor_removal, gx_transfer_map, &st_transfer_map, pgs->memory, return_error(gs_error_VMerror), "gs_setundercolorremoval"); pgs->undercolor_removal->proc = proc; pgs->undercolor_removal->id = gs_next_ids(1); if ( remap ) { load_transfer_map(pgs, pgs->undercolor_removal, -1.0); gx_unset_dev_color(pgs); } return 0; }
int gs_setblackgeneration_remap(gs_state *pgs, gs_mapping_proc proc, bool remap) { rc_unshare_struct(pgs->black_generation, gx_transfer_map, &st_transfer_map, pgs->memory, return_error(gs_error_VMerror), "gs_setblackgeneration"); pgs->black_generation->proc = proc; pgs->black_generation->id = gs_next_ids(1); if ( remap ) { load_transfer_map(pgs, pgs->black_generation, 0.0); gx_unset_dev_color(pgs); } return 0; }
/* setcolorspace */ int gs_setcolorspace(gs_state * pgs, gs_color_space * pcs) { int code = 0; code = gs_setcolorspace_only(pgs, pcs); if (code >= 0) { pgs->color[0].color_space->pclient_color_space_data = pcs->pclient_color_space_data; cs_full_init_color(pgs->color[0].ccolor, pcs); gx_unset_dev_color(pgs); } return code; }
/* setcolor */ int gs_setcolor(gs_state * pgs, const gs_client_color * pcc) { gs_color_space * pcs = pgs->color_space; gs_client_color cc_old = *pgs->ccolor; if (pgs->in_cachedevice) return_error(gs_error_undefined); /* PLRM3 page 215. */ gx_unset_dev_color(pgs); (*pcs->type->adjust_color_count)(pcc, pcs, 1); *pgs->ccolor = *pcc; (*pcs->type->restrict_color)(pgs->ccolor, pcs); (*pcs->type->adjust_color_count)(&cc_old, pcs, -1); return 0; }
/* Remap=0 is used by the interpreter. */ int gs_setcolortransfer_remap(gs_state *pgs, gs_mapping_proc red_proc, gs_mapping_proc green_proc, gs_mapping_proc blue_proc, gs_mapping_proc gray_proc, bool remap) { gx_transfer_colored *ptran = &pgs->set_transfer.colored; gx_transfer_colored old; gs_id new_ids = gs_next_ids(4); old = *ptran; rc_unshare_struct(ptran->gray, gx_transfer_map, &st_transfer_map, pgs->memory, goto fgray, "gs_setcolortransfer"); rc_unshare_struct(ptran->red, gx_transfer_map, &st_transfer_map, pgs->memory, goto fred, "gs_setcolortransfer"); rc_unshare_struct(ptran->green, gx_transfer_map, &st_transfer_map, pgs->memory, goto fgreen, "gs_setcolortransfer"); rc_unshare_struct(ptran->blue, gx_transfer_map, &st_transfer_map, pgs->memory, goto fblue, "gs_setcolortransfer"); ptran->gray->proc = gray_proc; ptran->gray->id = new_ids; ptran->red->proc = red_proc; ptran->red->id = new_ids + 1; ptran->green->proc = green_proc; ptran->green->id = new_ids + 2; ptran->blue->proc = blue_proc; ptran->blue->id = new_ids + 3; if ( remap ) { load_transfer_map(pgs, ptran->red, 0.0); load_transfer_map(pgs, ptran->green, 0.0); load_transfer_map(pgs, ptran->blue, 0.0); load_transfer_map(pgs, ptran->gray, 0.0); gx_set_effective_transfer(pgs); gx_unset_dev_color(pgs); } return 0; fblue: rc_assign(ptran->green, old.green, "setcolortransfer"); fgreen: rc_assign(ptran->red, old.red, "setcolortransfer"); fred: rc_assign(ptran->gray, old.gray, "setcolortransfer"); fgray: return_error(gs_error_VMerror); }
/* This does all the work of setpattern except for the final setcolor. */ int gs_setpatternspace(gs_state * pgs) { int code = 0; if (pgs->in_cachedevice) return_error(gs_error_undefined); if (pgs->color_space->type->index != gs_color_space_index_Pattern) { gs_color_space *pcs; pcs = gs_cspace_alloc(pgs->memory, &gs_color_space_type_Pattern); if (pcs == NULL) return_error(gs_error_VMerror); /* reference to base space shifts from pgs to pcs with no net change */ pcs->base_space = pgs->color_space; pcs->params.pattern.has_base_space = true; pgs->color_space = pcs; cs_full_init_color(pgs->ccolor, pcs); gx_unset_dev_color(pgs); } return code; }
/* setcmykcolor */ int gs_setcmykcolor(gs_gstate * pgs, double c, double m, double y, double k) { gs_color_space *pcs; int code; pcs = gs_cspace_new_DeviceCMYK(pgs->memory); if (pcs == NULL) return_error(gs_error_VMerror); if ((code = gs_setcolorspace(pgs, pcs)) >= 0) { gs_client_color *pcc = gs_currentcolor_inline(pgs); cs_adjust_color_count(pgs, -1); /* not strictly necessary */ pcc->paint.values[0] = FORCE_UNIT(c); pcc->paint.values[1] = FORCE_UNIT(m); pcc->paint.values[2] = FORCE_UNIT(y); pcc->paint.values[3] = FORCE_UNIT(k); pcc->pattern = 0; /* for GC */ gx_unset_dev_color(pgs); } rc_decrement_only_cs(pcs, "gs_setcmykcolor"); return code; }