/* 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; }
/* * Push a PDF 1.4 transparency compositor onto the current device. Note that * if the current device already is a PDF 1.4 transparency compositor, the * create_compositor will update its parameters but not create a new * compositor device. */ static int gs_state_update_pdf14trans(gs_state * pgs, gs_pdf14trans_params_t * pparams) { gs_imager_state * pis = (gs_imager_state *)pgs; gx_device * dev = pgs->device; gx_device *pdf14dev = NULL; int code; int curr_num = dev->color_info.num_components; /* * Send the PDF 1.4 create compositor action specified by the parameters. */ code = send_pdf14trans(pis, dev, &pdf14dev, pparams, pgs->memory); if (code < 0) return code; /* * If we created a new PDF 1.4 compositor device then we need to install it * into the graphics state. */ if (pdf14dev != dev) { gx_set_device_only(pgs, pdf14dev); } /* If we had a color space change and we are in overprint, then we need to update the drawn_comps */ if (pgs->overprint && curr_num != pdf14dev->color_info.num_components) { code = gs_do_set_overprint(pgs); } return code; }
/* ---------------- General colors and color spaces ---------------- */ int gs_setcolorspace_only(gs_state * pgs, gs_color_space * pcs) { int code = 0; gs_color_space *cs_old = pgs->color[0].color_space; gs_client_color cc_old = *pgs->color[0].ccolor; if (pgs->in_cachedevice) return_error(gs_error_undefined); if (pcs->id != cs_old->id) { rc_increment_cs(pcs); pgs->color[0].color_space = pcs; if ( (code = pcs->type->install_cspace(pcs, pgs)) < 0 || (pgs->overprint && (code = gs_do_set_overprint(pgs)) < 0) ) { pgs->color[0].color_space = cs_old; rc_decrement_only_cs(pcs, "gs_setcolorspace"); } else { cs_old->type->adjust_color_count(&cc_old, cs_old, -1); rc_decrement_only_cs(cs_old, "gs_setcolorspace"); } } return(code); }