Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/* Copyright (C) 1999 Aladdin Enterprises.  All rights reserved.
2
 
3
  This software is provided AS-IS with no warranty, either express or
4
  implied.
5
 
6
  This software is distributed under license and may not be copied,
7
  modified or distributed except as expressly authorized under the terms
8
  of the license contained in the file LICENSE in this distribution.
9
 
10
  For more information about licensing, please refer to
11
  http://www.ghostscript.com/licensing/. For information on
12
  commercial licensing, go to http://www.artifex.com/licensing/ or
13
  contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14
  San Rafael, CA  94903, U.S.A., +1(415)492-9861.
15
*/
16
 
17
/* $Id: gscssub.c,v 1.5 2002/02/21 22:24:52 giles Exp $ */
18
/* Color space substitution "operators" */
19
#include "gx.h"
20
#include "gserrors.h"
21
#include "gscssub.h"
22
#include "gxcspace.h"		/* for st_color_space */
23
#include "gxdevcli.h"
24
#include "gzstate.h"
25
 
26
/* .setsubstitutecolorspace */
27
/* Note that, to support PDF, ICCBased color spaces may be used to substitute
28
 * for the Device* color spaces (previously, only CIEBased color spaces could
29
 * be used for this purpose). */
30
int
31
gs_setsubstitutecolorspace(gs_state *pgs, gs_color_space_index csi,
32
			   const gs_color_space *pcs)
33
{
34
    int index = (int)csi;
35
    static const uint masks[3] = {
36
	(1 << gs_color_space_index_DeviceGray) |
37
	  (1 << gs_color_space_index_CIEA),
38
	(1 << gs_color_space_index_DeviceRGB) |
39
	  (1 << gs_color_space_index_CIEABC) |
40
	  (1 << gs_color_space_index_CIEDEF),
41
	(1 << gs_color_space_index_DeviceCMYK) |
42
	  (1 << gs_color_space_index_CIEDEFG)
43
    };
44
    const gs_color_space *pcs_old;
45
 
46
    if (index < 0 || index > 2)
47
	return_error(gs_error_rangecheck);
48
    if (pcs) {
49
        if (gs_color_space_get_index(pcs) == gs_color_space_index_CIEICC) {
50
            static const byte dev_ncomps[3] = {1, 3, 4};
51
 
52
             if (dev_ncomps[index] != cs_num_components(pcs))
53
                 return_error(gs_error_rangecheck);
54
        } else if (!masks[index] && (1 << gs_color_space_get_index(pcs)))
55
	    return_error(gs_error_rangecheck);
56
    }
57
    pcs_old = pgs->device_color_spaces.indexed[index];
58
    if (pcs_old == 0) {
59
	gs_color_space *pcs_new;
60
 
61
	if (pcs == 0 || gs_color_space_get_index(pcs) == csi)
62
	    return 0;
63
	pcs_new = gs_alloc_struct(pgs->memory, gs_color_space, &st_color_space,
64
				  "gs_setsubstitutecolorspace");
65
	if (pcs_new == 0)
66
	    return_error(gs_error_VMerror);
67
	gs_cspace_init_from(pcs_new, pcs);
68
	pgs->device_color_spaces.indexed[index] = pcs_new;
69
    } else {
70
	gs_cspace_assign(pgs->device_color_spaces.indexed[index],
71
			 (pcs ? pcs :
72
			  pgs->shared->device_color_spaces.indexed[index]));
73
    }
74
    return 0;
75
}
76
 
77
/* Possibly-substituted color space accessors. */
78
const gs_color_space *
79
gs_current_DeviceGray_space(const gs_state *pgs)
80
{
81
    const gs_color_space *pcs;
82
 
83
    return (!pgs->device->UseCIEColor ||
84
	    (pcs = pgs->device_color_spaces.named.Gray) == 0 ?
85
	    pgs->shared->device_color_spaces.named.Gray : pcs);
86
}
87
const gs_color_space *
88
gs_current_DeviceRGB_space(const gs_state *pgs)
89
{
90
    const gs_color_space *pcs;
91
 
92
    return (!pgs->device->UseCIEColor ||
93
	    (pcs = pgs->device_color_spaces.named.RGB) == 0 ?
94
	    pgs->shared->device_color_spaces.named.RGB : pcs);
95
}
96
const gs_color_space *
97
gs_current_DeviceCMYK_space(const gs_state *pgs)
98
{
99
    const gs_color_space *pcs;
100
 
101
    return (!pgs->device->UseCIEColor ||
102
	    (pcs = pgs->device_color_spaces.named.CMYK) == 0 ?
103
	    pgs->shared->device_color_spaces.named.CMYK : pcs);
104
}
105
 
106
/* .currentsubstitutecolorspace */
107
const gs_color_space *
108
gs_currentsubstitutecolorspace(const gs_state *pgs, gs_color_space_index csi)
109
{
110
    switch (csi) {
111
    case gs_color_space_index_DeviceGray:
112
	return gs_current_DeviceGray_space(pgs);
113
    case gs_color_space_index_DeviceRGB:
114
	return gs_current_DeviceRGB_space(pgs);
115
    case gs_color_space_index_DeviceCMYK:
116
	return gs_current_DeviceCMYK_space(pgs);
117
    default:
118
	return 0;
119
    }
120
}