summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipdfm-x/pdfcolor.c
diff options
context:
space:
mode:
authorKhaled Hosny <khaledhosny@eglug.org>2015-03-17 21:11:38 +0000
committerKhaled Hosny <khaledhosny@eglug.org>2015-03-17 21:11:38 +0000
commitfa391bc2db07e96f7f0faf7686b7df172fab49ae (patch)
treed6262e119a745e1aec972a91cf060fcc06a5dc1e /Build/source/texk/dvipdfm-x/pdfcolor.c
parentbeba2700adbd1ef654015569b2b8724caf06a7f3 (diff)
Add spot colors support
git-svn-id: svn://tug.org/texlive/trunk@36547 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dvipdfm-x/pdfcolor.c')
-rw-r--r--Build/source/texk/dvipdfm-x/pdfcolor.c63
1 files changed, 59 insertions, 4 deletions
diff --git a/Build/source/texk/dvipdfm-x/pdfcolor.c b/Build/source/texk/dvipdfm-x/pdfcolor.c
index 140c5c5aa52..8eb847e77b3 100644
--- a/Build/source/texk/dvipdfm-x/pdfcolor.c
+++ b/Build/source/texk/dvipdfm-x/pdfcolor.c
@@ -46,7 +46,8 @@ pdf_color_set_verbose (void)
}
/* This function returns PDF_COLORSPACE_TYPE_GRAY,
- * PDF_COLORSPACE_TYPE_RGB or PDF_COLORSPACE_TYPE_CMYK.
+ * PDF_COLORSPACE_TYPE_RGB, PDF_COLORSPACE_TYPE_CMYK or
+ * PDF_COLORSPACE_TYPE_SPOT.
*/
int
pdf_color_type (const pdf_color *color)
@@ -79,6 +80,8 @@ pdf_color_rgbcolor (pdf_color *color, double r, double g, double b)
color->num_components = 3;
+ color->spot_color_name = NULL;
+
return 0;
}
@@ -112,6 +115,8 @@ pdf_color_cmykcolor (pdf_color *color,
color->num_components = 4;
+ color->spot_color_name = NULL;
+
return 0;
}
@@ -129,6 +134,28 @@ pdf_color_graycolor (pdf_color *color, double g)
color->num_components = 1;
+ color->spot_color_name = NULL;
+
+ return 0;
+}
+
+int
+pdf_color_spotcolor (pdf_color *color, char* name, double c)
+{
+ ASSERT(color);
+
+ if (c < 0.0 || c > 1.0) {
+ WARN("Invalid color value specified: grade=%g", c);
+ return -1;
+ }
+
+ color->values[0] = c;
+ color->values[1] = 0.0; /* Dummy */
+
+ color->num_components = 2;
+
+ color->spot_color_name = name;
+
return 0;
}
@@ -191,23 +218,34 @@ pdf_color_is_white (const pdf_color *color)
}
int
-pdf_color_to_string (const pdf_color *color, char *buffer)
+pdf_color_to_string (const pdf_color *color, char *buffer, char mask)
{
int i, len = 0;
- for (i = 0; i < color->num_components; i++) {
- len += sprintf(buffer+len, " %g", ROUND(color->values[i], 0.001));
+ if (pdf_color_type(color) == PDF_COLORSPACE_TYPE_SPOT) {
+ len = sprintf(buffer, " /%s %c%c %g %c%c",
+ color->spot_color_name,
+ 'C' | mask, 'S' | mask,
+ ROUND(color->values[0], 0.001),
+ 'S' | mask, 'C' | mask);
+ } else {
+ for (i = 0; i < color->num_components; i++) {
+ len += sprintf(buffer+len, " %g", ROUND(color->values[i], 0.001));
+ }
}
+
return len;
}
pdf_color current_fill = {
1,
+ NULL,
{0.0, 0.0, 0.0, 0.0}
};
pdf_color current_stroke = {
1,
+ NULL,
{0.0, 0.0, 0.0, 0.0}
};
@@ -222,6 +260,7 @@ pdf_color_compare (const pdf_color *color1, const pdf_color *color2)
n = color1->num_components;
switch (n) {
case 1: /* Gray */
+ case 2: /* Spot */
case 3: /* RGB */
case 4: /* CMYK */
break;
@@ -236,6 +275,9 @@ pdf_color_compare (const pdf_color *color1, const pdf_color *color2)
if (color1->values[n] != color2->values[n])
return -1;
+ if (color1->spot_color_name && color2->spot_color_name)
+ return strcmp(color1->spot_color_name, color2->spot_color_name);
+
return 0;
}
@@ -247,6 +289,7 @@ pdf_color_is_valid (const pdf_color *color)
n = color->num_components;
switch (n) {
case 1: /* Gray */
+ case 2: /* Spot */
case 3: /* RGB */
case 4: /* CMYK */
break;
@@ -260,12 +303,20 @@ pdf_color_is_valid (const pdf_color *color)
return 0;
}
+ if (pdf_color_type(color) == PDF_COLORSPACE_TYPE_SPOT) {
+ if (!color->spot_color_name || color->spot_color_name[0] == '\0') {
+ WARN("Invalid spot color: empty name");
+ return 0;
+ }
+ }
+
return 1;
}
/* Dvipdfm special */
pdf_color default_color = {
1,
+ NULL,
{0.0, 0.0, 0.0, 0.0}
};
@@ -291,6 +342,10 @@ pdf_color_clear_stack (void)
if (color_stack.current > 0) {
WARN("You've mistakenly made a global color change within nested colors.");
}
+ while (color_stack.current--) {
+ free(color_stack.stroke[color_stack.current].spot_color_name);
+ free(color_stack.fill[color_stack.current].spot_color_name);
+ }
color_stack.current = 0;
pdf_color_black(color_stack.stroke);
pdf_color_black(color_stack.fill);