Ejemplo 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;
}
Ejemplo n.º 2
0
/* setcolor */
int
gs_setcolor(gs_state * pgs, const gs_client_color * pcc)
{
    gs_color_space *    pcs = pgs->color[0].color_space;
    gs_client_color     cc_old = *pgs->color[0].ccolor;
    gx_device_color *dev_color = pgs->color[0].dev_color;
    bool do_unset  = true;

    if (pgs->in_cachedevice)
        return_error(gs_error_undefined); /* PLRM3 page 215. */
    if (dev_color->ccolor_valid && gx_dc_is_pure(dev_color)) {      /* change of colorspace will set type to _none */
        int i;
        int ncomps = cs_num_components(pcs);

        for(i=0; i < ncomps; i++)
            if (dev_color->ccolor.paint.values[i] != pcc->paint.values[i])
                break;
        do_unset = i < ncomps;      /* if i == ncomps, color unchanged, optimized */
    }
    if (do_unset)
        gx_unset_dev_color(pgs);
    (*pcs->type->adjust_color_count)(pcc, pcs, 1);
    *pgs->color[0].ccolor = *pcc;
    (*pcs->type->restrict_color)(pgs->color[0].ccolor, pcs);
    (*pcs->type->adjust_color_count)(&cc_old, pcs, -1);

    return 0;
}
Ejemplo n.º 3
0
/* setalpha */
int
gs_setalpha(gs_state * pgs, floatp alpha)
{
    pgs->alpha =
	(gx_color_value) (alpha < 0 ? 0 : alpha > 1 ? gx_max_color_value :
			  alpha * gx_max_color_value);
    gx_unset_dev_color(pgs);
    return 0;
}
Ejemplo n.º 4
0
/* Remap=0 is used by the interpreter. */
int
gs_setcolortransfer_remap(gs_gstate * pgs, gs_mapping_proc red_proc,
                          gs_mapping_proc green_proc,
                          gs_mapping_proc blue_proc,
                          gs_mapping_proc gray_proc, bool remap)
{
    gx_transfer *ptran = &pgs->set_transfer;
    gx_transfer old;
    gs_id new_ids = gs_next_ids(pgs->memory, 4);
    gx_device * dev = pgs->device;

    old = *ptran;
    rc_unshare_struct(ptran->gray, gx_transfer_map, &st_transfer_map,
                      pgs->memory, goto fgray, "gs_setcolortransfer");
    rc_unshare_struct(ptran->red, gx_transfer_map, &st_transfer_map,
                      pgs->memory, goto fred, "gs_setcolortransfer");
    rc_unshare_struct(ptran->green, gx_transfer_map, &st_transfer_map,
                      pgs->memory, goto fgreen, "gs_setcolortransfer");
    rc_unshare_struct(ptran->blue, gx_transfer_map, &st_transfer_map,
                      pgs->memory, goto fblue, "gs_setcolortransfer");
    ptran->gray->proc = gray_proc;
    ptran->gray->id = new_ids;
    ptran->red->proc = red_proc;
    ptran->red->id = new_ids + 1;
    ptran->green->proc = green_proc;
    ptran->green->id = new_ids + 2;
    ptran->blue->proc = blue_proc;
    ptran->blue->id = new_ids + 3;
    ptran->red_component_num =
        gs_color_name_component_number(dev, "Red", 3, ht_type_colorscreen);
    ptran->green_component_num =
        gs_color_name_component_number(dev, "Green", 5, ht_type_colorscreen);
    ptran->blue_component_num =
        gs_color_name_component_number(dev, "Blue", 4, ht_type_colorscreen);
    ptran->gray_component_num =
        gs_color_name_component_number(dev, "Gray", 4, ht_type_colorscreen);
    if (remap) {
        load_transfer_map(pgs, ptran->red, 0.0);
        load_transfer_map(pgs, ptran->green, 0.0);
        load_transfer_map(pgs, ptran->blue, 0.0);
        load_transfer_map(pgs, ptran->gray, 0.0);
        gx_set_effective_transfer(pgs);
        gx_unset_dev_color(pgs);
    } else
        gx_set_effective_transfer(pgs);
    return 0;
  fblue:
    rc_assign(ptran->green, old.green, "setcolortransfer");
  fgreen:
    rc_assign(ptran->red, old.red, "setcolortransfer");
  fred:
    rc_assign(ptran->gray, old.gray, "setcolortransfer");
  fgray:
    return_error(gs_error_VMerror);
}
Ejemplo n.º 5
0
/* setcmykcolor */
int
gs_setcmykcolor(gs_state *pgs, floatp c, floatp m, floatp y, floatp k)
{	gs_client_color *pcc = pgs->ccolor;
	if ( pgs->in_cachedevice ) return_error(gs_error_undefined);
	cs_adjust_counts(pgs, -1);
	pcc->paint.values[0] = c;
	pcc->paint.values[1] = m;
	pcc->paint.values[2] = y;
	pcc->paint.values[3] = k;
	pcc->pattern = 0;			/* for GC */
	pgs->color_space->type = &gs_color_space_type_DeviceCMYK;
	gx_unset_dev_color(pgs);
	return 0;
}
Ejemplo n.º 6
0
int
gs_setundercolorremoval_remap(gs_state *pgs, gs_mapping_proc proc, bool remap)
{	rc_unshare_struct(pgs->undercolor_removal, gx_transfer_map,
			  &st_transfer_map, pgs->memory,
			  return_error(gs_error_VMerror),
			  "gs_setundercolorremoval");
	pgs->undercolor_removal->proc = proc;
	pgs->undercolor_removal->id = gs_next_ids(1);
	if ( remap )
	{	load_transfer_map(pgs, pgs->undercolor_removal, -1.0);
		gx_unset_dev_color(pgs);
	}
	return 0;
}
Ejemplo n.º 7
0
int
gs_setblackgeneration_remap(gs_state *pgs, gs_mapping_proc proc, bool remap)
{	rc_unshare_struct(pgs->black_generation, gx_transfer_map,
			  &st_transfer_map, pgs->memory,
			  return_error(gs_error_VMerror),
			  "gs_setblackgeneration");
	pgs->black_generation->proc = proc;
	pgs->black_generation->id = gs_next_ids(1);
	if ( remap )
	{	load_transfer_map(pgs, pgs->black_generation, 0.0);
		gx_unset_dev_color(pgs);
	}
	return 0;
}
Ejemplo n.º 8
0
/* setcolorspace */
int
gs_setcolorspace(gs_state * pgs, gs_color_space * pcs)
{
    int             code = 0;

    code = gs_setcolorspace_only(pgs, pcs);
    if (code >= 0) {
        pgs->color[0].color_space->pclient_color_space_data =
            pcs->pclient_color_space_data;
        cs_full_init_color(pgs->color[0].ccolor, pcs);
        gx_unset_dev_color(pgs);
    }
    return code;
}
Ejemplo n.º 9
0
/* setcolor */
int
gs_setcolor(gs_state * pgs, const gs_client_color * pcc)
{
    gs_color_space *    pcs = pgs->color_space;
    gs_client_color     cc_old = *pgs->ccolor;

   if (pgs->in_cachedevice)
	return_error(gs_error_undefined); /* PLRM3 page 215. */
    gx_unset_dev_color(pgs);
    (*pcs->type->adjust_color_count)(pcc, pcs, 1);
    *pgs->ccolor = *pcc;
    (*pcs->type->restrict_color)(pgs->ccolor, pcs);
    (*pcs->type->adjust_color_count)(&cc_old, pcs, -1);

    return 0;
}
Ejemplo n.º 10
0
/* Remap=0 is used by the interpreter. */
int
gs_setcolortransfer_remap(gs_state *pgs, gs_mapping_proc red_proc,
  gs_mapping_proc green_proc, gs_mapping_proc blue_proc,
  gs_mapping_proc gray_proc, bool remap)
{	gx_transfer_colored *ptran = &pgs->set_transfer.colored;
	gx_transfer_colored old;
	gs_id new_ids = gs_next_ids(4);

	old = *ptran;
	rc_unshare_struct(ptran->gray, gx_transfer_map, &st_transfer_map,
			  pgs->memory, goto fgray, "gs_setcolortransfer");
	rc_unshare_struct(ptran->red, gx_transfer_map, &st_transfer_map,
			  pgs->memory, goto fred, "gs_setcolortransfer");
	rc_unshare_struct(ptran->green, gx_transfer_map, &st_transfer_map,
			  pgs->memory, goto fgreen, "gs_setcolortransfer");
	rc_unshare_struct(ptran->blue, gx_transfer_map, &st_transfer_map,
			  pgs->memory, goto fblue, "gs_setcolortransfer");
	ptran->gray->proc = gray_proc;
	ptran->gray->id = new_ids;
	ptran->red->proc = red_proc;
	ptran->red->id = new_ids + 1;
	ptran->green->proc = green_proc;
	ptran->green->id = new_ids + 2;
	ptran->blue->proc = blue_proc;
	ptran->blue->id = new_ids + 3;
	if ( remap )
	{	load_transfer_map(pgs, ptran->red, 0.0);
		load_transfer_map(pgs, ptran->green, 0.0);
		load_transfer_map(pgs, ptran->blue, 0.0);
		load_transfer_map(pgs, ptran->gray, 0.0);
		gx_set_effective_transfer(pgs);
		gx_unset_dev_color(pgs);
	}
	return 0;
fblue:	rc_assign(ptran->green, old.green, "setcolortransfer");
fgreen:	rc_assign(ptran->red, old.red, "setcolortransfer");
fred:	rc_assign(ptran->gray, old.gray, "setcolortransfer");
fgray:	return_error(gs_error_VMerror);
}
Ejemplo n.º 11
0
/* This does all the work of setpattern except for the final setcolor. */
int
gs_setpatternspace(gs_state * pgs)
{
    int code = 0;

    if (pgs->in_cachedevice)
	return_error(gs_error_undefined);
    if (pgs->color_space->type->index != gs_color_space_index_Pattern) {
	gs_color_space *pcs;

	pcs = gs_cspace_alloc(pgs->memory, &gs_color_space_type_Pattern);
	if (pcs == NULL)
	    return_error(gs_error_VMerror);
	/* reference to base space shifts from pgs to pcs with no net change */
	pcs->base_space = pgs->color_space;
	pcs->params.pattern.has_base_space = true;
	pgs->color_space = pcs;
	cs_full_init_color(pgs->ccolor, pcs);
	gx_unset_dev_color(pgs);
    }
    return code;
}
Ejemplo n.º 12
0
/* setcmykcolor */
int
gs_setcmykcolor(gs_gstate * pgs, double c, double m, double y, double k)
{
    gs_color_space      *pcs;
    int                 code;

    pcs = gs_cspace_new_DeviceCMYK(pgs->memory);
    if (pcs == NULL)
        return_error(gs_error_VMerror);
    if ((code = gs_setcolorspace(pgs, pcs)) >= 0) {
       gs_client_color *pcc = gs_currentcolor_inline(pgs);

        cs_adjust_color_count(pgs, -1); /* not strictly necessary */
        pcc->paint.values[0] = FORCE_UNIT(c);
        pcc->paint.values[1] = FORCE_UNIT(m);
        pcc->paint.values[2] = FORCE_UNIT(y);
        pcc->paint.values[3] = FORCE_UNIT(k);
        pcc->pattern = 0;		/* for GC */
        gx_unset_dev_color(pgs);
    }
    rc_decrement_only_cs(pcs, "gs_setcmykcolor");
    return code;
}