[gs-cvs] rev 7841 - in trunk/gs: lib src
tim at ghostscript.com
tim at ghostscript.com
Wed Apr 11 08:20:45 PDT 2007
Author: tim
Date: 2007-04-11 08:20:44 -0700 (Wed, 11 Apr 2007)
New Revision: 7841
Removed:
trunk/gs/src/gsncdemo.c
Modified:
trunk/gs/lib/pdf_draw.ps
trunk/gs/lib/pdf_main.ps
trunk/gs/lib/pdf_ops.ps
trunk/gs/lib/pdfopt.ps
Log:
gsncdemo.* are now named gsncdummy.*
Modified: trunk/gs/lib/pdf_draw.ps
===================================================================
--- trunk/gs/lib/pdf_draw.ps 2007-04-10 17:13:41 UTC (rev 7840)
+++ trunk/gs/lib/pdf_draw.ps 2007-04-11 15:20:44 UTC (rev 7841)
@@ -376,6 +376,11 @@
/gssmask {
dup /None eq PDFusingtransparency not or {
+
+ %TSOMARK
+ % (gssmask endtransparencygroup) == flush
+ % .endtransparencygroup
+
pop null
} {
% Preprocess the SMask value into a parameter dictionary for
@@ -395,7 +400,7 @@
} if
dup /TR knownoget {
resolveidfnproc /TransferFunction exch 3 2 roll
- } if
+ } if
dup /G oget dup /BBox oget /BBox exch 4 2 roll
/.execmaskgroup cvx 2 packedarray cvx /Draw exch 3 2 roll
pop .dicttomark
@@ -406,23 +411,56 @@
/.execmaskgroup { % <masknum> <paramdict> <formdict> .execmaskgroup -
% Save our place in PDFfile, and do a gsave to avoid resetting
% the color space.
+
+(in execmaskgroup ) == flush
+
currentcolorspace 4 1 roll
PDFfile fileposition 4 1 roll
% We have to select the group's color space so that the
% background color will be interpreted correctly.
- dup /Group oget /CS knownoget { csresolve dup setgcolorspace csput } if
- exch dup /BBox get aload pop .begintransparencymaskgroup {
+
+%TSOMARK
+ dup /Group oget dup /foobar exch def /CS knownoget { csresolve dup setgcolorspace csput } if
+ exch dup /BBox get dup
+
+ %stack ( A ) == flush
+
+ foobar exch
+
+ userdict /begantransparencygroup known
+ {
+ (begantransparencygroup known) == flush
+ pop pop
+ }
+ {
+ (begantransparencygroup NOT known) == flush
+ .beginformgroup
+ } ifelse
+
+ %stack ( B ) == flush
+ %stack ( C ) == flush
+ aload pop
+ %stack ( D ) == flush
+
+ .begintransparencymaskgroup
+ {
dup /Resources knownoget { oforce } { 0 dict } ifelse
exch false resolvestream
.execgroup .endtransparencymask
- } stopped {
+ } stopped
+ {
.discardtransparencymask stop
} if
+
+
PDFfile exch setfileposition
setcolorspace
} bdef
% Paint a Form+Group XObject, either for a transparency mask or for a Do.
/.execgroup { % <resdict> <stream> .execgroup -
+
+(In execgroup ) == flush
+
gsave //nodict begin
null SMask
1 .setopacityalpha 1 .setshapealpha
@@ -441,12 +479,18 @@
pop .dicttomark
% Stack: bbox paramdict
exch aload pop
+
+ userdict /begantransparencygroup true put
+
.begintransparencygroup
} bdef
% .paintgroupform implements the Form PaintProc in the case where the
% Form XObject dictionary includes a Group key. See .paintform below.
/.paintgroupform { % <resdict> <stream> <formdict> .paintgroupform -
+
+(In paintgroupform ) == flush
+
dup /Group oget exch /BBox oget
% Stack: resdict stream groupdict bbox
.beginformgroup {
@@ -980,6 +1024,9 @@
PDFfile fileposition exch
gsave //nodict begin
null /SoftMask gput
+
+(In doimagesmask ) == flush
+
1 .setopacityalpha 1 .setshapealpha
0 .inittransparencymask 1 .inittransparencymask
/Compatible .setblendmode
@@ -990,8 +1037,14 @@
<< /Subtype /Group /Isolated true
/.image_with_SMask true % pdfwrite needs : see gs/src/ztrans.c, gs/src/gdevpdft.c
>> 0 0 1 1 .begintransparencygroup
+
+ userdict /begantransparencygroup true put
+
doimage
.endtransparencygroup
+
+ userdict /begantransparencygroup false put
+
} {
doimage
} ifelse
Modified: trunk/gs/lib/pdf_main.ps
===================================================================
--- trunk/gs/lib/pdf_main.ps 2007-04-10 17:13:41 UTC (rev 7840)
+++ trunk/gs/lib/pdf_main.ps 2007-04-11 15:20:44 UTC (rev 7841)
@@ -76,7 +76,7 @@
} loop
exch pop
{
- dup 1023 string .peekstring { % "1024 string" exceeds current %stdin buffer"
+ dup 127 string .peekstring { % "128 string" doesn't work for "(%stdin) run"
(%PDF-1.) search {
3 1 roll pop pop
dup (%!PS) search not {
Modified: trunk/gs/lib/pdf_ops.ps
===================================================================
--- trunk/gs/lib/pdf_ops.ps 2007-04-10 17:13:41 UTC (rev 7840)
+++ trunk/gs/lib/pdf_ops.ps 2007-04-11 15:20:44 UTC (rev 7841)
@@ -257,11 +257,34 @@
% Establish a given color (and color space) as current.
/.settransparencyparams { % <alpha> <smask> .settransparencyparams -
PDFusingtransparency {
+
+%dup type == flush
+%(In settransparencyparams ) == flush
+
/.inittransparencymask where {
pop AlphaIsShape {
- 1 .setopacityalpha 0 .inittransparencymask exch .setshapealpha 1
+ %(In settransparencyparams AlphaIsShape ) == flush
+ 1 .setopacityalpha
+
+ %true
+ userdict /InitedTheMask known not
+ {
+ 0 .inittransparencymask
+ } if
+
+ exch .setshapealpha 1
} {
- 1 .setshapealpha 1 .inittransparencymask exch .setopacityalpha 0
+ %-->(In settransparencyparams AlphaIs NOT Shape) == flush
+ 1 .setshapealpha
+
+ %true
+ userdict /InitedTheMask known not
+ {
+ 1 .inittransparencymask
+ } if
+
+
+ exch .setopacityalpha 0
} ifelse
% Set the soft mask by rendering the XObject. Doing this every time
% is obviously very inefficient; we'll improve it later.
@@ -276,7 +299,22 @@
/.settransparencymask { % <paramdict> <masknum> .settransparencymask -
exch dup null eq {
PDFusingtransparency {
- pop .inittransparencymask
+
+%(In settransparencymask ) == flush
+
+ pop
+
+ %true
+ userdict /InitedTheMask known not
+ {
+ .inittransparencymask
+ }
+ {
+ pop
+ } ifelse
+
+ userdict /InitedTheMask true put
+
} {
dup /Draw get exec
} ifelse
@@ -287,6 +325,9 @@
% (Non-mask) images must execute setfillblend.
/setfillblend {
FillOverprint setoverprint
+
+%(In setfillblend ) == flush
+
FillConstantAlpha SoftMask .settransparencyparams
} def
/setfillstate {
@@ -294,6 +335,9 @@
} def
/setstrokestate {
StrokeColor StrokeColorSpace setgcolor StrokeOverprint setoverprint
+
+%(In setstrokestate ) == flush
+
StrokeConstantAlpha SoftMask .settransparencyparams
} def
/Cdict 15 dict dup begin % <color...> <colorspace> -proc- -
Modified: trunk/gs/lib/pdfopt.ps
===================================================================
--- trunk/gs/lib/pdfopt.ps 2007-04-10 17:13:41 UTC (rev 7840)
+++ trunk/gs/lib/pdfopt.ps 2007-04-11 15:20:44 UTC (rev 7841)
@@ -474,7 +474,7 @@
} forall
} if
% Visit the Contents stream(s).
- dup /Contents .knownget { omvisit } if
+ dup /Contents .knownget { (Visiting Contents) == flush omvisit } if
% Visit Image XObjects. We don't try to visit them in
% reference order.
filter_params { omvisit } daforall
@@ -791,6 +791,9 @@
% Find the Contents of a page.
/contentsobjects { % <pagedict> contentsobjects <firstobj#> <lastobj#> true
% <pagedict> contentsobjects false
+
+ (Looking at contents) == flush
+
/Contents .knownget {
dup oforce % ref []
dup type /dicttype eq {
Deleted: trunk/gs/src/gsncdemo.c
===================================================================
--- trunk/gs/src/gsncdemo.c 2007-04-10 17:13:41 UTC (rev 7840)
+++ trunk/gs/src/gsncdemo.c 2007-04-11 15:20:44 UTC (rev 7841)
@@ -1,905 +0,0 @@
-/* Copyright (C) 2001-2006 artofcode LLC.
- All Rights Reserved.
-
- This software is provided AS-IS with no warranty, either express or
- implied.
-
- This software is distributed under license and may not be copied, modified
- or distributed except as expressly authorized under the terms of that
- license. Refer to licensing information at http://www.artifex.com/
- or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
- San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
-*/
-/* $Id$ */
-/* Sample implementation for client custom processing of color spaces. */
-
-/*
- * If this flag is 1 then we also do custom processing for the DeviceGray,
- * DeviceRGB, and DeviceCMYK color spaces. For these color spaces, we
- * convert all text to shades of red, all images to shades of green and
- * all lines and fills to shades of blue. if the flag is 0 then our example
- * only handles PANTONE colors (see comment below).
- */
-#define OBJECT_TYPE_EXAMPLE 1 /* 0 --> disabled, 1 --> enabled */
-
-/*
- * This module has been created to demonstrate how to support the use of
- * PANTONE colors to the Ghostscript graphics library. PANTONE colors
- * are specified in both PostScript and PDF files via the use of DeviceN
- * or Separation color spaces.
- *
- * PANTONE is a registered trademark and PANTONE colors are a
- * licensed product of Pantone Inc. See http://www.pantone.com
- * for more information.
- *
- * See the comments at the start of src/gsnamecl.c for description of the
- * client color processing routines.
- *
- * Since this is only a 'demo' implementation, the example implementation does
- * not have some features which might be expected in a 'real' implementation.
- *
- * 1. The Pantone color data table does not have actual entries for all
- * of the different Pantone colors. This data is not included since
- * the values are dependent upon specific details of the output device,
- * inks, etc.
- * 2. Colors in PostScript and PDF are specified with by values between
- * 0 and 1. The output colorant values are scaled linearly.
- * 3. DeviceN color spaces can specify multiple colors. However this
- * implementation assumes that if a PANTONE color is specified in a
- * DeviceN color space, then only PANTONE colors or CMYK are present.
- * This was done to keep the code simple. If other colors are present,
- * then this implementation falls back to using the alternate color space
- * specified with the DeviceN color space. (This is the normal PS
- * and PDF operation.)
- */
-
-#include "stdpre.h"
-#include "math_.h"
-#include "memory_.h"
-#include "gx.h"
-#include "gserrors.h"
-#include "gscdefs.h"
-#include "gscspace.h"
-#include "gscie.h"
-#include "gsicc.h"
-#include "gxdevice.h"
-#include "gzstate.h"
-#include "malloc_.h"
-#include "memory_.h"
-#include "ghost.h"
-#include "oper.h"
-#include "iddict.h"
-#include "store.h"
-#include "gsutil.h"
-
-#if ENABLE_CUSTOM_COLOR_CALLBACK /* Defined in src/gsnamecl.h */
-
-/*
- * This s a list of PANTONE color names and a set of equivalent CMYK values,
- */
-typedef struct pantone_list_s {
- const char *name; /* Name of the PANTONE color */
- double c, m, y, k; /* Equivalent CMYK values */
-} pantone_list_t;
-
-/*
- * Since this is only a 'demo' list, the list does have not entries for all
- * of the different PANTONE colors. Creation of a real list is left as an
- * exercise for the user.
- */
-private const pantone_list_t pantone_list[] = {
- { "PantoneCyan", 1, 0, 0, 0 },
- { "PantoneMagenta", 0, 1, 0, 0 },
- { "PantoneYellow", 0, 0, 1, 0 },
- { "PantoneBlack", 0, 0, 0, 1 },
- { "Orange", 0, 1, .5, 0 }
-};
-
-/*
- * We will handle color spaces that include both PANTONE colors, CMYK, and
- * 'None'. 'None' is a special case in DeviceN color spaces. It has no
- * effects upon the output color but it can be present in DeviceN color
- * spaces in a PDF file. To simplify the code, we need pantone index values
- * for these five 'colors'.
- */
-#define PANTONE_NONE count_of(pantone_list)
-#define PANTONE_CYAN (PANTONE_NONE + 1)
-#define PANTONE_MAGENTA (PANTONE_NONE + 2)
-#define PANTONE_YELLOW (PANTONE_NONE + 3)
-#define PANTONE_BLACK (PANTONE_NONE + 4)
-
-/* Compare two names */
-#define compare_names(name1, name_size1, name2, name_size2) \
- (name_size1 == name_size2 && \
- (memcmp((const char *)name1, (const char *)name2, name_size1) == 0))
-
-/*
- * Define a structure for holding our client specific data. In our demo,
- * we are only supporting Separation and DeviceN color spaces. To make
- * life simpler, we are using the same data structure for both types
- * of color spaces.
- */
-typedef struct demo_color_space_data_s {
- /*
- * All client color space data blocks must begin with a routine for
- * handling the reference counts for the data block.
- */
- cs_proc_adjust_client_cspace_count((*client_adjust_cspace_count));
-
- /* Use a reference count for knowing when to release the data block. */
- int ref_count;
-
- /* A flag which indicates the client wants to process the color space. */
- bool client_is_going_to_handle_color_space;
-
- /*
- * We store an index into our Pantone color translation table for each
- * colorant in the color space.
- */
- int color_index[GS_CLIENT_COLOR_MAX_COMPONENTS];
-} demo_color_space_data_t;
-
-/*
- * Dummy install routine for color spaces which are not handled by the client.
- */
-private bool
-client_install_no_op(client_custom_color_params_t * pparams,
- gs_color_space * pcs, gs_state * pgs)
-{
- return false; /* Do nothing */
-}
-
-/*
- * Dummy convert routine for simple color spaces (gray, RGB, CMYK, DeviceN,
- * and Separation) which are not handled by the client.
- */
-private int
-client_remap_simple_no_op(client_custom_color_params_t * pparams,
- 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)
-{
- /*
- * Returning an error value will cause GS to use its normal processes
- * for handling the color space.
- */
- return_error(gs_error_rangecheck);
-}
-
-/*
- * Dummy convert routine for complex color spaces (CIEBasedA, CIEBasedABC,
- * CIEBasedDEF, CIEBasedDEF, CIEBasedDEFG, ICCBased) which are not handled
- * by the client.
- */
-private int
-client_remap_complex_no_op(client_custom_color_params_t * pparams,
- const gs_client_color * pc, const gs_color_space * pcs,
- gx_device_color * pdc, const gs_imager_state * pis, gx_device * dev,
- gs_color_select_t select)
-{
- /*
- * Returning an error value will cause GS to use its normal processes
- * for handling the color space.
- */
- return_error(gs_error_rangecheck);
-}
-
-/*
- * Since this is an example for a client, we are using the system
- * malloc and free routines instead of the normal GS memory management
- * routines.
- */
-private void
-client_adjust_cspace_count(const gs_color_space * pcs, int delta)
-{
- demo_color_space_data_t * pdata =
- (demo_color_space_data_t *)(pcs->pclient_color_space_data);
-
- pdata->ref_count += delta;
- if (pdata->ref_count <= 0)
- free(pdata);
-}
-
-/*
- * Allocate a data block for holding our data for the client specific
- * data for a color space. In our demo, we are only supporting the
- * Separation and DeviceN color spaces. We use a single data structure
- * to make the code simpler.
- */
-private demo_color_space_data_t *
-allocate_client_data_block(int initial_ref_count)
-{
- /*
- * Since this is an example for a client, we are using the system
- * malloc routine instead of the GS memory management routines.
- * As a result, the client is responsible for freeing the data
- * block. For this purpose, we are using a simple reference count.
- * See client_adjust_cspace_count.
- */
- demo_color_space_data_t * pdata =
- (demo_color_space_data_t *)malloc(size_of(demo_color_space_data_t));
-
- if (pdata != NULL) {
- pdata->ref_count = 1;
-
- /*
- * All client color space data blocks must have a pointer to a
- * reference count adjust routine as their first field.
- */
- pdata->client_adjust_cspace_count = client_adjust_cspace_count;
-
- }
-
- return pdata;
-}
-
-private bool
-client_install_generic(client_custom_color_params_t * pparams,
- gs_color_space * pcs, gs_state * pgs)
-{
- demo_color_space_data_t * pclient_data;
-
- /* Exit if we have already installed this color space. */
- if (pcs->pclient_color_space_data != NULL)
- return true;
-
- pclient_data = allocate_client_data_block(1);
- pcs->pclient_color_space_data = (client_color_space_data_t *) pclient_data;
- if (pclient_data)
- {
- pclient_data->client_is_going_to_handle_color_space = 1;
- return true;
- }
- return false;
-}
-
-/*
- * Check if we want to use the PANTONE color processing logic for the given
- * Separation color space.
- */
-private bool
-client_pantone_install_Separation(client_custom_color_params_t * pparam,
- gs_color_space * pcs, gs_state * pgs)
-{
- const gs_separation_name name = pcs->params.separation.sep_name;
- int pan_index;
- byte * pname;
- uint name_size;
- gx_device * dev = pgs->device;
- int num_pantone_colors = count_of(pantone_list);
- bool use_custom_color_callback = false;
-
- /* Exit if we have already installed this color space. */
- if (pcs->pclient_color_space_data != NULL)
- return true;
-
- /*
- * Get the character string and length for the component name.
- */
- pcs->params.separation.get_colorname_string(dev->memory, name,
- &pname, &name_size);
- /*
- * Compare the colorant name to those in our PANTONE color list.
- */
- for (pan_index = 0; pan_index < num_pantone_colors ; pan_index++) {
- const char * pan_name = pantone_list[pan_index].name;
-
- if (compare_names(pname, name_size, pan_name, strlen(pan_name))) {
- use_custom_color_callback = true;
- break;
- }
- }
-
- if (use_custom_color_callback) {
- demo_color_space_data_t * pclient_data = allocate_client_data_block(1);
-
- if (pclient_data == NULL)
- return false;
- pclient_data->color_index[0] = pan_index;
- pcs->pclient_color_space_data =
- (client_color_space_data_t *) pclient_data;
- }
- return use_custom_color_callback;
-}
-
-/*
- * Check if we want to use the PANTONE color processing logic for the given
- * DeviceN color space.
- */
-private bool
-client_pantone_install_DeviceN(client_custom_color_params_t * pparam,
- gs_color_space * pcs, gs_state * pgs)
-{
- const gs_separation_name *names = pcs->params.device_n.names;
- int num_comp = pcs->params.device_n.num_components;
- int i;
- int pan_index;
- byte * pname;
- uint name_size;
- gx_device * dev = pgs->device;
- int num_pantone_colors = count_of(pantone_list);
- bool pantone_found = false;
- bool other_separation_found = false;
- bool use_pantone;
- const char none_str[] = "None";
- const uint none_size = strlen(none_str);
- const char cyan_str[] = "Cyan";
- const uint cyan_size = strlen(cyan_str);
- const char magenta_str[] = "Magenta";
- const uint magenta_size = strlen(magenta_str);
- const char yellow_str[] = "Yellow";
- const uint yellow_size = strlen(yellow_str);
- const char black_str[] = "Black";
- const uint black_size = strlen(black_str);
- int pantone_color_index[GS_CLIENT_COLOR_MAX_COMPONENTS];
-
- /* Exit if we have already installed this color space. */
- if (pcs->pclient_color_space_data != NULL)
- return true;
-
- /*
- * Now check the names of the color components.
- */
- for(i = 0; i < num_comp; i++ ) {
- bool match = false;
-
- /*
- * Get the character string and length for the component name.
- */
- pcs->params.device_n.get_colorname_string(dev->memory, names[i],
- &pname, &name_size);
- /*
- * Postscript does not include /None as a color component but it is
- * allowed in PDF so we accept it. We simply skip components named
- * 'None'.
- */
- if (compare_names(none_str, none_size, pname, name_size)) {
- pantone_color_index[i] = PANTONE_NONE;
- continue;
- }
- /*
- * Check if our color space includes the CMYK process colors.
- */
- if (compare_names(cyan_str, cyan_size, pname, name_size)) {
- pantone_color_index[i] = PANTONE_CYAN;
- continue;
- }
- if (compare_names(magenta_str, magenta_size, pname, name_size)) {
- pantone_color_index[i] = PANTONE_MAGENTA;
- continue;
- }
- if (compare_names(yellow_str, yellow_size, pname, name_size)) {
- pantone_color_index[i] = PANTONE_YELLOW;
- continue;
- }
- if (compare_names(black_str, black_size, pname, name_size)) {
- pantone_color_index[i] = PANTONE_BLACK;
- continue;
- }
- /*
- * Compare the colorant name to those in our Pantone color list.
- */
- for (pan_index = 0; pan_index < num_pantone_colors ; pan_index++) {
- const char * pan_name = pantone_list[pan_index].name;
-
- if (compare_names(pname, name_size, pan_name, strlen(pan_name))) {
- pantone_color_index[i] = pan_index;
- match = pantone_found = true;
- break;
- }
- }
- if (!match) { /* Exit if we find a non Pantone color */
- other_separation_found = true;
- break;
- }
- }
- /*
- * Handle this color space as a 'pantone color space' if we have only
- * PANTONE colors and CMYK. Any other separations will force us to
- * use the normal Ghostscript processing for a DeviceN color space.
- */
- use_pantone = pantone_found && !other_separation_found;
- if (use_pantone) {
- demo_color_space_data_t * pclient_data = allocate_client_data_block(1);
-
- if (pclient_data == NULL)
- return false;
- for(i = 0; i < num_comp; i++ )
- pclient_data->color_index[i] = pantone_color_index[i];
- pcs->pclient_color_space_data =
- (client_color_space_data_t *) pclient_data;
- }
- return use_pantone;
-}
-
-
-/*
- * Convert a set of color values in a 'PANTONE color space' into a device
- * color values.
- *
- * This routine creates an equivalent CMYK color and then uses
- * gx_remap_concrete_cmyk to convert this into device colorants. Note: It
- * is possible to go directy to the output device colorants. However the
- * pantone_install_xxx routines should verify that the expected device
- * colorants match the actual device colorants. (For instance, Ghostscript
- * can install temporary compositing devices for functions like handling
- * PDF 1.4 transparency. The compositing devices may have a process color
- * models which differ from the final output device.)
- */
-private int
-client_pantone_remap_color(client_custom_color_params_t * pparam,
- const frac * pconc, const demo_color_space_data_t * pparams,
- gx_device_color * pdc, const gs_imager_state * pis, gx_device * dev,
- gs_color_select_t select, int num_comp)
-{
- int i, pantone_index, cvalue;
- int cyan = 0;
- int magenta = 0;
- int yellow = 0;
- int black = 0;
- frac cc, cm, cy, ck;
- const pantone_list_t * plist;
-
- /*
- * If the client color space data pointer is NULL then we are not processing
- * this color space. The rangecheck error will indicate that GS should do
- * its normal color space processing.
- */
- if (pparams == NULL)
- return_error(gs_error_rangecheck);
-
- /*
- * Create a CMYK representation of the various colors in our color space.
- * Note: If we have multiple components, then we do a simple sum of the
- * CMYK equivalent for each color. If desired, a more complex handling is
- * left to the user.
- */
- for (i = 0; i < num_comp; i++) {
- cvalue = pconc[i];
- pantone_index = pparams->color_index[i];
- switch (pantone_index) {
- case PANTONE_NONE:
- break;
- case PANTONE_CYAN:
- cyan += cvalue;
- break;
- case PANTONE_MAGENTA:
- magenta += cvalue;
- break;
- case PANTONE_YELLOW:
- yellow += cvalue;
- break;
- case PANTONE_BLACK:
- black += cvalue;
- break;
- default:
- plist = &(pantone_list[pantone_index]);
- cyan += (int) floor(cvalue * plist->c);
- magenta += (int) floor(cvalue * plist->m);
- yellow += (int) floor(cvalue * plist->y);
- black += (int) floor(cvalue * plist->k);
- break;
- }
- }
- /* Clamp our color values */
- cc = (cyan > frac_1) ? frac_1 : (cyan < frac_0) ? frac_0 : cyan;
- cm = (magenta > frac_1) ? frac_1 : (magenta < frac_0) ? frac_0 : magenta;
- cy = (yellow > frac_1) ? frac_1 : (yellow < frac_0) ? frac_0 : yellow;
- ck = (black > frac_1) ? frac_1 : (black < frac_0) ? frac_0 : black;
- gx_remap_concrete_cmyk(cc, cm, cy, ck, pdc, pis, dev, select);
- return 0;
-}
-
-/*
- * Convert a Separation color (with PANTONE colorants) into device color.
- */
-private int
-client_pantone_remap_Separation(client_custom_color_params_t * pparam,
- 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)
-{
- return client_pantone_remap_color(pparam, pconc,
- (demo_color_space_data_t *)(pcs->pclient_color_space_data),
- pdc, pis, dev, select, 1);
-}
-
-/*
- * Convert a DeviceN color (with PANTONE colorants) into device color.
- */
-private int
-client_pantone_remap_DeviceN(client_custom_color_params_t * pparam,
- 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)
-{
- return client_pantone_remap_color(pparam, pconc,
- (demo_color_space_data_t *)(pcs->pclient_color_space_data),
- pdc, pis, dev, select, gs_color_space_num_components(pcs));
-}
-
-#if OBJECT_TYPE_EXAMPLE
-/*
- * Install a DeviceGray color space.
- */
-private bool
-client_install_DeviceGray(client_custom_color_params_t * pparams,
- gs_color_space * pcs, gs_state * pgs)
-{
- /* Nothing to do in our demo */
- return true;
-}
-
-/*
- * For demo and debug purposes, make our colors a function of the
- * intensity of the given colors and the object type.
- */
-private int
-convert_intensity_into_device_color(const frac intensity,
- gx_device_color * pdc, const gs_imager_state * pis, gx_device * dev,
- gs_color_select_t select)
-{
- frac cc, cm, cy, ck;
-
- switch (pis->object_tag) {
- case GS_TEXT_TAG: /* Make text red. */
- cc = ck = 0;
- cm = cy = frac_1 - intensity;
- break;
- case GS_IMAGE_TAG: /* Make images green. */
- cm = ck = 0;
- cc = cy = frac_1 - intensity;
- break;
- case GS_PATH_TAG: /* Make lines and fills blue. */
- default:
- cy = ck = 0;
- cc = cm = frac_1 - intensity;
- break;
- }
-
- /* Send CMYK colors to the device */
- gx_remap_concrete_cmyk(cc, cm, cy, ck, pdc, pis, dev, select);
- return 0;
-}
-
-/*
- * Convert a DeviceGray color into device color.
- */
-private int
-client_remap_DeviceGray(client_custom_color_params_t * pparams,
- 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)
-{
- /*
- * For demo and debug purposes, make our colors a function of the
- * intensity of the given colors and the object type.
- */
- frac intensity = pconc[0];
-
- convert_intensity_into_device_color(intensity, pdc, pis, dev, select);
- return 0;
-}
-
-/*
- * Install a DeviceRGB color space.
- */
-private bool
-client_install_DeviceRGB(client_custom_color_params_t * pparams,
- gs_color_space * pcs, gs_state * pgs)
-{
- /* Nothing to do in our demo */
- dlprintf1("client_install_DeviceRGB ri = %d\n", pgs->renderingintent);
- return true;
-}
-
-/*
- * Convert a DeviceRGB color into device color.
- */
-private int
-client_remap_DeviceRGB(client_custom_color_params_t * pparams,
- 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)
-{
- /*
- * For demo and debug purposes, make our colors a function of the
- * intensity of the given colors and the object type.
- */
- frac intensity = (frac)(pconc[0] * 0.30 + pconc[1] * 0.59 + pconc[2] * 0.11);
-
- convert_intensity_into_device_color(intensity, pdc, pis, dev, select);
- return 0;
-}
-
-/*
- * Install a DeviceCMYK color space.
- */
-private bool
-client_install_DeviceCMYK(client_custom_color_params_t * pparams,
- gs_color_space * pcs, gs_state * pgs)
-{
- /* Nothing to do in our demo */
- return true;
-}
-
-/*
- * Convert a DeviceGray color into device color.
- */
-private int
-client_remap_DeviceCMYK(client_custom_color_params_t * pparams,
- 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)
-{
- /*
- * For demo and debug purposes, make our colors a function of the
- * intensity of the given colors and the object type.
- */
- frac intensity = frac_1 - (frac)(pconc[0] * 0.30 + pconc[1] * 0.59
- + pconc[2] * 0.11 + pconc[3]);
-
- if (intensity < frac_0)
- intensity = frac_0;
- convert_intensity_into_device_color(intensity, pdc, pis, dev, select);
- return 0;
-}
-
-/*
- * Convert a floating point color value into a fixed (frac) color value
- * given a specified floating point range.
- */
-#define convert2frac(color, range) \
- (color <= range.rmin) ? frac_0 \
- : (color >= range.rmax) ? frac_1 \
- : (frac) (frac_1 * \
- (color - range.rmin) / (range.rmax - range.rmin))
-
-/*
- * Convert a CIEBasedA color into device color.
- */
-private int
-client_remap_CIEBasedA(client_custom_color_params_t * pparams,
- const gs_client_color * pc, const gs_color_space * pcs,
- gx_device_color * pdc, const gs_imager_state * pis, gx_device * dev,
- gs_color_select_t select)
-{
- frac gray = convert2frac(pc->paint.values[0], pcs->params.a->RangeA);
-
- /*
- * For demo and debug purposes, make our colors a function of the
- * intensity of the given color value and the object type.
- */
- return client_remap_DeviceGray(pparams, &gray, pcs, pdc, pis, dev, select);
-}
-
-/*
- * Convert a CIEBasedABC color into device color.
- */
-private int
-client_remap_CIEBasedABC(client_custom_color_params_t * pparams,
- const gs_client_color * pc, const gs_color_space * pcs,
- gx_device_color * pdc, const gs_imager_state * pis, gx_device * dev,
- gs_color_select_t select)
-{
- frac rgb[3];
- int i;
-
- /*
- * For demo and debug purposes, make our colors a function of the
- * intensity of the given color value and the object type. The color
- * values could represent almost anything. However we are assuming
- * that they are RGB values.
- */
- for (i = 0; i < 3; i++)
- rgb[i] = convert2frac(pc->paint.values[i],
- pcs->params.abc->RangeABC.ranges[i]);
- return client_remap_DeviceRGB(pparams, rgb, pcs, pdc, pis, dev, select);
-}
-
-/*
- * Convert a CIEBasedDEF color into device color.
- */
-private int
-client_remap_CIEBasedDEF(client_custom_color_params_t * pparams,
- const gs_client_color * pc, const gs_color_space * pcs,
- gx_device_color * pdc, const gs_imager_state * pis, gx_device * dev,
- gs_color_select_t select)
-{
- frac rgb[3];
- int i;
-
- /*
- * For demo and debug purposes, make our colors a function of the
- * intensity of the given color value and the object type. The color
- * values could represent almost anything. However we are assuming
- * that they are RGB values.
- */
- for (i = 0; i < 3; i++)
- rgb[i] = convert2frac(pc->paint.values[i],
- pcs->params.def->RangeDEF.ranges[i]);
- return client_remap_DeviceRGB(pparams, rgb, pcs, pdc, pis, dev, select);
-}
-
-/*
- * Convert a CIEBasedDEFG color into device color.
- */
-private int
-client_remap_CIEBasedDEFG(client_custom_color_params_t * pparams,
- const gs_client_color * pc, const gs_color_space * pcs,
- gx_device_color * pdc, const gs_imager_state * pis, gx_device * dev,
- gs_color_select_t select)
-{
- frac cmyk[4];
- int i;
-
- /*
- * For demo and debug purposes, make our colors a function of the
- * intensity of the given color value and the object type. The color
- * values could represent almost anything. However we are assuming
- * that they are CMYK values.
- */
- for (i = 0; i < 4; i++)
- cmyk[i] = convert2frac(pc->paint.values[i],
- pcs->params.defg->RangeDEFG.ranges[i]);
- return client_remap_DeviceRGB(pparams, cmyk, pcs, pdc, pis, dev, select);
-}
-
-/*
- * Convert a ICCBased color into device color.
- */
-private int
-client_remap_ICCBased(client_custom_color_params_t * pparams,
- const gs_client_color * pc, const gs_color_space * pcs,
- gx_device_color * pdc, const gs_imager_state * pis, gx_device * dev,
- gs_color_select_t select)
-{
- frac frac_color[GS_CLIENT_COLOR_MAX_COMPONENTS];
- int i, num_values = pcs->params.icc.picc_info->num_components;
-
- /*
- * For demo and debug purposes, make our colors a function of the
- * intensity of the given color value and the object type. The color
- * values could represent almost anything. However based upon the
- * number of color values, we are assuming that they are either
- * gray, RGB, or CMYK values.
- */
- for (i = 0; i < num_values; i++)
- frac_color[i] = convert2frac(pc->paint.values[i],
- pcs->params.icc.picc_info->Range.ranges[i]);
- switch (num_values) {
- case 0:
- case 2:
- return_error(e_rangecheck);
- case 1:
- return client_remap_DeviceGray(pparams, frac_color, pcs,
- pdc, pis, dev, select);
- case 3:
- return client_remap_DeviceRGB(pparams, frac_color, pcs,
- pdc, pis, dev, select);
- case 4:
- default:
- return client_remap_DeviceCMYK(pparams, frac_color, pcs,
- pdc, pis, dev, select);
- }
-}
-
-#undef convert2frac
-
-#endif /* OBJECT_TYPE_EXAMPLE */
-
-#if OBJECT_TYPE_EXAMPLE
-/*
- * Client call back procedures for our demo which illustrates color
- * processing based upon object type.
- */
-client_custom_color_procs_t demo_procs = {
- client_install_DeviceGray, /* DeviceGray */
- client_remap_DeviceGray,
- client_install_DeviceRGB, /* DeviceRGB */
- client_remap_DeviceRGB,
- client_install_DeviceCMYK, /* DeviceCMYK */
- client_remap_DeviceCMYK,
- client_pantone_install_Separation, /* Separation */
- client_pantone_remap_Separation,
- client_pantone_install_DeviceN, /* DeviceN */
- client_pantone_remap_DeviceN,
- client_install_generic, /* CIEBasedA */
- client_remap_CIEBasedA,
- client_install_generic, /* CIEBasedABC */
- client_remap_CIEBasedABC,
- client_install_generic, /* CIEBasedDEF */
- client_remap_CIEBasedDEF,
- client_install_generic, /* CIEBasedDEFG */
- client_remap_CIEBasedDEFG,
- client_install_generic, /* ICCBased */
- client_remap_ICCBased
-};
-#else /* Not OBJECT_TYPE_EXAMPLE special */
-/*
- * For PANTONE colors, we only need to handle Separation and DeviceN
- * color spaces. These are the only color spaces that can have PANTONE
- * colors.
- */
-client_custom_color_procs_t demo_procs = {
- client_install_no_op, /* DeviceGray */
- client_remap_simple_no_op,
- client_install_no_op, /* DeviceRGB */
- client_remap_simple_no_op,
- client_install_no_op, /* DeviceCMYK */
- client_remap_simple_no_op,
- client_pantone_install_Separation, /* Separation */
- client_pantone_remap_Separation,
- client_pantone_install_DeviceN, /* DeviceN */
- client_pantone_remap_DeviceN,
- client_install_no_op, /* CIEBasedA */
- client_remap_complex_no_op,
- client_install_no_op, /* CIEBasedABC */
- client_remap_complex_no_op,
- client_install_no_op, /* CIEBasedDEF */
- client_remap_complex_no_op,
- client_install_no_op, /* CIEBasedDEFG */
- client_remap_complex_no_op,
- client_install_no_op, /* ICCBased */
- client_remap_complex_no_op
-};
-#endif /* OBJECT_TYPE_EXAMPLE */
-
-/*
- * Demo version of the PANTONE call back parameter structure.
- */
-client_custom_color_params_t demo_callback = {
- &demo_procs,
- /*
- * Use our 'list' of Pantone colors as an example data.
- */
- (void *)(&pantone_list)
-};
-#endif /* ENABLE_CUSTOM_COLOR_CALLBACK */
-
-/*
- * This procedure is here to simplify debugging. Normally one would expect the
- * custom color callback structure to be set up by a calling application.
- * Since I do not have a calling application, I need a simple way to setup the
- * callback parameter. The callback parameter is passed as a string value.
- * This routine puts the address of our demo callback structure into the
- * provided string.
- *
- * This routine allows the demo version of the PANTONE logic to be enabled
- * by adding the following to the command line:
- * -c "<< /CustomColorCallback 32 string .pantonecallback >> setsystemparams" -f
- */
-
-/* <string> .pantonecallback <string> */
-private int
-zpantonecallback(i_ctx_t *i_ctx_p)
-{
-#if ENABLE_CUSTOM_COLOR_CALLBACK
- os_ptr op = osp;
- int val, idx, buf_pos = 3;
- size_t iptr;
-#define PTR_STRING_SIZE (2 * size_of(void *) + 3)
-
- /* Verify that the string size is big enough for our output */
- check_type(*op, t_string);
- check_write(*op);
- if (r_size(op) < PTR_STRING_SIZE)
- return_error(e_rangecheck);
-
- /* Convert our call back parameter structure pointer into a string */
- op->value.bytes[0] = '1';
- op->value.bytes[1] = '6';
- op->value.bytes[2] = '#';
- iptr = (size_t)(&demo_callback);
- for (idx = ((int)size_of(size_t)) * 8 - 4; idx >= 0; idx -= 4) {
- val = (int)(iptr >> idx) & 0xf;
- op->value.bytes[buf_pos++] = (byte)((val <= 9) ? '0' + val
- : 'a' - 10 + val);
- }
- r_size(op) = PTR_STRING_SIZE;
-#endif /* ENABLE_CUSTOM_COLOR_CALLBACK */
- return 0;
-}
-
-/* ------ Initialization procedure ------ */
-
-const op_def pantone_op_defs[] =
-{
- {"1.pantonecallback", zpantonecallback},
- op_def_end(0)
-};
-
More information about the gs-cvs
mailing list