/* ---------------- 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); }
/* 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; }
int gs_begin_transparency_mask(gs_state * pgs, const gs_transparency_mask_params_t * ptmp, const gs_rect * pbbox, bool mask_is_image) { gs_pdf14trans_params_t params = { 0 }; gs_pdf14trans_params_t params_color = { 0 }; const int l = sizeof(params.Background[0]) * ptmp->Background_components; int i, code; gs_color_space *blend_color_space; gsicc_manager_t *icc_manager = pgs->icc_manager; if (check_for_nontrans_pattern(pgs, (unsigned char *)"gs_pop_transparency_state")) { return(0); } params.pdf14_op = PDF14_BEGIN_TRANS_MASK; params.bbox = *pbbox; params.subtype = ptmp->subtype; params.Background_components = ptmp->Background_components; memcpy(params.Background, ptmp->Background, l); params.GrayBackground = ptmp->GrayBackground; params.transfer_function = ptmp->TransferFunction_data; params.function_is_identity = (ptmp->TransferFunction == mask_transfer_identity); params.mask_is_image = mask_is_image; params.replacing = ptmp->replacing; /* The eventual state that we want this smask to be moved to is always gray. This should provide us with a significant speed improvement over the old code. This does not keep us from having groups within the softmask getting blended in different color spaces, it just makes the final space be gray, which is what we will need to get to eventually anyway. In this way we avoid a final color conversion on a potentially large buffer. */ /* Also check if we have loaded in the transparency icc profiles. If not go ahead and take care of that now */ if (icc_manager->smask_profiles == NULL) { code = gsicc_initialize_iccsmask(icc_manager); if (code < 0) return(code); } /* A new soft mask group, make sure the profiles are set */ if_debug0m('v', pgs->memory, "[v]pushing soft mask color sending\n"); if (params.subtype != TRANSPARENCY_MASK_None) { params_color.pdf14_op = PDF14_PUSH_SMASK_COLOR; code = gs_state_update_pdf14trans(pgs, ¶ms_color); if (code < 0) return(code); blend_color_space = gs_cspace_new_DeviceGray(pgs->memory); blend_color_space->cmm_icc_profile_data = pgs->icc_manager->default_gray; rc_increment(blend_color_space->cmm_icc_profile_data); if_debug8m('v', pgs->memory, "[v](0x%lx)gs_begin_transparency_mask [%g %g %g %g]\n\ subtype = %d Background_components = %d %s\n", (ulong)pgs, pbbox->p.x, pbbox->p.y, pbbox->q.x, pbbox->q.y, (int)ptmp->subtype, ptmp->Background_components, (ptmp->TransferFunction == mask_transfer_identity ? "no TR" : "has TR")); /* Sample the transfer function */ for (i = 0; i < MASK_TRANSFER_FUNCTION_SIZE; i++) { float in = (float)(i * (1.0 / (MASK_TRANSFER_FUNCTION_SIZE - 1))); float out; ptmp->TransferFunction(in, &out, ptmp->TransferFunction_data); params.transfer_fn[i] = (byte)floor((double)(out * 255 + 0.5)); } /* Note: This function is called during the c-list writer side. */ if ( blend_color_space->cmm_icc_profile_data != NULL ) { /* Blending space is ICC based. If we are doing c-list rendering we will need to write this color space into the clist. */ params.group_color = ICC; params.group_color_numcomps = blend_color_space->cmm_icc_profile_data->num_comps; /* Get the ICC profile */ /* We don't reference count this - see comment in * pdf14_update_device_color_procs_pop_c() */ params.iccprofile = blend_color_space->cmm_icc_profile_data; params.icc_hash = blend_color_space->cmm_icc_profile_data->hashcode; } else { params.group_color = GRAY_SCALE; params.group_color_numcomps = 1; /* Need to check */ } /* Explicitly decrement the profile data since blend_color_space may not * be an ICC color space object. */ rc_decrement(blend_color_space->cmm_icc_profile_data, "gs_begin_transparency_mask"); rc_decrement_only_cs(blend_color_space, "gs_begin_transparency_mask"); }
/* Common framework for building shadings. */ static int build_shading(i_ctx_t *i_ctx_p, build_shading_proc_t proc) { os_ptr op = osp; int code; float box[4]; gs_shading_params_t params; gs_shading_t *psh; ref *pvalue; check_type(*op, t_dictionary); params.ColorSpace = 0; params.cie_joint_caches = 0; params.Background = 0; /* Collect parameters common to all shading types. */ { gs_color_space *pcs = gs_currentcolorspace(igs); int num_comp = gs_color_space_num_components(pcs); if (num_comp < 0) { /* Pattern color space */ gs_errorinfo_put_pair_from_dict(i_ctx_p, op, "ColorSpace"); return_error(gs_error_typecheck); } params.ColorSpace = pcs; rc_increment_cs(pcs); if (dict_find_string(op, "Background", &pvalue) > 0) { gs_client_color *pcc = ialloc_struct(gs_client_color, &st_client_color, "build_shading"); if (pcc == 0) { code = gs_note_error(gs_error_VMerror); goto fail; } pcc->pattern = 0; params.Background = pcc; code = dict_floats_param(imemory, op, "Background", gs_color_space_num_components(pcs), pcc->paint.values, NULL); if (code < 0) { gs_errorinfo_put_pair_from_dict(i_ctx_p, op, "Background"); goto fail; } } } if (dict_find_string(op, "BBox", &pvalue) <= 0) params.have_BBox = false; else if ((code = dict_floats_param(imemory, op, "BBox", 4, box, NULL)) == 4) { /* Adobe Interpreters accept denormalised BBox - bug 688937 */ if (box[0] <= box[2]) { params.BBox.p.x = box[0]; params.BBox.q.x = box[2]; } else { params.BBox.p.x = box[2]; params.BBox.q.x = box[0]; } if (box[1] <= box[3]) { params.BBox.p.y = box[1]; params.BBox.q.y = box[3]; } else { params.BBox.p.y = box[3]; params.BBox.q.y = box[1]; } params.have_BBox = true; } else { gs_errorinfo_put_pair_from_dict(i_ctx_p, op, "BBox"); goto fail; } code = dict_bool_param(op, "AntiAlias", false, ¶ms.AntiAlias); if (code < 0) { gs_errorinfo_put_pair_from_dict(i_ctx_p, op, "AntiAlias"); goto fail; } /* Finish building the shading. */ code = (*proc)(i_ctx_p, op, ¶ms, &psh, imemory); if (code < 0) goto fail; if (gx_color_space_needs_cie_caches(psh->params.ColorSpace)) { rc_decrement(psh->params.cie_joint_caches, "build_shading"); psh->params.cie_joint_caches = gx_currentciecaches(igs); rc_increment(psh->params.cie_joint_caches); } make_istruct_new(op, 0, psh); return code; fail: gs_free_object(imemory, params.Background, "Background"); if (params.ColorSpace) { rc_decrement_only_cs(params.ColorSpace, "build_shading"); } return (code < 0 ? code : gs_note_error(gs_error_rangecheck)); }