/* Intersect a clipping path a shading BBox. */ int gx_dc_pattern2_clip_with_bbox(const gx_device_color * pdevc, gx_device * pdev, gx_clip_path *cpath_local, const gx_clip_path **ppcpath1) { if (gx_dc_is_pattern2_color(pdevc) && gx_dc_pattern2_color_has_bbox(pdevc) && (*dev_proc(pdev, dev_spec_op))(pdev, gxdso_pattern_shading_area, NULL, 0) == 0) { gs_pattern2_instance_t *pinst = (gs_pattern2_instance_t *)pdevc->ccolor.pattern; gx_path box_path; gs_memory_t *mem = (*ppcpath1 != NULL ? (*ppcpath1)->path.memory : pdev->memory); int code; gx_path_init_local(&box_path, mem); code = gx_dc_shading_path_add_box(&box_path, pdevc); if (code == gs_error_limitcheck) { /* Ignore huge BBox - bug 689027. */ code = 0; } else { if (code >= 0) { gx_cpath_init_local_shared(cpath_local, *ppcpath1, mem); code = gx_cpath_intersect(cpath_local, &box_path, gx_rule_winding_number, (gs_imager_state *)pinst->saved); *ppcpath1 = cpath_local; } } gx_path_free(&box_path, "gx_default_fill_path(path_bbox)"); } return 0; }
/* Check whether color is a shading with BBox. */ int gx_dc_pattern2_is_rectangular_cell(const gx_device_color * pdevc, gx_device * pdev, gs_fixed_rect *rect) { if (gx_dc_is_pattern2_color(pdevc) && gx_dc_pattern2_color_has_bbox(pdevc) && (*dev_proc(pdev, dev_spec_op))(pdev, gxdso_pattern_shading_area, NULL, 0) == 0) { gs_pattern2_instance_t *pinst = (gs_pattern2_instance_t *)pdevc->ccolor.pattern; const gs_shading_t *psh = pinst->templat.Shading; gs_fixed_point p, q; if (is_xxyy(&ctm_only(pinst->saved))) if (psh->params.have_BBox) { int code = gs_point_transform2fixed(&pinst->saved->ctm, psh->params.BBox.p.x, psh->params.BBox.p.y, &p); if (code < 0) return code; code = gs_point_transform2fixed(&pinst->saved->ctm, psh->params.BBox.q.x, psh->params.BBox.q.y, &q); if (code < 0) return code; if (p.x > q.x) { p.x ^= q.x; q.x ^= p.x; p.x ^= q.x; } if (p.y > q.y) { p.y ^= q.y; q.y ^= p.y; p.y ^= q.y; } rect->p = p; rect->q = q; return 1; } } return 0; }
/* * Compare two saved colors to check if match. * This routine used to be a simple memcmp(), but * that is insufficient, the checks must be explicit. */ bool gx_hld_saved_color_equal(const gx_hl_saved_color * psc1, const gx_hl_saved_color * psc2) { int i; if (psc1->saved_dev_color.type != psc2->saved_dev_color.type || psc1->color_space_id != psc2->color_space_id || psc1->pattern_id != psc2->pattern_id || psc1->ccolor_valid != psc2->ccolor_valid || psc1->ccolor.pattern != psc2->ccolor.pattern || psc1->saved_dev_color.phase.x != psc2->saved_dev_color.phase.x || psc1->saved_dev_color.phase.y != psc2->saved_dev_color.phase.y) { return(false); } for (i = 0; i < GX_DEVICE_COLOR_MAX_COMPONENTS; i++) { if (psc1->ccolor.paint.values[i] != psc2->ccolor.paint.values[i]) { return(false); } } /* NAFF: only gx_dc_pure_masked doesn't have a type checker */ if (gx_dc_is_pure(&psc1->saved_dev_color) || psc1->saved_dev_color.type == &gx_dc_pure_masked) { if (psc1->saved_dev_color.colors.pure != psc2->saved_dev_color.colors.pure) { return(false); } } else if (gx_dc_is_binary_halftone(&psc1->saved_dev_color)) { if ((psc1->saved_dev_color.colors.binary.b_color[0] != psc2->saved_dev_color.colors.binary.b_color[0]) || (psc1->saved_dev_color.colors.binary.b_color[1] != psc2->saved_dev_color.colors.binary.b_color[1]) || (psc1->saved_dev_color.colors.binary.b_level != psc2->saved_dev_color.colors.binary.b_level) || (psc1->saved_dev_color.colors.binary.b_index != psc2->saved_dev_color.colors.binary.b_index)) { return(false); } } else if (gx_dc_is_colored_halftone(&psc1->saved_dev_color)) { for (i = 0; i < GX_DEVICE_COLOR_MAX_COMPONENTS; i++) { if (psc1->saved_dev_color.colors.colored.c_base[i] != psc2->saved_dev_color.colors.colored.c_base[i] || psc1->saved_dev_color.colors.colored.c_level[i] != psc2->saved_dev_color.colors.colored.c_level[i]) { return(false); } } } else if (gx_dc_is_devn(&psc1->saved_dev_color)) { for (i = 0; i < GX_DEVICE_COLOR_MAX_COMPONENTS; i++) { if (psc1->saved_dev_color.colors.devn.values[i] != psc2->saved_dev_color.colors.devn.values[i]) { return(false); } } } else if (gx_dc_is_pattern1_color((gx_device_color *)(&psc1->saved_dev_color.type))) { if (psc1->saved_dev_color.colors.pattern.id != psc2->saved_dev_color.colors.pattern.id || psc1->saved_dev_color.colors.pattern.phase.x != psc2->saved_dev_color.colors.pattern.phase.x || psc1->saved_dev_color.colors.pattern.phase.y != psc2->saved_dev_color.colors.pattern.phase.y) { return(false); } } else if (gx_dc_is_pattern2_color((gx_device_color *)(&psc1->saved_dev_color.type))) { if (psc1->saved_dev_color.colors.pattern2.id != psc2->saved_dev_color.colors.pattern2.id || psc1->saved_dev_color.colors.pattern2.shfill != psc2->saved_dev_color.colors.pattern2.shfill) { return(false); } } return (true); }