From acd68df592db10abd0656490c9da643ec8b0cb36 Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Sun, 13 Apr 2025 13:31:19 -0400 Subject: [PATCH] Start work on OutputIntent and better color support in PDFio: - Add CGATS001-compatible "micro" ICC profile as a standard CMYK color space (this is the default used by several Adobe applications) - Add `PDFIO_CS_CGATS001` color space enum. - Extend `pdfioArrayCreateColorFromStandard` to support CMYK. - Extend `pdfioFileCreateImageObjFromFile` to support CMYK JPEG files. - Update `pdfioFileCreatePage` to add default grayscale, RGB, and CMYK color space resources as needed. --- CHANGES.md | 6 + pdfio-cgats001-compat.h | 532 ++++++++++++++++++++++++++ pdfio-content.c | 29 +- pdfio-content.h | 5 +- pdfio-file.c | 6 +- pdfio-private.h | 3 +- pdfio.h | 4 +- testfiles/CGATS001Compat-v2-micro.icc | Bin 0 -> 8464 bytes testfiles/CGATS001Compat-v2-micro.txt | 5 + 9 files changed, 577 insertions(+), 13 deletions(-) create mode 100644 pdfio-cgats001-compat.h create mode 100644 testfiles/CGATS001Compat-v2-micro.icc create mode 100644 testfiles/CGATS001Compat-v2-micro.txt diff --git a/CHANGES.md b/CHANGES.md index 56a84c3..3a008ae 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,12 @@ Changes in PDFio v1.6.0 - YYYY-MM-DD ------------------- +- Added "standard" `PDFIO_CS_CGATS001` color space for non-device CMYK + (Issue #104) +- Added CMYK JPEG support with embedded ICC profiles or using the CGATS001 + profile (Issue #104) +- Now add default grayscale, RGB, and CMYK profile resources to pages as needed + (Issue #104) - Added `pdfioFileCreateFontObjFromData` function for embedding fonts in memory (Issue #120) diff --git a/pdfio-cgats001-compat.h b/pdfio-cgats001-compat.h new file mode 100644 index 0000000..715d345 --- /dev/null +++ b/pdfio-cgats001-compat.h @@ -0,0 +1,532 @@ +/* CGATS001Compat-v2-micro.icc */ +static unsigned char CGATS001Compat_v2_micro_icc[] = { +0,0,33,16,65,68,66,69,2,16,0,0,115,99,110,114, +67,77,89,75,76,97,98,32,7,230,0,12,0,7,0,22, +0,16,0,42,97,99,115,112,77,83,70,84,0,0,0,0, +115,97,119,115,99,116,114,108,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,246,214,0,1,0,0,0,0,211,45, +104,97,110,100,195,103,209,209,26,217,105,182,62,57,156,48, +22,179,165,88,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,4,100,101,115,99,0,0,0,180,0,0,0,95, +99,112,114,116,0,0,0,208,0,0,0,12,119,116,112,116, +0,0,0,220,0,0,0,20,65,50,66,48,0,0,0,240, +0,0,32,32,100,101,115,99,0,0,0,0,0,0,0,5, +117,67,77,89,0,0,0,0,0,0,0,0,0,0,0,0, +116,101,120,116,0,0,0,0,67,67,48,0,88,89,90,32, +0,0,0,0,0,0,246,214,0,1,0,0,0,0,211,45, +109,102,116,50,0,0,0,0,4,3,6,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +0,48,0,2,0,0,10,35,16,0,22,155,28,150,35,8, +41,37,47,68,53,83,59,90,65,90,71,78,77,74,83,48, +89,25,94,245,100,188,106,133,112,43,117,193,123,79,128,187, +134,23,139,107,144,166,149,206,154,244,160,21,165,30,170,40, +175,51,180,64,185,71,190,81,195,91,200,103,205,100,210,85, +215,65,220,33,224,252,229,190,234,87,238,218,243,138,248,23, +252,104,255,255,0,0,8,214,13,206,19,98,24,129,30,6, +35,77,40,160,46,0,51,86,56,193,62,41,67,165,73,37, +78,162,84,51,89,175,95,46,100,173,106,10,111,107,116,191, +121,244,127,36,132,82,137,98,142,111,147,127,152,147,157,151, +162,172,167,211,173,14,178,88,183,186,189,52,194,199,200,90, +205,244,211,154,217,72,223,1,228,146,234,19,239,215,245,132, +251,7,255,255,0,0,9,30,14,44,19,200,24,222,30,99, +35,150,40,200,45,246,51,35,56,84,61,138,66,209,72,33, +77,126,82,234,88,89,93,211,99,74,104,190,110,47,115,148, +120,237,126,59,131,126,136,180,141,231,147,29,152,90,157,169, +163,18,168,158,174,79,180,41,186,39,192,69,198,114,204,164, +210,199,216,201,222,161,228,73,233,160,238,170,243,244,248,186, +252,225,255,255,0,0,8,135,13,57,18,115,23,60,28,123, +33,106,38,94,43,92,48,99,53,110,58,133,63,163,68,202, +73,244,79,35,84,77,89,109,94,139,99,158,104,170,109,176, +114,172,119,156,124,135,129,112,134,74,139,35,143,254,148,223, +153,201,158,194,163,209,168,251,174,67,179,163,185,36,190,202, +196,145,202,125,208,133,214,166,220,240,227,93,234,118,241,193, +249,40,255,255,255,0,128,0,128,0,214,110,127,181,126,251, +173,86,127,150,126,88,131,53,127,186,126,83,86,78,128,50, +126,192,31,100,129,254,128,28,251,120,125,171,146,104,211,247, +125,155,142,161,171,46,125,194,139,106,129,32,126,37,136,221, +84,57,126,196,134,230,28,170,128,62,134,99,248,103,123,237, +165,11,209,76,123,249,158,148,168,209,124,68,152,192,127,22, +124,213,147,218,82,110,125,139,143,116,26,73,126,145,140,106, +245,211,122,201,183,251,206,211,122,205,174,205,166,160,123,35, +166,133,125,42,123,200,159,52,80,217,124,141,151,243,24,82, +125,10,144,4,243,199,122,9,203,97,204,207,121,247,191,95, +164,205,122,74,180,169,123,179,123,1,171,70,79,144,123,201, +163,159,22,200,123,191,143,103,242,42,121,140,223,132,203,50, +121,98,208,125,163,73,121,169,195,108,122,115,122,107,184,86, +78,150,123,56,174,96,21,158,122,200,142,157,227,233,142,168, +125,57,191,208,140,54,124,173,154,204,138,30,124,141,116,50, +136,124,124,247,74,84,135,121,125,199,20,34,137,177,127,236, +224,239,140,172,141,230,189,193,138,73,138,227,152,241,136,91, +136,116,114,87,134,238,134,171,72,129,134,18,133,143,18,45, +135,202,133,165,222,108,139,13,159,8,187,88,136,200,153,179, +150,192,134,245,148,251,112,129,133,173,145,24,70,249,132,229, +142,34,16,97,134,27,137,235,220,58,137,245,176,93,185,57, +135,184,168,203,148,204,133,239,161,238,110,212,132,170,155,243, +69,169,131,235,151,169,15,9,132,165,138,43,218,113,137,45, +194,46,183,137,134,242,184,87,147,63,133,43,175,95,109,144, +131,243,167,166,68,161,131,41,161,166,14,7,131,135,137,124, +217,12,136,152,212,229,182,53,134,99,200,164,145,250,132,152, +189,153,108,133,131,103,180,155,67,209,130,165,170,33,13,68, +130,183,136,248,201,213,157,235,123,46,169,121,153,123,122,234, +136,53,149,117,123,19,101,12,146,14,123,193,62,13,143,191, +124,214,9,84,144,204,127,187,199,84,156,73,138,107,167,205, +151,198,136,7,134,185,147,217,134,42,99,150,144,153,132,246, +60,167,142,98,132,135,8,113,142,126,132,36,197,113,154,202, +153,237,165,235,150,98,149,123,132,247,146,119,145,165,98,4, +143,82,142,167,59,93,141,42,140,19,7,182,140,158,133,55, +195,166,153,193,169,229,164,50,149,94,163,134,131,66,145,135, +157,217,96,149,142,92,153,26,58,81,140,51,150,79,7,25, +139,41,132,204,194,42,153,10,186,48,162,214,148,166,177,236, +129,253,144,210,170,123,95,138,141,175,164,116,57,139,139,110, +159,13,6,174,138,21,132,132,192,255,152,123,203,106,161,198, +148,25,193,44,128,245,144,72,184,9,94,179,141,45,177,103, +56,235,138,244,165,100,6,89,137,77,132,75,177,37,173,245, +122,2,147,243,167,169,121,209,117,242,161,206,122,23,85,235, +156,180,122,225,49,88,150,201,124,2,0,239,149,92,127,195, +175,57,172,141,135,237,146,202,166,25,133,179,116,224,160,67, +132,66,84,210,155,60,131,120,48,93,152,11,131,193,0,226, +147,96,128,133,173,202,171,58,150,19,145,79,164,217,146,68, +115,118,159,2,143,29,83,154,154,5,140,217,47,124,150,201, +140,54,0,206,145,182,128,139,172,145,170,52,164,133,144,19, +163,219,159,13,114,58,158,5,154,89,82,143,152,241,150,198, +46,202,149,168,148,235,0,217,144,85,128,147,171,106,169,130, +179,137,143,32,163,20,172,85,113,80,157,63,162,160,81,202, +152,62,161,248,46,73,148,212,155,139,0,219,143,72,128,148, +170,119,169,1,195,84,142,87,162,131,186,91,112,151,156,179, +178,242,81,58,151,186,174,21,45,236,148,82,159,13,0,222, +142,134,128,150,154,49,190,221,121,79,127,198,182,195,121,6, +100,136,175,54,121,74,71,42,168,146,122,23,36,45,165,99, +123,14,0,0,143,153,128,0,152,249,189,121,134,22,127,13, +181,72,132,75,99,211,173,165,130,235,70,115,166,244,130,111, +35,202,163,124,130,239,0,0,142,213,128,0,152,46,188,21, +146,252,126,42,179,238,143,148,98,240,172,64,140,239,69,182, +165,143,139,90,35,118,161,226,138,239,0,0,142,33,128,0, +151,95,187,20,156,183,125,105,178,222,152,248,98,53,171,44, +148,44,69,34,164,102,145,119,35,60,160,141,143,228,0,0, +141,150,128,0,150,186,186,65,173,194,124,235,177,250,167,108, +97,205,170,70,162,133,68,210,163,131,159,209,35,33,159,106, +150,67,0,0,141,57,128,0,150,10,185,176,188,68,124,138, +177,69,180,40,97,126,169,128,174,82,68,159,162,198,170,52, +35,38,158,179,151,196,0,0,140,230,128,0,132,180,208,159, +120,243,108,190,198,205,120,107,83,203,189,201,120,144,56,144, +181,241,121,63,22,242,178,158,122,81,0,0,137,249,128,0, +132,84,206,246,132,213,108,102,197,80,130,218,83,105,188,24, +129,168,56,75,180,0,129,93,23,73,176,8,130,10,0,0, +138,37,128,0,132,67,205,78,144,147,108,56,195,164,141,107, +83,48,186,79,139,41,56,52,178,35,138,58,23,180,173,196, +137,41,0,0,138,73,128,0,132,35,203,251,156,155,108,55, +194,41,152,56,83,60,184,196,149,21,56,85,176,133,148,4, +24,42,171,234,144,154,0,0,138,101,128,0,131,240,202,242, +168,242,108,66,193,0,163,54,83,110,183,140,159,100,56,150, +175,80,157,234,24,158,170,120,144,165,0,0,138,121,128,0, +131,190,202,18,181,197,108,88,192,13,174,136,83,181,182,138, +170,24,56,250,174,76,165,33,25,38,169,99,145,1,0,0, +138,136,128,0,235,21,120,95,117,172,198,143,121,103,118,146, +160,155,122,106,119,154,120,244,123,117,120,218,78,61,124,157, +122,46,24,103,126,52,123,43,231,220,117,150,135,222,195,241, +118,230,133,232,158,88,120,46,132,101,118,244,121,124,131,68, +76,100,122,195,129,102,22,11,123,166,130,96,228,245,115,130, +154,56,193,46,116,236,149,151,155,232,118,93,145,116,116,232, +119,221,141,248,74,174,121,54,138,229,19,252,121,133,135,196, +226,139,114,5,172,159,190,208,115,112,165,140,153,177,116,238, +158,247,114,251,118,134,153,19,73,38,119,231,148,52,18,94, +119,220,139,241,224,194,113,11,191,52,189,12,114,105,181,200, +151,244,115,224,172,209,113,127,117,135,164,211,71,234,118,225, +158,108,17,36,118,168,139,151,223,129,112,120,210,33,187,195, +113,192,198,94,150,146,115,32,187,38,112,68,116,200,177,102, +70,235,118,28,168,223,16,59,117,202,138,249,209,115,134,135, +115,123,177,87,133,101,116,211,143,52,132,136,118,40,106,212, +131,237,119,166,66,203,131,210,121,44,13,68,133,161,122,166, +207,74,132,21,132,44,175,136,131,38,130,252,141,102,130,108, +130,15,105,23,129,246,129,111,65,44,129,242,129,3,11,242, +131,47,128,187,204,230,130,32,148,250,173,11,129,68,145,118, +139,42,128,171,142,60,103,60,128,104,139,143,63,171,128,112, +137,123,10,160,129,38,133,169,202,204,128,181,165,229,170,253, +127,222,160,68,137,59,127,80,154,224,101,154,127,25,150,30, +62,106,127,39,146,206,9,181,127,147,134,144,201,66,127,194, +183,38,169,111,126,232,175,109,135,176,126,82,167,231,100,77, +126,40,161,100,61,104,126,40,156,138,9,4,126,105,134,24, +200,52,127,42,201,23,168,66,126,72,191,65,134,106,125,151, +181,160,99,54,125,111,173,200,60,152,125,113,164,221,8,120, +125,143,133,186,184,173,149,106,113,228,156,34,146,61,115,98, +125,114,143,136,116,221,92,54,141,74,118,127,54,161,140,45, +120,8,3,238,139,88,123,49,182,255,147,72,129,49,154,137, +144,64,128,123,123,227,141,162,127,240,90,199,139,126,127,190, +53,89,138,93,127,196,3,128,136,228,128,74,181,64,145,117, +144,98,152,169,142,132,141,169,122,46,139,240,139,55,89,77, +137,236,137,71,52,47,136,204,136,38,3,22,134,234,130,22, +179,141,144,32,160,3,151,4,141,51,155,112,120,129,138,173, +151,29,87,228,136,172,147,114,51,37,135,135,145,82,2,193, +133,95,129,221,178,73,143,62,175,217,149,185,140,83,169,123, +119,61,137,196,163,94,86,209,135,201,158,101,50,96,134,132, +153,234,2,137,132,59,129,182,177,102,142,167,192,110,148,187, +139,188,184,74,118,48,137,28,176,117,85,236,135,30,170,208, +49,180,133,217,160,46,2,88,131,104,129,150,161,39,165,31, +112,232,135,104,160,39,114,94,107,178,155,186,115,225,77,78, +151,243,117,130,41,135,150,141,118,177,0,66,137,171,126,52, +160,0,163,78,126,58,134,90,158,94,125,202,106,159,153,235, +126,68,76,76,150,41,126,114,40,187,148,150,126,116,0,60, +135,218,127,249,158,179,161,163,140,195,132,230,156,194,138,139, +105,69,152,84,136,161,75,40,148,163,135,100,39,242,146,245, +134,224,0,50,134,74,128,34,157,132,160,84,154,226,131,173, +155,126,151,25,104,13,151,13,147,166,74,49,147,72,145,0, +39,88,145,123,143,118,0,46,133,35,128,31,156,138,159,124, +169,118,130,195,154,160,164,33,103,23,150,32,159,51,73,88, +146,97,155,208,38,210,144,100,150,43,0,40,132,62,128,27, +155,211,158,242,184,169,130,0,154,13,177,217,102,77,149,124, +171,165,72,175,145,184,167,171,38,95,143,176,153,237,0,36, +131,152,128,24,139,20,181,218,112,19,115,151,175,83,113,97, +90,95,169,85,114,209,62,89,164,67,116,78,27,220,162,240, +117,20,0,0,132,76,128,0,138,120,180,61,125,106,115,25, +173,150,124,255,89,217,167,107,124,81,61,228,162,62,124,151, +27,203,160,109,125,6,0,0,131,187,128,0,137,192,178,136, +137,145,114,53,171,233,135,226,88,255,165,185,134,144,61,56, +160,141,133,174,27,150,158,104,133,23,0,0,131,37,128,0, +136,247,177,65,150,121,113,106,170,160,145,137,88,50,164,101, +144,140,60,162,159,30,142,229,27,110,156,173,140,81,0,0, +130,194,128,0,136,101,176,88,163,151,112,222,169,174,159,42, +87,167,163,100,155,105,60,52,158,16,153,106,27,92,155,60, +144,208,0,0,130,140,128,0,135,225,175,208,177,149,112,130, +169,4,171,225,87,60,162,144,167,47,59,221,157,49,163,199, +27,68,154,81,146,112,0,0,130,90,128,0,118,47,199,165, +111,81,96,137,191,214,112,85,73,93,184,132,113,146,47,37, +178,156,114,188,14,114,176,12,115,215,0,0,129,66,128,0, +118,37,198,9,123,103,96,145,189,252,122,224,73,95,182,83, +122,140,47,79,176,27,122,242,15,16,173,6,123,149,0,0, +129,65,128,0,118,26,196,25,134,225,96,81,188,12,133,19, +73,32,180,78,131,219,47,67,173,249,131,127,15,152,170,90, +131,15,0,0,129,64,128,0,117,232,194,153,146,128,96,44, +186,112,143,187,72,249,178,157,141,124,47,72,172,34,141,8, +16,17,168,31,136,88,0,0,129,63,128,0,117,180,193,153, +158,127,96,36,185,65,154,198,72,250,177,80,152,1,47,90, +170,197,151,16,16,120,166,98,139,34,0,0,129,63,128,0, +117,138,192,236,171,6,96,44,184,93,166,88,73,12,176,73, +163,22,47,127,169,175,158,184,16,201,165,41,139,89,0,0, +129,62,128,0,215,58,112,125,107,98,182,48,114,183,110,9, +147,81,116,191,112,146,110,79,118,168,115,18,69,242,120,110, +117,99,17,41,122,4,118,21,212,37,109,25,125,61,179,174, +111,175,125,19,145,41,114,6,125,27,108,110,116,58,125,82, +68,67,118,17,125,118,15,115,119,100,124,211,209,76,106,99, +143,18,176,232,109,33,140,81,142,189,111,175,137,216,106,111, +114,31,135,215,66,173,115,252,133,236,14,12,117,65,131,106, +206,240,104,112,160,225,174,148,107,62,155,216,140,130,109,225, +150,255,104,143,112,110,146,160,65,64,114,73,142,92,12,238, +115,154,136,44,205,74,103,27,178,184,172,233,105,229,171,138, +138,211,108,132,164,100,103,24,111,33,157,249,64,30,112,232, +153,0,12,32,114,96,136,51,204,67,102,85,196,179,171,201, +105,11,187,103,137,134,107,139,178,19,101,232,110,39,169,242, +63,37,113,29,163,2,11,134,113,150,135,202,191,51,125,253, +105,204,162,88,126,40,108,203,130,244,126,117,111,124,96,224, +126,227,114,20,58,181,127,161,116,87,6,250,129,135,117,232, +189,59,122,243,122,101,160,121,123,114,122,237,129,38,123,241, +123,66,95,70,124,136,123,210,57,87,125,61,124,104,6,56, +126,240,124,161,186,231,120,104,138,147,158,7,121,10,136,216, +126,247,121,180,135,50,93,119,122,128,133,202,55,236,123,44, +132,147,5,122,125,75,129,223,184,229,118,148,155,6,156,7, +119,69,151,69,125,15,119,255,147,122,91,227,120,220,144,16, +54,189,121,122,141,190,4,240,123,230,131,75,183,122,117,78, +171,160,154,140,117,255,165,231,123,150,118,180,160,18,90,158, +119,159,154,248,53,206,120,29,151,54,4,139,123,11,131,18, +182,151,116,140,188,154,153,124,117,45,180,249,122,105,117,198, +173,42,89,148,118,175,166,195,52,247,119,27,159,91,4,58, +122,75,130,219,168,10,140,102,104,152,142,157,138,129,107,167, +114,84,137,23,110,98,83,5,136,13,112,248,46,178,136,50, +114,232,0,0,134,1,119,195,166,152,137,165,119,142,140,252, +136,21,120,113,112,187,134,199,121,68,81,165,133,209,122,43, +45,147,133,199,122,111,0,0,131,203,125,115,164,228,135,58, +134,91,139,30,133,208,133,102,111,24,132,156,132,87,80,93, +131,190,131,134,44,163,131,149,130,248,0,0,129,242,128,0, +163,51,133,129,149,157,137,135,132,33,146,220,109,118,130,247, +143,243,78,252,130,37,141,109,43,168,129,222,139,252,0,0, +128,80,128,0,162,3,132,83,164,223,136,69,130,249,160,109, +108,52,129,194,155,194,77,229,128,243,151,242,42,242,128,117, +148,112,0,0,128,0,128,0,161,66,131,152,180,173,135,81, +130,59,174,155,107,41,128,225,168,60,77,1,128,10,163,180, +42,74,127,120,154,175,0,0,128,0,128,0,145,188,155,172, +103,193,122,194,152,25,106,174,97,34,149,28,109,90,68,88, +146,185,111,205,33,58,147,6,113,3,0,0,128,158,125,23, +144,178,153,85,117,117,121,161,149,241,118,113,96,7,146,235, +119,201,67,104,144,128,120,192,32,163,144,90,120,208,0,0, +128,83,127,160,143,100,151,24,131,16,120,32,147,209,130,146, +94,175,144,218,130,3,66,85,142,130,129,188,32,1,142,10, +128,235,0,0,128,0,128,0,142,45,149,108,144,194,118,226, +146,54,142,170,93,120,143,61,140,135,65,117,140,210,138,222, +31,136,140,18,137,181,0,0,128,0,128,0,141,62,148,80, +158,204,117,254,145,26,155,76,92,129,142,10,151,180,64,146, +139,158,149,70,31,15,138,141,145,227,0,0,128,0,128,0, +140,159,147,161,173,59,117,64,144,98,168,119,91,182,141,51, +163,160,63,227,138,184,160,184,30,155,137,127,148,146,0,0, +128,0,128,0,124,171,172,10,102,190,103,126,167,39,105,111, +80,11,162,201,107,245,53,57,159,120,110,24,19,165,158,208, +111,20,0,0,128,0,128,0,123,249,170,24,116,224,102,230, +165,24,117,140,79,132,160,128,117,94,52,226,156,255,118,88, +19,187,155,193,119,9,0,0,128,0,128,0,123,42,167,228, +127,253,101,234,162,244,127,85,78,167,158,94,127,12,52,67, +154,215,126,238,19,159,153,39,127,38,0,0,128,0,128,0, +122,87,166,68,140,182,101,22,161,89,139,59,77,209,156,183, +137,52,51,180,153,17,136,91,19,135,150,246,134,122,0,0, +128,0,128,0,121,194,165,30,152,238,100,130,160,44,150,73, +77,54,155,119,147,192,51,58,151,189,146,136,19,131,149,48, +139,58,0,0,128,0,128,0,121,80,164,119,166,54,100,51, +159,99,162,165,76,201,154,118,159,46,50,220,150,162,156,195, +19,98,147,245,141,27,0,0,128,0,128,0,104,127,189,181, +101,120,84,142,183,253,103,201,62,206,178,149,106,4,37,57, +175,32,107,133,7,201,168,185,110,103,0,0,128,0,128,0, +104,19,188,17,113,56,84,117,181,220,113,249,62,221,175,253, +114,239,37,150,172,20,115,158,8,71,165,174,118,13,0,0, +128,0,128,0,103,206,185,191,124,128,84,14,179,133,124,35, +62,146,173,145,124,7,37,152,169,115,124,23,8,149,163,10, +125,3,0,0,128,0,128,0,103,132,183,243,135,237,83,215, +177,160,134,186,62,83,171,151,133,157,37,151,167,69,133,155, +8,210,160,225,134,24,0,0,128,0,128,0,103,71,182,193, +147,197,83,203,176,53,145,186,62,65,170,12,143,228,37,150, +165,157,143,124,9,4,159,47,134,25,0,0,128,0,128,0, +103,34,182,5,159,118,83,218,175,42,156,247,62,66,168,216, +154,228,37,162,164,81,151,207,9,28,157,237,134,41,0,0, +128,0,128,0,195,134,104,39,97,50,165,143,107,98,101,100, +133,177,110,87,105,86,99,107,113,26,109,23,61,117,115,78, +112,105,10,197,118,146,113,155,192,120,99,196,114,159,163,37, +103,127,116,32,131,159,106,221,117,164,97,161,109,247,119,42, +59,237,112,35,120,108,9,208,115,227,120,197,189,150,96,56, +131,182,160,101,100,60,130,212,129,66,103,227,130,4,95,178, +107,69,129,80,58,117,109,94,128,220,8,252,114,54,127,181, +187,44,93,116,149,0,158,28,97,167,145,220,127,29,101,119, +142,191,93,247,105,0,139,222,57,48,106,248,136,228,8,98, +114,207,133,15,185,130,91,150,166,49,156,129,95,216,160,239, +125,137,99,178,155,159,92,152,103,80,150,226,56,49,105,27, +147,108,7,231,114,249,133,88,184,132,90,105,183,86,155,115, +94,161,175,238,124,98,98,101,168,131,91,140,105,1,162,44, +55,84,103,155,156,250,7,143,115,57,133,29,173,93,116,242, +96,48,147,55,118,74,100,152,118,92,119,176,104,140,86,142, +121,30,108,57,50,50,122,128,111,45,2,87,126,109,114,86, +171,85,112,240,112,28,145,91,114,194,114,35,116,164,116,109, +115,251,85,28,118,12,117,186,49,17,119,53,119,0,2,43, +125,195,121,110,168,240,109,150,128,2,142,230,111,169,127,232, +114,129,113,144,127,187,83,92,115,109,127,135,47,194,116,98, +127,74,1,226,125,94,127,32,166,228,106,254,143,238,140,233, +109,54,141,221,112,164,111,63,139,156,81,229,113,51,137,125, +46,184,113,233,136,69,1,188,125,70,129,22,165,119,105,58, +159,231,139,118,107,126,155,238,111,59,109,141,151,183,80,175, +111,144,148,16,45,231,112,10,145,123,1,153,125,77,129,20, +164,153,104,24,176,2,138,114,106,82,170,42,110,35,111,42, +164,16,79,186,110,75,159,42,45,29,110,151,153,133,1,123, +125,127,129,0,151,185,130,155,95,107,128,155,130,26,99,200, +102,131,129,250,103,171,73,25,130,36,107,48,37,224,131,72, +109,106,0,0,128,15,119,32,150,37,126,232,109,252,126,233, +126,222,112,71,100,238,126,239,114,85,71,211,127,49,116,50, +36,254,127,224,117,40,0,0,128,0,125,1,148,89,123,191, +124,214,124,252,123,247,125,43,99,88,124,49,125,116,70,157, +124,147,125,171,36,61,124,241,125,162,0,0,128,0,128,0, +146,160,121,84,139,48,123,96,121,170,138,25,97,182,121,248, +136,132,69,80,122,100,134,203,35,88,122,135,134,48,0,0, +128,0,128,0,145,107,119,175,153,210,122,36,120,16,150,250, +96,132,120,91,147,207,68,71,120,200,145,64,34,188,120,174, +142,195,0,0,128,0,128,0,144,162,120,93,168,186,121,57, +120,129,164,90,95,144,120,148,159,155,67,117,120,204,156,88, +34,21,119,83,148,183,0,0,128,0,128,0,130,198,145,99, +94,162,109,209,143,77,98,193,86,12,141,196,102,123,58,184, +140,221,105,176,24,115,141,200,107,28,0,0,128,0,124,73, +129,132,142,31,107,235,108,146,140,92,110,64,84,240,138,218, +113,211,57,230,137,229,115,138,24,36,138,59,114,239,0,0, +128,0,127,132,128,22,139,40,121,37,107,6,137,153,122,194, +83,165,136,48,123,82,56,243,135,70,123,12,23,189,135,58, +123,75,0,0,128,0,128,0,126,190,136,215,135,50,105,197, +135,98,134,150,82,127,133,248,133,151,56,76,132,242,133,17, +23,130,132,161,132,185,0,0,128,0,128,0,125,190,135,83, +147,232,104,226,133,228,145,251,81,131,132,98,143,208,55,90, +131,82,142,43,23,27,130,174,140,195,0,0,128,0,128,0, +125,14,134,79,161,162,104,29,132,220,158,145,80,187,131,56, +154,254,54,173,130,12,153,42,22,191,129,62,143,48,0,0, +128,0,128,0,110,138,161,103,93,113,91,64,158,36,97,61, +69,98,155,115,100,180,43,134,154,24,103,87,11,238,152,5, +105,90,0,0,128,0,127,174,109,133,158,164,105,164,90,112, +155,103,107,227,68,195,152,129,109,252,43,62,150,221,111,137, +12,25,148,105,113,67,0,0,128,0,128,0,108,132,155,200, +117,179,89,77,152,172,118,164,67,211,149,207,119,119,42,162, +148,24,120,5,12,19,145,67,121,90,0,0,128,0,128,0, +107,134,153,143,129,221,88,92,150,130,129,173,66,235,147,154, +129,73,42,24,145,180,129,15,12,0,142,157,128,215,0,0, +128,0,128,0,106,209,152,11,143,26,87,176,149,0,141,197, +66,62,146,3,140,0,41,140,143,253,139,52,12,1,140,140, +133,216,0,0,128,0,128,0,106,74,151,18,154,199,87,83, +147,243,152,208,65,214,144,186,150,118,41,61,142,132,149,10, +11,233,139,8,136,14,0,0,128,0,128,0,90,217,179,10, +91,159,72,146,175,35,94,239,52,17,171,191,97,242,26,122, +171,135,99,103,2,147,158,4,105,195,0,0,128,0,128,0, +89,242,176,188,102,234,72,22,172,122,104,233,51,223,168,163, +106,202,26,208,167,186,107,134,3,13,154,120,113,121,0,0, +128,0,128,0,89,104,173,222,113,237,71,119,169,158,114,221, +51,113,165,180,115,185,26,205,164,114,115,225,3,91,151,84, +119,101,0,0,128,0,128,0,88,225,171,136,125,19,71,16, +167,63,125,46,51,16,163,58,125,29,26,204,161,154,125,2, +3,150,148,166,126,188,0,0,128,0,128,0,88,127,169,250, +136,100,70,230,165,137,135,210,50,233,161,96,135,19,26,190, +159,136,135,59,3,199,146,155,130,61,0,0,128,0,128,0, +88,66,168,239,147,235,70,221,164,67,146,236,50,224,159,237, +145,204,26,206,157,221,143,133,3,222,145,7,130,157,0,0, +128,0,128,0,176,156,94,195,87,72,149,115,98,233,92,217, +120,99,102,205,98,34,88,182,106,104,103,28,53,1,108,159, +107,102,5,152,118,139,109,251,173,120,88,199,104,44,147,0, +93,173,107,60,118,78,98,35,110,48,86,244,102,42,113,1, +51,155,104,36,115,88,5,62,119,36,117,123,170,129,83,218, +120,230,144,69,89,66,121,155,116,3,94,37,122,79,85,27, +98,129,123,12,50,72,100,77,123,164,4,235,119,176,124,186, +167,244,79,239,137,125,142,8,85,186,136,49,114,1,90,231, +134,220,83,144,95,120,133,94,49,50,97,23,132,122,4,171, +120,27,130,105,166,29,76,244,153,245,140,119,83,4,150,99, +112,161,88,98,146,223,82,98,93,18,143,209,48,103,94,148, +141,222,4,128,120,101,131,11,165,1,75,27,170,73,139,111, +81,61,164,132,111,168,86,158,159,0,81,141,91,86,154,125, +47,181,92,180,151,6,4,90,120,165,130,241,156,106,106,192, +86,220,132,107,109,76,92,113,105,223,111,205,97,148,76,63, +114,46,102,77,41,113,115,222,105,208,0,133,127,32,112,194, +154,6,101,52,102,67,130,120,104,112,105,168,104,51,107,92, +108,201,74,235,109,253,111,166,40,136,111,123,113,155,0,121, +127,52,119,248,151,123,96,136,117,195,127,250,100,52,119,22, +102,27,103,124,120,55,73,62,106,97,121,62,39,94,107,182, +121,207,0,101,127,85,125,231,149,85,92,216,133,116,125,254, +96,208,133,45,100,78,100,86,131,234,71,229,103,88,131,7, +38,123,104,160,130,168,0,90,127,104,128,21,147,206,90,13, +148,102,124,145,94,51,145,245,98,253,97,219,143,75,70,199, +100,234,141,18,37,213,102,40,139,156,0,82,127,118,128,55, +146,221,88,74,163,183,123,146,92,123,159,112,97,255,96,28, +154,247,69,241,99,40,151,144,37,38,100,94,147,151,0,74, +127,132,128,50,136,83,119,164,86,119,114,249,120,152,91,224, +90,200,121,197,96,207,63,24,123,14,101,47,28,228,124,239, +103,177,0,0,128,0,118,153,134,86,114,117,100,134,113,39, +116,9,104,12,89,55,117,132,107,62,61,232,118,232,110,10, +28,63,120,131,111,111,0,0,128,0,124,173,132,83,110,13, +114,153,111,34,112,8,116,89,87,166,113,196,117,216,60,195, +115,69,119,23,27,177,116,190,119,163,0,0,128,0,128,0, +130,119,106,149,129,11,109,119,108,205,130,35,86,4,110,179, +128,158,59,134,112,55,128,143,26,244,113,202,129,140,0,0, +128,0,128,0,129,36,103,242,142,177,108,51,106,79,140,179, +84,214,108,70,139,126,58,135,109,187,138,52,26,128,111,130, +137,83,0,0,128,0,128,0,128,71,102,62,157,11,107,73, +104,167,154,28,83,238,106,146,150,196,57,196,107,241,148,173, +25,237,109,244,142,180,0,0,128,0,128,0,116,102,133,188, +85,206,97,9,133,77,90,232,74,225,133,71,95,143,48,197, +133,211,99,100,15,223,135,31,101,112,0,0,128,0,123,165, +114,183,129,2,98,152,95,147,129,17,102,24,73,174,129,44, +105,65,47,247,129,153,107,201,15,177,130,194,109,55,0,0, +128,0,127,79,113,14,124,224,111,119,93,220,125,64,113,115, +72,73,125,135,115,40,46,243,125,235,116,107,15,86,127,106, +117,126,0,0,128,0,128,0,111,138,121,149,124,88,92,114, +122,42,124,241,71,9,122,128,125,56,46,66,122,185,125,99, +15,42,124,159,125,207,0,0,128,0,128,0,110,95,119,23, +138,202,91,117,119,207,138,10,70,19,120,28,137,0,45,94, +120,38,135,245,14,222,122,140,135,102,0,0,128,0,128,0, +109,149,121,89,150,108,90,170,121,119,148,158,69,84,118,115, +146,87,44,190,118,78,145,129,14,137,120,225,137,87,0,0, +128,0,128,0,96,221,149,113,84,82,79,24,147,218,89,8, +58,133,146,240,93,68,32,234,148,5,96,5,5,223,142,72, +100,242,0,0,128,0,127,76,95,109,145,55,96,1,77,234, +143,234,99,97,57,154,142,232,102,93,32,131,143,118,104,29, +6,7,138,144,108,199,0,0,128,0,128,0,94,36,141,70, +107,194,76,143,140,50,109,216,56,136,139,63,111,156,31,218, +139,127,112,111,5,254,135,60,116,52,0,0,128,0,128,0, +92,237,138,30,122,85,75,113,137,51,120,146,55,133,136,57, +121,39,31,91,136,14,123,110,5,246,132,117,123,118,0,0, +128,0,128,0,91,246,135,172,131,111,74,141,134,231,131,84, +54,186,133,222,130,234,30,202,133,72,130,209,6,11,130,149, +129,136,0,0,128,0,128,0,91,71,134,25,143,189,74,30, +133,105,142,218,54,108,132,29,141,96,30,192,131,24,140,170, +6,8,129,66,132,20,0,0,128,0,128,0,77,84,167,52, +81,238,60,225,164,229,86,29,41,102,163,178,89,171,15,187, +165,245,91,30,0,0,143,192,102,232,0,0,128,0,128,0, +76,0,163,132,92,179,59,195,161,83,95,199,40,139,159,206, +98,84,15,179,160,234,99,35,0,0,141,58,110,94,0,0, +128,0,128,0,75,38,159,158,103,107,58,198,157,140,105,113, +39,202,155,249,107,4,15,139,156,80,107,83,0,0,138,237, +113,76,0,0,128,0,128,0,74,77,156,103,114,86,58,10, +154,119,115,117,39,52,152,188,116,26,15,133,152,85,116,52, +0,33,136,220,120,138,0,0,128,0,128,0,73,149,153,242, +125,109,57,132,152,31,125,200,38,211,150,60,125,178,15,95, +149,64,125,240,0,63,135,71,127,146,0,0,128,0,128,0, +73,42,152,77,136,216,57,58,150,125,136,168,38,173,148,107, +136,30,15,114,147,1,134,175,0,80,134,33,128,54,0,0, +128,0,128,0,158,251,83,213,77,213,134,82,88,228,84,162, +107,209,93,194,91,44,78,135,98,47,97,81,44,208,100,17, +102,124,1,123,125,128,107,25,155,163,75,156,94,40,131,186, +81,193,98,171,105,163,87,113,102,252,76,186,92,94,107,9, +43,127,94,109,110,93,1,148,125,85,114,218,152,136,68,110, +110,104,128,251,75,123,112,169,103,104,81,210,114,214,74,252, +87,33,116,232,42,89,89,132,118,188,1,168,125,50,122,87, +149,187,62,95,127,39,126,199,70,68,127,37,101,151,77,45, +126,223,73,179,82,194,126,247,41,128,85,129,127,2,1,184, +125,23,128,57,147,155,57,144,141,195,125,55,66,42,139,246, +100,109,73,147,138,142,72,188,79,81,137,33,40,239,82,91, +136,147,1,196,125,4,129,50,146,51,54,15,157,180,124,41, +63,34,153,134,99,178,70,225,149,233,72,51,76,186,147,48, +40,130,79,242,145,93,1,205,124,245,129,56,140,172,95,13, +78,0,118,82,98,194,84,136,93,217,102,97,90,197,66,68, +105,148,96,126,32,220,108,22,100,131,0,0,128,0,112,38, +137,166,87,69,92,206,116,43,92,3,97,107,92,39,96,73, +101,193,64,246,99,194,105,173,32,26,102,123,108,69,0,0, +128,0,119,103,134,217,80,99,107,214,113,151,85,234,110,117, +90,18,90,193,112,228,63,85,94,121,115,18,31,23,97,180, +116,108,0,0,128,0,125,112,132,131,74,171,122,184,111,150, +80,207,123,118,88,87,86,26,124,13,62,35,89,237,124,145, +30,107,94,103,125,47,0,0,128,0,127,202,130,209,70,47, +137,129,110,40,76,204,136,111,87,33,82,108,135,54,61,36, +86,56,134,85,29,248,92,10,133,252,0,0,128,0,128,0, +129,180,66,231,151,227,109,43,73,215,149,17,86,72,79,164, +146,42,60,121,83,93,144,56,29,122,90,173,141,217,0,0, +128,0,128,0,122,59,107,13,78,9,101,239,109,128,84,51, +79,94,111,248,90,17,53,66,114,34,95,58,20,89,117,114, +98,63,0,0,128,0,118,48,119,113,99,183,91,125,99,224, +103,9,96,10,77,191,105,251,100,71,52,13,108,44,103,232, +19,212,112,104,105,245,0,0,128,0,124,88,117,9,93,44, +105,29,97,175,97,41,107,247,76,39,100,134,110,150,50,241, +102,174,112,192,19,113,108,243,114,23,0,0,128,0,128,0, +114,243,87,180,118,223,95,234,92,47,120,23,74,129,95,218, +121,16,49,195,97,217,121,223,18,225,106,136,122,228,0,0, +128,0,128,0,113,120,83,101,132,147,94,155,88,59,132,58, +73,87,92,22,131,141,48,207,93,197,131,35,18,148,104,170, +130,227,0,0,128,0,128,0,112,124,80,47,145,214,93,175, +85,72,144,47,72,123,89,48,142,34,48,28,90,139,141,35, +18,32,103,124,136,248,0,0,128,0,128,0,103,70,120,84, +77,117,84,232,121,161,83,63,64,11,123,28,88,172,38,210, +124,209,92,243,8,233,127,70,96,200,0,0,128,0,123,34, +100,213,113,135,89,167,83,25,115,126,94,24,62,167,117,48, +98,36,37,231,118,126,101,44,8,193,123,161,104,123,0,0, +128,0,127,24,98,194,107,80,102,30,81,34,109,203,105,23, +61,29,111,188,107,190,36,205,112,158,109,148,8,119,120,180, +112,173,0,0,128,0,128,0,96,242,102,12,114,156,79,130, +104,236,116,47,59,191,107,0,117,116,36,18,107,82,118,75, +8,91,118,101,120,166,0,0,128,0,128,0,95,146,97,206, +130,67,78,97,101,12,129,141,58,188,103,46,129,182,35,42, +103,31,127,144,8,40,116,175,127,220,0,0,128,0,128,0, +94,161,94,147,139,177,77,129,98,16,138,232,57,241,100,48, +137,174,34,137,99,241,137,147,7,229,115,133,132,115,0,0, +128,0,128,0,84,37,135,119,75,195,67,155,135,178,81,48, +48,13,136,148,86,4,22,132,139,57,88,202,1,153,133,28, +97,193,0,0,128,0,126,220,82,13,129,47,86,229,65,224, +129,244,91,44,46,166,130,201,94,217,21,210,132,77,96,184, +1,163,129,218,105,124,0,0,128,0,128,0,80,85,123,60, +98,71,64,40,124,97,101,75,45,71,125,64,103,204,20,248, +126,25,104,210,1,154,127,79,110,152,0,0,128,0,128,0, +78,197,118,17,114,119,62,180,119,146,116,238,44,4,120,106, +118,37,20,83,121,5,113,106,1,147,125,213,117,185,0,0, +128,0,128,0,77,131,113,206,121,100,61,140,115,179,122,30, +43,13,116,126,122,121,19,183,117,62,122,187,1,164,125,57, +126,172,0,0,128,0,128,0,76,158,110,125,133,67,60,216, +112,196,133,20,42,153,113,118,132,123,19,130,114,86,132,73, +1,142,125,96,129,13,0,0,128,0,128,0,64,153,153,69, +72,171,49,169,152,158,77,168,30,160,153,228,81,115,6,90, +154,60,83,247,0,0,130,209,102,37,0,0,128,0,128,0, +62,163,147,140,82,227,47,151,147,139,86,215,28,182,148,160, +89,168,5,183,147,71,91,203,0,0,128,103,109,199,0,0, +128,0,128,0,61,68,141,206,93,80,46,3,142,29,96,44, +27,97,143,2,98,7,5,78,141,29,99,223,0,0,128,0, +117,60,0,0,128,0,128,0,59,244,136,146,104,3,44,191, +137,80,105,212,26,96,137,238,106,205,5,45,136,30,108,152, +0,0,128,0,123,80,0,0,128,0,128,0,58,216,132,48, +114,233,43,191,133,110,115,203,25,174,133,218,116,14,4,250, +132,101,118,30,0,0,128,0,127,34,0,0,128,0,128,0, +58,13,128,170,126,39,42,253,130,99,126,61,25,57,130,182, +126,10,4,241,129,178,126,213,0,0,128,0,128,0,0,0, +128,0,128,0,0,0,255,255,0,0,255,255,0,0,255,255 +}; diff --git a/pdfio-content.c b/pdfio-content.c index ff64aba..3360230 100644 --- a/pdfio-content.c +++ b/pdfio-content.c @@ -10,6 +10,7 @@ #include "pdfio-private.h" #include "pdfio-content.h" #include "pdfio-base-font-widths.h" +#include "pdfio-cgats001-compat.h" #include "ttf.h" #ifdef HAVE_LIBPNG # include @@ -406,13 +407,14 @@ pdfioArrayCreateColorFromPrimaries( // 'pdfioArrayCreateColorFromStandard()' - Create a color array for a standard color space. // // This function creates a color array for a standard `PDFIO_CS_` enumerated color space. -// The "num_colors" argument must be `1` for grayscale and `3` for RGB color. +// The "num_colors" argument must be `1` for grayscale, `3` for RGB color, and +// `4` for CMYK color. // pdfio_array_t * // O - Color array pdfioArrayCreateColorFromStandard( pdfio_file_t *pdf, // I - PDF file - size_t num_colors, // I - Number of colors (1 or 3) + size_t num_colors, // I - Number of colors (1, 3, or 4) pdfio_cs_t cs) // I - Color space enumeration { static const double adobe_matrix[3][3] = { { 0.57667, 0.18556, 0.18823 }, { 0.29734, 0.62736, 0.07529 }, { 0.02703, 0.07069, 0.99134 } }; @@ -426,7 +428,7 @@ pdfioArrayCreateColorFromStandard( { return (NULL); } - else if (num_colors != 1 && num_colors != 3) + else if ((cs != PDFIO_CS_CGATS001 && num_colors != 1 && num_colors != 3) || (cs == PDFIO_CS_CGATS001 && num_colors != 4)) { _pdfioFileError(pdf, "Unsupported number of colors %u.", (unsigned)num_colors); return (NULL); @@ -436,11 +438,19 @@ pdfioArrayCreateColorFromStandard( { case PDFIO_CS_ADOBE : return (pdfioArrayCreateColorFromMatrix(pdf, num_colors, 2.2, adobe_matrix, d65_white_point)); + case PDFIO_CS_P3_D65 : return (pdfioArrayCreateColorFromMatrix(pdf, num_colors, 2.2, p3_d65_matrix, d65_white_point)); + case PDFIO_CS_SRGB : return (pdfioArrayCreateColorFromMatrix(pdf, num_colors, 2.2, srgb_matrix, d65_white_point)); + case PDFIO_CS_CGATS001 : + if (!pdf->cgats001_obj) + pdf->cgats001_obj = pdfioFileCreateICCObjFromData(pdf, CGATS001Compat_v2_micro_icc, sizeof(CGATS001Compat_v2_micro_icc), num_colors); + + return (pdfioArrayCreateColorFromICCObj(pdf, pdf->cgats001_obj)); + default : _pdfioFileError(pdf, "Unsupported color space number %d.", (int)cs); return (NULL); @@ -2138,6 +2148,10 @@ pdfioPageDictAddColorSpace( return (false); } + // See if this name is already set... + if (_pdfioDictGetValue(colorspace, name)) + return (false); // Yes, return false + // Now set the color space reference and return... return (pdfioDictSetArray(colorspace, name, data)); } @@ -2399,7 +2413,7 @@ copy_jpeg(pdfio_dict_t *dict, // I - Dictionary } } - if (width == 0 || height == 0 || (num_colors != 1 && num_colors != 3)) + if (width == 0 || height == 0 || (num_colors != 1 && num_colors != 3 && num_colors != 4)) { _pdfioFileError(dict->pdf, "Unable to find JPEG dimensions or image data."); goto finish; @@ -2417,8 +2431,11 @@ copy_jpeg(pdfio_dict_t *dict, // I - Dictionary } else //if (pdfioDictGetArray(dict, "ColorSpace") == NULL) { - // The default JPEG color space is sRGB... - pdfioDictSetArray(dict, "ColorSpace", pdfioArrayCreateColorFromStandard(dict->pdf, num_colors, PDFIO_CS_SRGB)); + // The default JPEG color space is sRGB or CGATS001 (CMYK)... + if (num_colors == 4) + pdfioDictSetArray(dict, "ColorSpace", pdfioArrayCreateColorFromStandard(dict->pdf, num_colors, PDFIO_CS_CGATS001)); + else + pdfioDictSetArray(dict, "ColorSpace", pdfioArrayCreateColorFromStandard(dict->pdf, num_colors, PDFIO_CS_SRGB)); } obj = pdfioFileCreateObj(dict->pdf, dict); diff --git a/pdfio-content.h b/pdfio-content.h index ca29ab3..4f2ad20 100644 --- a/pdfio-content.h +++ b/pdfio-content.h @@ -1,7 +1,7 @@ // // Public content header file for PDFio. // -// Copyright © 2021-2023 by Michael R Sweet. +// Copyright © 2021-2025 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. @@ -23,7 +23,8 @@ typedef enum pdfio_cs_e // Standard color spaces { PDFIO_CS_ADOBE, // AdobeRGB 1998 PDFIO_CS_P3_D65, // Display P3 - PDFIO_CS_SRGB // sRGB + PDFIO_CS_SRGB, // sRGB + PDFIO_CS_CGATS001 // CGATS001 (CMYK) } pdfio_cs_t; typedef enum pdfio_linecap_e // Line capping modes diff --git a/pdfio-file.c b/pdfio-file.c index 30d1ee5..f7516b4 100644 --- a/pdfio-file.c +++ b/pdfio-file.c @@ -8,6 +8,7 @@ // #include "pdfio-private.h" +#include "pdfio-content.h" #ifndef O_BINARY # define O_BINARY 0 #endif // !O_BINARY @@ -474,8 +475,9 @@ pdfioFileCreatePage(pdfio_file_t *pdf, // I - PDF file pdfioDictSetObj(dict, "Parent", pdf->pages_obj); - if (!_pdfioDictGetValue(dict, "Resources")) - pdfioDictSetDict(dict, "Resources", pdfioDictCreate(pdf)); + pdfioPageDictAddColorSpace(dict, "DefaultGray", pdfioArrayCreateColorFromStandard(pdf, 1, PDFIO_CS_SRGB)); + pdfioPageDictAddColorSpace(dict, "DefaultRGB", pdfioArrayCreateColorFromStandard(pdf, 3, PDFIO_CS_SRGB)); + pdfioPageDictAddColorSpace(dict, "DefaultCMYK", pdfioArrayCreateColorFromStandard(pdf, 4, PDFIO_CS_CGATS001)); if (!_pdfioDictGetValue(dict, "Type")) pdfioDictSetName(dict, "Type", "Page"); diff --git a/pdfio-private.h b/pdfio-private.h index 7d0ba9b..55bf7e6 100644 --- a/pdfio-private.h +++ b/pdfio-private.h @@ -267,7 +267,8 @@ struct _pdfio_file_s // PDF file structure pdfio_obj_t *info_obj; // Information object pdfio_obj_t *pages_obj; // Root pages object pdfio_obj_t *encrypt_obj; // De/Encryption object/dictionary - pdfio_obj_t *cp1252_obj, // CP1252 font encoding object + pdfio_obj_t *cgats001_obj, // CGATS001 ICC profile object + *cp1252_obj, // CP1252 font encoding object *unicode_obj; // Unicode font encoding object pdfio_array_t *id_array; // ID array diff --git a/pdfio.h b/pdfio.h index e103e72..be266d9 100644 --- a/pdfio.h +++ b/pdfio.h @@ -46,7 +46,7 @@ extern "C" { // # if _WIN32 -typedef __int64 ssize_t; // POSIX type not present on Windows... @private@ +typedef __int64 ssize_t; // POSIX type not present on Windows @private@ # endif // _WIN32 typedef struct _pdfio_array_s pdfio_array_t; @@ -62,7 +62,7 @@ typedef bool (*pdfio_error_cb_t)(pdfio_file_t *pdf, const char *message, void *d typedef enum pdfio_encryption_e // PDF encryption modes { PDFIO_ENCRYPTION_NONE = 0, // No encryption - PDFIO_ENCRYPTION_RC4_40, // 40-bit RC4 encryption (PDF 1.3) + PDFIO_ENCRYPTION_RC4_40, // 40-bit RC4 encryption (PDF 1.3, reading only) PDFIO_ENCRYPTION_RC4_128, // 128-bit RC4 encryption (PDF 1.4) PDFIO_ENCRYPTION_AES_128, // 128-bit AES encryption (PDF 1.6) PDFIO_ENCRYPTION_AES_256 // 256-bit AES encryption (PDF 2.0) @exclude all@ diff --git a/testfiles/CGATS001Compat-v2-micro.icc b/testfiles/CGATS001Compat-v2-micro.icc new file mode 100644 index 0000000000000000000000000000000000000000..b5a73495bfc7509837b300800d8197d94e83fab7 GIT binary patch literal 8464 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 U@I8Hy^1FWP|Gv&X!`9FL1Def^p8x;= literal 0 HcmV?d00001 diff --git a/testfiles/CGATS001Compat-v2-micro.txt b/testfiles/CGATS001Compat-v2-micro.txt new file mode 100644 index 0000000..1886cff --- /dev/null +++ b/testfiles/CGATS001Compat-v2-micro.txt @@ -0,0 +1,5 @@ +https://github.com/saucecontrol/Compact-ICC-Profiles + +All profiles in this collection are released to the public domain under the +Creative Commons CC0 license. They are free from restrictions on distribution +and use to the extent allowed by law.