Exemple #1
0
/* 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;
}
Exemple #2
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);
}