/* * Get pointers to the current color space and client color. * * More description in src/gxhldevc.h */ gx_hld_get_color_space_and_ccolor_status gx_hld_get_color_space_and_ccolor(const gs_imager_state * pis, const gx_device_color * pdevc, const gs_color_space ** ppcs, const gs_client_color ** ppcc) { /* Check if the current color space was used to build the device color */ if (gx_hld_is_hl_color_available(pis, pdevc)) { const gs_state * pgs = gx_hld_get_gstate_ptr(pis); const gs_color_space * pcs = pgs->color_space; *ppcs = pcs; *ppcc = &(pdevc->ccolor); if (pdevc->type == gx_dc_type_pattern || pdevc->type == &gx_dc_pure_masked || pdevc->type == gx_dc_type_pattern2) return pattern_color_sapce; else { return non_pattern_color_space; } } /* No color space */ *ppcs = NULL; *ppcc = NULL; return use_process_color; }
/* * Check if a high level color is availavble. */ bool gx_hld_is_hl_color_available(const gs_imager_state * pis, const gx_device_color * pdevc) { const gs_state * pgs = gx_hld_get_gstate_ptr(pis); if (pgs != NULL && pdevc != NULL && pdevc->ccolor_valid) return true; return false; }
/* * Get the number of components in the current color space. * * More description in src/gxhldevc.h */ int gx_hld_get_number_color_components(const gs_imager_state * pis) { const gs_state * pgs = gx_hld_get_gstate_ptr(pis); if (pgs != NULL) { const gs_color_space * pcs = pgs->color_space; int n = gs_color_space_num_components(pcs); return (n >= 0 ? n : -n - 1); } else return -1; }
static int pdf_make_group_dict(gx_device_pdf * pdev, const gs_pdf14trans_params_t * pparams, const gs_imager_state * pis, cos_dict_t **pdict) { pdf_resource_t *pres_group; cos_dict_t *group_dict; int code; const gs_state *gstate = gx_hld_get_gstate_ptr(pis); cos_value_t cs_value; code = pdf_alloc_resource(pdev, resourceGroup, gs_no_id, &pres_group, -1); if (code < 0) return code; cos_become(pres_group->object, cos_type_dict); group_dict = (cos_dict_t *)pres_group->object; code = cos_dict_put_c_key_string(group_dict, "/Type", (const byte *)"/Group", 6); if (code < 0) return code; code = cos_dict_put_c_key_string(group_dict, "/S", (const byte *)"/Transparency", 13); if (code < 0) return code; if (pparams->Isolated) { code = cos_dict_put_c_key_bool(group_dict, "/I", true); if (code < 0) return code; } if (pparams->Knockout) { code = cos_dict_put_c_key_bool(group_dict, "/K", true); if (code < 0) return code; } if (gstate != NULL) { const gs_color_space *cs = gstate->color_space; code = pdf_color_space_named(pdev, &cs_value, NULL, cs, &pdf_color_space_names, false, NULL, 0); if (code < 0) return code; code = cos_dict_put_c_key(group_dict, "/CS", &cs_value); if (code < 0) return code; } group_dict = NULL; /* The next line invalidates it. */ code = pdf_substitute_resource(pdev, &pres_group, resourceGroup, NULL, false); if (code < 0) return code; *pdict = (cos_dict_t *)pres_group->object; return 0; }
static int pdf_begin_transparency_group(gs_imager_state * pis, gx_device_pdf * pdev, const gs_pdf14trans_params_t * pparams) { cos_dict_t *group_dict; bool in_page = is_in_page(pdev); const gs_state *gstate = gx_hld_get_gstate_ptr(pis); int code; if (gstate == NULL) return_error(gs_error_unregistered); /* Must not happen. */ code = pdf_make_group_dict(pdev, pparams, pis, &group_dict); if (code < 0) return code; code = pdf_open_page(pdev, PDF_IN_STREAM); if (code < 0) return code; if (pdf_must_put_clip_path(pdev, gstate->clip_path)) { code = pdf_put_clip_path(pdev, gstate->clip_path); if (code < 0) return code; } pdev->image_with_SMask = false; if (!in_page) pdev->pages[pdev->next_page].group_id = group_dict->id; else if (pparams->image_with_SMask) { /* An internal group for the image implementation. See doimagesmask in gs/lib/pdf_draw.ps . Just set a flag for skipping pdf_end_transparency_group. */ pdev->image_with_SMask = true; } else { pdf_resource_t *pres, *pres_gstate = NULL; code = pdf_prepare_drawing(pdev, pis, &pres_gstate); if (code < 0) return code; code = pdf_end_gstate(pdev, pres_gstate); if (code < 0) return code; code = pdf_enter_substream(pdev, resourceXObject, gs_no_id, &pres, false, pdev->params.CompressPages); if (code < 0) return code; return pdf_make_form_dict(pdev, pparams, pis, group_dict, (cos_dict_t *)pres->object); } return 0; }
/* * Save the device color information including the color space id and * client color data (if available). * * More description in src/gxhldevc.h */ bool gx_hld_save_color(const gs_imager_state * pis, const gx_device_color * pdevc, gx_hl_saved_color * psc) { const gs_state * pgs = gx_hld_get_gstate_ptr(pis); memset(psc, 0, sizeof(*psc)); /* clear the entire structure */ if (pdevc == NULL) { /* No device color given, should not happen */ gx_hld_saved_color_init(psc); /* revert to unknown color */ return false; } else if (pgs == NULL) { /* No color space, simply save device color specific info */ psc->color_space_id = psc->pattern_id = gs_no_id; pdevc->type->save_dc(pdevc, &(psc->saved_dev_color)); return false; } else { /* * Have color space, save id, ccolor, & device color specific info. * Also save the high level colors since two gx_color_index values * may be the same but for differing high level colors (due to the * usual lower resolution of the gx_color_index values. */ const gs_color_space * pcs = pgs->color_space; int i = gs_color_space_num_components(pcs); psc->color_space_id = pcs->id; pdevc->type->save_dc(pdevc, &(psc->saved_dev_color)); if (pdevc->type == gx_dc_type_pattern2) i = 0; else if (i < 0) i = -i - 1; /* See gx_num_components_Pattern. */ for (i--; i >= 0; i--) psc->ccolor.paint.values[i] = pdevc->ccolor.paint.values[i]; /* Save the pattern id - if present */ if ((pdevc->type == gx_dc_type_pattern || pdevc->type == gx_dc_type_pattern2) && pdevc->ccolor_valid) psc->pattern_id = pdevc->ccolor.pattern->pattern_id; else psc->pattern_id = gs_no_id; return true; } }