Esempio n. 1
0
/* setcolorspace */
int
gs_setcolorspace(gs_state * pgs, const gs_color_space * pcs)
{
    int             code = 0;
    gs_color_space  cs_old = *pgs->color_space;
    gs_client_color cc_old = *pgs->ccolor;

    if (pgs->in_cachedevice)
	return_error(gs_error_undefined);

    if (pcs->id != pgs->color_space->id) {
        pcs->type->adjust_cspace_count(pcs, 1);
        *pgs->color_space = *pcs;
        if ( (code = pcs->type->install_cspace(pcs, pgs)) < 0          ||
              (pgs->overprint && (code = gs_do_set_overprint(pgs)) < 0)  ) {
            *pgs->color_space = cs_old;
            pcs->type->adjust_cspace_count(pcs, -1);
        } else
            cs_old.type->adjust_cspace_count(&cs_old, -1);
    }

    if (code >= 0) {
        cs_full_init_color(pgs->ccolor, pcs);
        cs_old.type->adjust_color_count(&cc_old, &cs_old, -1);
        gx_unset_dev_color(pgs);
    }

    return code;
}
Esempio n. 2
0
/*
 * Push a PDF 1.4 transparency compositor onto the current device. Note that
 * if the current device already is a PDF 1.4 transparency compositor, the
 * create_compositor will update its parameters but not create a new
 * compositor device.
 */
static int
gs_state_update_pdf14trans(gs_state * pgs, gs_pdf14trans_params_t * pparams)
{
    gs_imager_state * pis = (gs_imager_state *)pgs;
    gx_device * dev = pgs->device;
    gx_device *pdf14dev = NULL;
    int code;
    int curr_num = dev->color_info.num_components;

    /*
     * Send the PDF 1.4 create compositor action specified by the parameters.
     */
    code = send_pdf14trans(pis, dev, &pdf14dev, pparams, pgs->memory);
    if (code < 0)
        return code;
    /*
     * If we created a new PDF 1.4 compositor device then we need to install it
     * into the graphics state.
     */
    if (pdf14dev != dev) {
        gx_set_device_only(pgs, pdf14dev);
    }

    /* If we had a color space change and we are in overprint, then we need to
       update the drawn_comps */
    if (pgs->overprint && curr_num != pdf14dev->color_info.num_components) {
        code = gs_do_set_overprint(pgs);
    }

    return code;
}
Esempio n. 3
0
/* ---------------- General colors and color spaces ---------------- */
int
gs_setcolorspace_only(gs_state * pgs, gs_color_space * pcs)
{
    int             code = 0;
    gs_color_space  *cs_old = pgs->color[0].color_space;
    gs_client_color cc_old = *pgs->color[0].ccolor;

    if (pgs->in_cachedevice)
        return_error(gs_error_undefined);

    if (pcs->id != cs_old->id) {
        rc_increment_cs(pcs);
        pgs->color[0].color_space = pcs;
        if ( (code = pcs->type->install_cspace(pcs, pgs)) < 0          ||
              (pgs->overprint && (code = gs_do_set_overprint(pgs)) < 0)  ) {
            pgs->color[0].color_space = cs_old;
            rc_decrement_only_cs(pcs, "gs_setcolorspace");
        } else {
            cs_old->type->adjust_color_count(&cc_old, cs_old, -1);
            rc_decrement_only_cs(cs_old, "gs_setcolorspace");
        }
    }
    return(code);
}