/* * Push the current local namespace onto the namespace stack, and reset it * to an empty namespace. */ int pdf_push_namespace(gx_device_pdf *pdev) { int code = cos_array_add_object(pdev->Namespace_stack, COS_OBJECT(pdev->local_named_objects)); cos_dict_t *pcd = cos_dict_alloc(pdev, "pdf_push_namespace(local_named_objects)"); cos_array_t *pca = cos_array_alloc(pdev, "pdf_push_namespace(NI_stack)"); if (code < 0 || (code = cos_array_add_object(pdev->Namespace_stack, COS_OBJECT(pdev->NI_stack))) < 0 ) return code; if (pcd == 0 || pca == 0) return_error(gs_error_VMerror); pdev->local_named_objects = pcd; pdev->NI_stack = pca; return 0; }
/* * Finish creating a CIE-based color space (Calxxx or Lab.) * This procedure is exported for gdevpdfk.c. */ int pdf_finish_cie_space(cos_array_t *pca, cos_dict_t *pcd, const gs_cie_common *pciec) { int code = cos_dict_put_c_key_vector3(pcd, "/WhitePoint", &pciec->points.WhitePoint); if (code < 0) return code; if (pciec->points.BlackPoint.u != 0 || pciec->points.BlackPoint.v != 0 || pciec->points.BlackPoint.w != 0 ) { code = cos_dict_put_c_key_vector3(pcd, "/BlackPoint", &pciec->points.BlackPoint); if (code < 0) return code; } return cos_array_add_object(pca, COS_OBJECT(pcd)); }
/* * Create an ICCBased color space object (internal). The client must write * the profile data on *ppcstrm. */ static int pdf_make_iccbased(gx_device_pdf *pdev, cos_array_t *pca, int ncomps, const gs_range *prange /*[4]*/, const gs_color_space *pcs_alt, cos_stream_t **ppcstrm, const gs_range_t **pprange /* if scaling is needed */) { cos_value_t v; int code; cos_stream_t * pcstrm = 0; cos_array_t * prngca = 0; bool std_ranges = true; bool scale_inputs = false; int i; /* Check the ranges. */ if (pprange) *pprange = 0; for (i = 0; i < ncomps; ++i) { double rmin = prange[i].rmin, rmax = prange[i].rmax; if (rmin < 0.0 || rmax > 1.0) { /* We'll have to scale the inputs. :-( */ if (pprange == 0) return_error(gs_error_rangecheck); /* scaling not allowed */ *pprange = prange; scale_inputs = true; } else if (rmin > 0.0 || rmax < 1.0) std_ranges = false; } /* ICCBased color spaces are essentially copied to the output. */ if ((code = cos_array_add(pca, cos_c_string_value(&v, "/ICCBased"))) < 0) return code; /* Create a stream for the output. */ if ((pcstrm = cos_stream_alloc(pdev, "pdf_make_iccbased(stream)")) == 0) { code = gs_note_error(gs_error_VMerror); goto fail; } /* Indicate the number of components. */ code = cos_dict_put_c_key_int(cos_stream_dict(pcstrm), "/N", ncomps); if (code < 0) goto fail; /* Indicate the range, if needed. */ if (!std_ranges && !scale_inputs) { code = pdf_cie_add_ranges(cos_stream_dict(pcstrm), prange, ncomps, true); if (code < 0) goto fail; } /* Output the alternate color space, if necessary. */ switch (gs_color_space_get_index(pcs_alt)) { case gs_color_space_index_DeviceGray: case gs_color_space_index_DeviceRGB: case gs_color_space_index_DeviceCMYK: break; /* implicit (default) */ default: if ((code = pdf_color_space(pdev, &v, NULL, pcs_alt, &pdf_color_space_names, false)) < 0 || (code = cos_dict_put_c_key(cos_stream_dict(pcstrm), "/Alternate", &v)) < 0 ) goto fail; } /* Wrap up. */ if ((code = cos_array_add_object(pca, COS_OBJECT(pcstrm))) < 0) goto fail; *ppcstrm = pcstrm; return code; fail: if (prngca) COS_FREE(prngca, "pdf_make_iccbased(Range)"); if (pcstrm) COS_FREE(pcstrm, "pdf_make_iccbased(stream)"); return code; }