1
--- a/devices/vector/gdevpx.c
2
+++ b/devices/vector/gdevpx.c
5
#include "gdevpcl.h" /* for gdev_pcl_mode3compress() */
6
#include "gsicc_manage.h"
7
+#include "gsicc_cache.h"
8
#include <stdlib.h> /* abs() */
10
/* ---------------- Device definition ---------------- */
18
gs_public_st_suffix_add0_final(st_device_pclxl, gx_device_pclxl,
20
index == gs_color_space_index_ICC);
23
+/* Test whether we can icclink-transform an image. */
25
+pclxl_can_icctransform(const gs_image_t * pim)
27
+ const gs_color_space *pcs = pim->ColorSpace;
28
+ int bits_per_pixel =
29
+ (pim->ImageMask ? 1 :
30
+ pim->BitsPerComponent * gs_color_space_num_components(pcs));
32
+ if ((gs_color_space_get_index(pcs) == gs_color_space_index_ICC)
33
+ && (bits_per_pixel == 24))
39
/* Set brush, pen, and mode for painting a path. */
41
pclxl_set_paints(gx_device_pclxl * xdev, gx_path_type_t type)
43
xdev->MediaPosition = eAutoSelect;
44
xdev->MediaType_old[0] = '\0';
45
xdev->MediaType[0] = '\0';
46
+ /* xdev->iccTransform = false; */ /* set true/false here to ignore command line */
54
+ gsicc_link_t *icclink;
56
gs_private_st_suffix_add1(st_pclxl_image_enum, pclxl_image_enum_t,
57
"pclxl_image_enum_t", pclxl_image_enum_enum_ptrs,
58
@@ -1939,9 +1959,10 @@
59
!((mat.xx == 0) && (mat.yy == 0) && (mat.xy * mat.yx != 0))) ||
61
(!gx_dc_is_pure(pdcolor) || pim->CombineWithColor) :
62
- (!pclxl_can_handle_color_space(pim->ColorSpace) ||
63
- (bits_per_pixel != 1 && bits_per_pixel != 4 &&
64
- bits_per_pixel != 8 && bits_per_pixel !=24))) ||
65
+ ((!pclxl_can_handle_color_space(pcs) ||
66
+ (bits_per_pixel != 1 && bits_per_pixel != 4 &&
67
+ bits_per_pixel != 8 && bits_per_pixel !=24))
68
+ && !(pclxl_can_icctransform(pim) && xdev->iccTransform) )) ||
69
format != gs_image_format_chunky || pim->Interpolate ||
72
@@ -2047,6 +2068,17 @@
73
pie->rows.num_rows = num_rows;
74
pie->rows.first_y = 0;
75
pie->rows.raster = row_raster;
76
+ if (!pclxl_can_handle_color_space(pcs)
77
+ && pclxl_can_icctransform(pim) && pcs->cmm_icc_profile_data) {
78
+ gsicc_rendering_param_t rendering_params;
80
+ rendering_params.black_point_comp = pis->blackptcomp;
81
+ rendering_params.graphics_type_tag = GS_IMAGE_TAG;
82
+ rendering_params.rendering_intent = pis->renderingintent;
83
+ pie->icclink = gsicc_get_link(pis, dev, pcs, NULL /*des */ ,
84
+ &rendering_params, pis->memory);
86
+ pie->icclink = NULL;
87
*pinfo = (gx_image_enum_common_t *) pie;
89
gs_logical_operation_t lop = pis->log_op;
90
@@ -2188,11 +2220,12 @@
91
px_put_ub(s, eBit_values[8]);
93
if (xdev->color_info.depth==8) {
95
+ if (!pie->icclink) {
96
byte *in=pie->rows.data + offset_lastflippedstrip;
97
byte *out=pie->rows.data + offset_lastflippedstrip;
101
for (j=0; j<h; j++) {
102
for (i=0; i<rows_raster; i++) {
103
*out = (byte)( ((*(in+0) * (ulong) lum_red_weight) +
104
@@ -2203,6 +2236,7 @@
111
static const byte ii_[] = {
112
@@ -2245,10 +2279,32 @@
114
pie->rows.first_y = pie->y;
117
memcpy(pie->rows.data +
118
pie->rows.raster * (pie->flipped ? (pie->rows.num_rows - (pie->y - pie->rows.first_y) -1) :(pie->y - pie->rows.first_y)),
119
planes[0].data + planes[0].raster * i + (data_bit >> 3),
122
+ gsicc_bufferdesc_t input_buff_desc;
123
+ gsicc_bufferdesc_t output_buff_desc;
124
+ int pixels_per_row = pie->rows.raster / 3 ;
125
+ int out_raster_stride = pixels_per_row * info->dev->color_info.num_components;
126
+ gsicc_init_buffer(&input_buff_desc, 3 /*num_chan*/, 1 /*bytes_per_chan*/,
127
+ false/*has_alpha*/, false/*alpha_first*/, false /*is_planar*/,
128
+ 0 /*plane_stride*/, pie->rows.raster /*row_stride*/,
129
+ 1/*num_rows*/, pixels_per_row /*pixels_per_row*/);
130
+ gsicc_init_buffer(&output_buff_desc, info->dev->color_info.num_components, 1,
131
+ false, false, false,
132
+ 0, out_raster_stride,
133
+ 1, pixels_per_row);
134
+ gscms_transform_color_buffer(info->dev, pie->icclink,
137
+ (void *)(planes[0].data + planes[0].raster * i + (data_bit >> 3)), /*src*/
139
+ out_raster_stride * (pie->flipped ? (pie->rows.num_rows - (pie->y - pie->rows.first_y) -1) : (pie->y - pie->rows.first_y)) /*des*/
144
return pie->y >= pie->height;
145
@@ -2341,6 +2397,9 @@
146
&(xdev->CompressMode))) < 0)
149
+ if ((code = param_write_bool(plist, "iccTransform", &(xdev->iccTransform))) < 0)
155
@@ -2446,6 +2505,7 @@
157
booloption(Tumble, "Tumble")
158
intoption(CompressMode, "CompressMode", int)
159
+ booloption(iccTransform, "iccTransform")
162
* Then process standard page device parameters...