/* Add a /Range entry to a CIE-based color space dictionary. */ static int pdf_cie_add_ranges(cos_dict_t *pcd, const gs_range *prange, int n, bool clamp) { cos_array_t *pca = cos_array_alloc(pcd->pdev, "pdf_cie_add_ranges"); int code = 0, i; if (pca == 0) return_error(gs_error_VMerror); for (i = 0; i < n; ++i) { floatp rmin = prange[i].rmin, rmax = prange[i].rmax; if (clamp) { if (rmin < 0) rmin = 0; if (rmax > 1) rmax = 1; } if ((code = cos_array_add_real(pca, rmin)) < 0 || (code = cos_array_add_real(pca, rmax)) < 0 ) break; } if (code >= 0) code = cos_dict_put_c_key_object(pcd, "/Range", COS_OBJECT(pca)); if (code < 0) COS_FREE(pca, "pdf_cie_add_ranges"); return code; }
static int pdf_make_form_dict(gx_device_pdf * pdev, const gs_pdf14trans_params_t * pparams, const gs_imager_state * pis, const cos_dict_t *group_dict, cos_dict_t *form_dict) { cos_array_t *bbox_array; float bbox[4]; gs_rect bbox_rect; int code; code = gs_bbox_transform(&pparams->bbox, &ctm_only(pis), &bbox_rect); if (code < 0) return code; bbox[0] = bbox_rect.p.x; bbox[1] = bbox_rect.p.y; bbox[2] = bbox_rect.q.x; bbox[3] = bbox_rect.q.y; code = cos_dict_put_c_key_string(form_dict, "/Type", (const byte *)"/XObject", 8); if (code < 0) return code; code = cos_dict_put_c_key_string(form_dict, "/Subtype", (const byte *)"/Form", 5); if (code < 0) return code; code = cos_dict_put_c_key_int(form_dict, "/FormType", 1); if (code < 0) return code; code = cos_dict_put_c_key_string(form_dict, "/Matrix", (const byte *)"[1 0 0 1 0 0]", 13); if (code < 0) return code; bbox_array = cos_array_from_floats(pdev, bbox, 4, "pdf_begin_transparency_group"); if (bbox_array == NULL) return_error(gs_error_VMerror); code = cos_dict_put_c_key_object(form_dict, "/BBox", (cos_object_t *)bbox_array); if (code < 0) return code; return cos_dict_put_c_key_object(form_dict, "/Group", (cos_object_t *)group_dict); }
static int cos_dict_put_c_key_vector3(cos_dict_t *pcd, const char *key, const gs_vector3 *pvec) { cos_array_t *pca = cos_array_alloc(pcd->pdev, "cos_array_from_vector3"); int code; if (pca == 0) return_error(gs_error_VMerror); code = cos_array_add_vector3(pca, pvec); if (code < 0) { COS_FREE(pca, "cos_array_from_vector3"); return code; } return cos_dict_put_c_key_object(pcd, key, COS_OBJECT(pca)); }
static int pdf_make_soft_mask_dict(gx_device_pdf * pdev, const gs_pdf14trans_params_t * pparams) { pdf_resource_t *pres_soft_mask_dict = 0; cos_dict_t *soft_mask_dict; int code; /* Fixme : merge redundant objects. */ code = pdf_alloc_resource(pdev, resourceSoftMaskDict, gs_no_id, &pres_soft_mask_dict, -1); if (code < 0) return code; cos_become(pres_soft_mask_dict->object, cos_type_dict); pdev->pres_soft_mask_dict = pres_soft_mask_dict; soft_mask_dict = (cos_dict_t *)pres_soft_mask_dict->object; code = cos_dict_put_c_key_string(soft_mask_dict, "/S", pparams->subtype == TRANSPARENCY_MASK_Alpha ? (byte *)"/Alpha" : (byte *)"/Luminosity", pparams->subtype == TRANSPARENCY_MASK_Alpha ? 6 : 11); if (code < 0) return code; if (pparams->Background_components) { cos_array_t *Background; Background = cos_array_from_floats(pdev, pparams->Background, pparams->Background_components, "pdf_write_soft_mask_dict"); if (Background == NULL) return_error(gs_error_VMerror); code = cos_dict_put_c_key_object(soft_mask_dict, "/BC", (cos_object_t *)Background); if (code < 0) return code; } if (pparams->transfer_function != NULL) { long id; char buf[20]; code = pdf_write_function(pdev, pparams->transfer_function, &id); if (code < 0) return code; sprintf(buf, " %ld 0 R", id); code = cos_dict_put_c_key_string(soft_mask_dict, "/TR", (const byte *)buf, strlen(buf)); if (code < 0) return code; } return 0; }
static int pdf_pattern(gx_device_pdf *pdev, const gx_drawing_color *pdc, const gx_color_tile *p_tile, const gx_color_tile *m_tile, cos_stream_t *pcs_image, pdf_resource_t **ppres) { pdf_resource_t *pres; int code = pdf_alloc_resource(pdev, resourcePattern, pdc->mask.id, ppres, 0L); cos_stream_t *pcos; cos_dict_t *pcd; cos_dict_t *pcd_Resources = cos_dict_alloc(pdev, "pdf_pattern(Resources)"); const gx_color_tile *tile = (p_tile ? p_tile : m_tile); const gx_strip_bitmap *btile = (p_tile ? &p_tile->tbits : &m_tile->tmask); bool mask = p_tile == 0; gs_point step; gs_matrix smat; if (code < 0) return code; if (!tile_size_ok(pdev, p_tile, m_tile)) return_error(gs_error_limitcheck); /* * We currently can't handle Patterns whose X/Y step isn't parallel * to the coordinate axes. */ if (is_xxyy(&tile->step_matrix)) step.x = tile->step_matrix.xx, step.y = tile->step_matrix.yy; else if (is_xyyx(&tile->step_matrix)) step.x = tile->step_matrix.yx, step.y = tile->step_matrix.xy; else return_error(gs_error_rangecheck); if (pcd_Resources == 0) return_error(gs_error_VMerror); gs_make_identity(&smat); smat.xx = btile->rep_width / (pdev->HWResolution[0] / 72.0); smat.yy = btile->rep_height / (pdev->HWResolution[1] / 72.0); smat.tx = tile->step_matrix.tx / (pdev->HWResolution[0] / 72.0); smat.ty = tile->step_matrix.ty / (pdev->HWResolution[1] / 72.0); pres = *ppres; { cos_dict_t *pcd_XObject = cos_dict_alloc(pdev, "pdf_pattern(XObject)"); char key[MAX_REF_CHARS + 3]; cos_value_t v; if (pcd_XObject == 0) return_error(gs_error_VMerror); sprintf(key, "/R%ld", pcs_image->id); COS_OBJECT_VALUE(&v, pcs_image); if ((code = cos_dict_put(pcd_XObject, (byte *)key, strlen(key), &v)) < 0 || (code = cos_dict_put_c_key_object(pcd_Resources, "/XObject", COS_OBJECT(pcd_XObject))) < 0 ) return code; } if ((code = cos_dict_put_c_strings(pcd_Resources, "/ProcSet", (mask ? "[/PDF/ImageB]" : "[/PDF/ImageC]"))) < 0) return code; cos_become(pres->object, cos_type_stream); pcos = (cos_stream_t *)pres->object; pcd = cos_stream_dict(pcos); if ((code = cos_dict_put_c_key_int(pcd, "/PatternType", 1)) < 0 || (code = cos_dict_put_c_key_int(pcd, "/PaintType", (mask ? 2 : 1))) < 0 || (code = cos_dict_put_c_key_int(pcd, "/TilingType", tile->tiling_type)) < 0 || (code = cos_dict_put_c_key_object(pcd, "/Resources", COS_OBJECT(pcd_Resources))) < 0 || (code = cos_dict_put_c_strings(pcd, "/BBox", "[0 0 1 1]")) < 0 || (code = cos_dict_put_matrix(pcd, "/Matrix", &smat)) < 0 || (code = cos_dict_put_c_key_real(pcd, "/XStep", step.x / btile->rep_width)) < 0 || (code = cos_dict_put_c_key_real(pcd, "/YStep", step.y / btile->rep_height)) < 0 ) { return code; } { char buf[MAX_REF_CHARS + 6 + 1]; /* +6 for /R# Do\n */ sprintf(buf, "/R%ld Do\n", pcs_image->id); cos_stream_add_bytes(pcos, (const byte *)buf, strlen(buf)); } return 0; }