xref: /plan9/sys/src/cmd/gs/src/gscpixel.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
13ff48bf5SDavid du Colombier /* Copyright (C) 1997, 2000 Aladdin Enterprises.  All rights reserved.
27dd7cddfSDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
57dd7cddfSDavid du Colombier 
6*593dc095SDavid du Colombier   This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier   modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier   of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier 
10*593dc095SDavid du Colombier   For more information about licensing, please refer to
11*593dc095SDavid du Colombier   http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier   commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: gscpixel.c,v 1.13 2004/08/19 19:33:09 stefan Exp $ */
187dd7cddfSDavid du Colombier /* DevicePixel color space and operation definition */
197dd7cddfSDavid du Colombier #include "gx.h"
207dd7cddfSDavid du Colombier #include "gserrors.h"
217dd7cddfSDavid du Colombier #include "gsrefct.h"
227dd7cddfSDavid du Colombier #include "gxcspace.h"
237dd7cddfSDavid du Colombier #include "gscpixel.h"
247dd7cddfSDavid du Colombier #include "gxdevice.h"
25*593dc095SDavid du Colombier #include "gxistate.h"
26*593dc095SDavid du Colombier #include "gsovrc.h"
27*593dc095SDavid du Colombier #include "gsstate.h"
28*593dc095SDavid du Colombier #include "gzstate.h"
29*593dc095SDavid du Colombier #include "stream.h"
307dd7cddfSDavid du Colombier 
317dd7cddfSDavid du Colombier /* Define the DevicePixel color space type. */
327dd7cddfSDavid du Colombier private cs_proc_restrict_color(gx_restrict_DevicePixel);
337dd7cddfSDavid du Colombier private cs_proc_remap_concrete_color(gx_remap_concrete_DevicePixel);
347dd7cddfSDavid du Colombier private cs_proc_concretize_color(gx_concretize_DevicePixel);
35*593dc095SDavid du Colombier private cs_proc_set_overprint(gx_set_overprint_DevicePixel);
36*593dc095SDavid du Colombier private cs_proc_serialize(gx_serialize_DevicePixel);
377dd7cddfSDavid du Colombier private const gs_color_space_type gs_color_space_type_DevicePixel = {
387dd7cddfSDavid du Colombier     gs_color_space_index_DevicePixel, true, false,
397dd7cddfSDavid du Colombier     &st_base_color_space, gx_num_components_1,
40*593dc095SDavid du Colombier     gx_no_base_space,
417dd7cddfSDavid du Colombier     gx_init_paint_1, gx_restrict_DevicePixel,
427dd7cddfSDavid du Colombier     gx_same_concrete_space,
437dd7cddfSDavid du Colombier     gx_concretize_DevicePixel, gx_remap_concrete_DevicePixel,
447dd7cddfSDavid du Colombier     gx_default_remap_color, gx_no_install_cspace,
45*593dc095SDavid du Colombier     gx_set_overprint_DevicePixel,
46*593dc095SDavid du Colombier     gx_no_adjust_cspace_count, gx_no_adjust_color_count,
47*593dc095SDavid du Colombier     gx_serialize_DevicePixel,
48*593dc095SDavid du Colombier     gx_cspace_is_linear_default
497dd7cddfSDavid du Colombier };
507dd7cddfSDavid du Colombier 
517dd7cddfSDavid du Colombier /* Initialize a DevicePixel color space. */
527dd7cddfSDavid du Colombier int
gs_cspace_init_DevicePixel(gs_memory_t * mem,gs_color_space * pcs,int depth)53*593dc095SDavid du Colombier gs_cspace_init_DevicePixel(gs_memory_t *mem, gs_color_space * pcs, int depth)
547dd7cddfSDavid du Colombier {
557dd7cddfSDavid du Colombier     switch (depth) {
567dd7cddfSDavid du Colombier 	case 1:
577dd7cddfSDavid du Colombier 	case 2:
587dd7cddfSDavid du Colombier 	case 4:
597dd7cddfSDavid du Colombier 	case 8:
607dd7cddfSDavid du Colombier 	case 16:
617dd7cddfSDavid du Colombier 	case 24:
627dd7cddfSDavid du Colombier 	case 32:
637dd7cddfSDavid du Colombier 	    break;
647dd7cddfSDavid du Colombier 	default:
657dd7cddfSDavid du Colombier 	    return_error(gs_error_rangecheck);
667dd7cddfSDavid du Colombier     }
67*593dc095SDavid du Colombier     gs_cspace_init(pcs, &gs_color_space_type_DevicePixel, mem, false);
687dd7cddfSDavid du Colombier     pcs->params.pixel.depth = depth;
697dd7cddfSDavid du Colombier     return 0;
707dd7cddfSDavid du Colombier }
717dd7cddfSDavid du Colombier 
727dd7cddfSDavid du Colombier /* ------ Internal routines ------ */
737dd7cddfSDavid du Colombier 
747dd7cddfSDavid du Colombier /* Force a DevicePixel color into legal range. */
757dd7cddfSDavid du Colombier private void
gx_restrict_DevicePixel(gs_client_color * pcc,const gs_color_space * pcs)767dd7cddfSDavid du Colombier gx_restrict_DevicePixel(gs_client_color * pcc, const gs_color_space * pcs)
777dd7cddfSDavid du Colombier {
787dd7cddfSDavid du Colombier     /****** NOT ENOUGH BITS IN float OR frac ******/
797dd7cddfSDavid du Colombier     floatp pixel = pcc->paint.values[0];
807dd7cddfSDavid du Colombier     ulong max_value = (1L << pcs->params.pixel.depth) - 1;
817dd7cddfSDavid du Colombier 
827dd7cddfSDavid du Colombier     pcc->paint.values[0] = (pixel < 0 ? 0 : min(pixel, max_value));
837dd7cddfSDavid du Colombier }
847dd7cddfSDavid du Colombier 
857dd7cddfSDavid du Colombier 
867dd7cddfSDavid du Colombier /* Remap a DevicePixel color. */
877dd7cddfSDavid du Colombier 
887dd7cddfSDavid du Colombier private int
gx_concretize_DevicePixel(const gs_client_color * pc,const gs_color_space * pcs,frac * pconc,const gs_imager_state * pis)897dd7cddfSDavid du Colombier gx_concretize_DevicePixel(const gs_client_color * pc, const gs_color_space * pcs,
907dd7cddfSDavid du Colombier 			  frac * pconc, const gs_imager_state * pis)
917dd7cddfSDavid du Colombier {
927dd7cddfSDavid du Colombier     /****** NOT ENOUGH BITS IN float OR frac ******/
937dd7cddfSDavid du Colombier     pconc[0] = (frac) (ulong) pc->paint.values[0];
947dd7cddfSDavid du Colombier     return 0;
957dd7cddfSDavid du Colombier }
967dd7cddfSDavid du Colombier 
977dd7cddfSDavid du Colombier private int
gx_remap_concrete_DevicePixel(const frac * pconc,const gs_color_space * pcs,gx_device_color * pdc,const gs_imager_state * pis,gx_device * dev,gs_color_select_t select)98*593dc095SDavid du Colombier gx_remap_concrete_DevicePixel(const frac * pconc, const gs_color_space * pcs,
997dd7cddfSDavid du Colombier 	gx_device_color * pdc, const gs_imager_state * pis, gx_device * dev,
1007dd7cddfSDavid du Colombier 			      gs_color_select_t select)
1017dd7cddfSDavid du Colombier {
1027dd7cddfSDavid du Colombier     color_set_pure(pdc, pconc[0] & ((1 << dev->color_info.depth) - 1));
1037dd7cddfSDavid du Colombier     return 0;
1047dd7cddfSDavid du Colombier }
105*593dc095SDavid du Colombier 
106*593dc095SDavid du Colombier /* DevicePixel disables overprint */
107*593dc095SDavid du Colombier private int
gx_set_overprint_DevicePixel(const gs_color_space * pcs,gs_state * pgs)108*593dc095SDavid du Colombier gx_set_overprint_DevicePixel(const gs_color_space * pcs, gs_state * pgs)
109*593dc095SDavid du Colombier {
110*593dc095SDavid du Colombier     gs_overprint_params_t   params;
111*593dc095SDavid du Colombier 
112*593dc095SDavid du Colombier     params.retain_any_comps = false;
113*593dc095SDavid du Colombier     pgs->effective_overprint_mode = 0;
114*593dc095SDavid du Colombier     return gs_state_update_overprint(pgs, &params);
115*593dc095SDavid du Colombier }
116*593dc095SDavid du Colombier 
117*593dc095SDavid du Colombier 
118*593dc095SDavid du Colombier /* ---------------- Serialization. -------------------------------- */
119*593dc095SDavid du Colombier 
120*593dc095SDavid du Colombier private int
gx_serialize_DevicePixel(const gs_color_space * pcs,stream * s)121*593dc095SDavid du Colombier gx_serialize_DevicePixel(const gs_color_space * pcs, stream * s)
122*593dc095SDavid du Colombier {
123*593dc095SDavid du Colombier     const gs_device_pixel_params * p = &pcs->params.pixel;
124*593dc095SDavid du Colombier     uint n;
125*593dc095SDavid du Colombier     int code = gx_serialize_cspace_type(pcs, s);
126*593dc095SDavid du Colombier 
127*593dc095SDavid du Colombier     if (code < 0)
128*593dc095SDavid du Colombier 	return code;
129*593dc095SDavid du Colombier     return sputs(s, (const byte *)&p->depth, sizeof(p->depth), &n);
130*593dc095SDavid du Colombier }
131