From eb8a75af92001e047d3370221bb1b406a56ccaa4 Mon Sep 17 00:00:00 2001 From: Conor Smyth Date: Thu, 14 Feb 2019 08:22:36 +0000 Subject: [PATCH] Fix issue with CMYK input to encodeColorString When CMYK input was passed to encodeColorString the values were handled the same as RBG values leading to incorrect colors being set. Now the values are handled correctly by just taking what's passed to the function as per the documentation. Fixes #2274 Also updated decodeColorString to handle CMYK color strings and fixed encodeColorString tests and added some decodeColorString tests --- src/jspdf.js | 11 +++++++++-- tests/init/jspdf.unit.spec.js | 26 +++++++++++++++++++++----- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/jspdf.js b/src/jspdf.js index 96e124bcf..687ff31ba 100644 --- a/src/jspdf.js +++ b/src/jspdf.js @@ -658,6 +658,13 @@ var jsPDF = (function (global) { // convert grayscale value to rgb so that it can be converted to hex for consistency var floatVal = parseFloat(colorEncoded[0]); colorEncoded = [floatVal, floatVal, floatVal, 'r']; + } else if (colorEncoded.length === 5 && (colorEncoded[4] === 'k' || colorEncoded[4] === 'K')) { + // convert CMYK values to rbg so that it can be converted to hex for consistency + var red = (1.0 - colorEncoded[0]) * (1.0 - colorEncoded[3]); + var green = (1.0 - colorEncoded[1]) * (1.0 - colorEncoded[3]); + var blue = (1.0 - colorEncoded[2]) * (1.0 - colorEncoded[3]); + + colorEncoded = [red, green, blue, 'r']; } var colorAsRGB = '#'; for (var i = 0; i < 3; i++) { @@ -744,11 +751,11 @@ var jsPDF = (function (global) { } else { switch (options.precision) { case 2: - color = [f2(ch1 / 255), f2(ch2 / 255), f2(ch3 / 255), f2(ch4 / 255), letterArray[2]].join(" "); + color = [f2(ch1), f2(ch2), f2(ch3), f2(ch4), letterArray[2]].join(" "); break; case 3: default: - color = [f3(ch1 / 255), f3(ch2 / 255), f3(ch3 / 255), f3(ch4 / 255), letterArray[2]].join(" "); + color = [f3(ch1), f3(ch2), f3(ch3), f3(ch4), letterArray[2]].join(" "); } } } diff --git a/tests/init/jspdf.unit.spec.js b/tests/init/jspdf.unit.spec.js index c82904e49..292a59162 100644 --- a/tests/init/jspdf.unit.spec.js +++ b/tests/init/jspdf.unit.spec.js @@ -622,6 +622,7 @@ describe('jsPDF unit tests', () => { doc.__private__.setTextColor(255,0,0); expect(doc.__private__.getTextColor()).toEqual('#ff0000'); }); + it('jsPDF private function getFillColor', () => { const doc = jsPDF(); expect(doc.__private__.getFillColor()).toEqual('#000000') @@ -662,14 +663,29 @@ describe('jsPDF unit tests', () => { expect(doc.__private__.encodeColorString({ch1: '1.000', ch2: '0.000', ch3: '0.000'})).toEqual('1.000 0.000 0.000 rg'); expect(doc.__private__.encodeColorString({ch1: 255, ch2: 0, ch3: 0, ch4: {a: 0}})).toEqual('1.000 1.000 1.000 rg'); expect(doc.__private__.encodeColorString({ch1: 255, ch2: 0, ch3: 0, ch4: {a: 0.5}})).toEqual('1.000 0.000 0.000 rg'); - expect(doc.__private__.encodeColorString({ch1: 255, ch2: 0, ch3: 0, ch4: 255})).toEqual('1.000 0.000 0.000 1.000 k'); expect(doc.__private__.encodeColorString({ch1: '1.000', ch2: '0.000', ch3: '0.000', ch4: '1.000'})).toEqual('1.000 0.000 0.000 1.000 k'); - expect(doc.__private__.encodeColorString({ch1: 255, ch2: 0, ch3: 0, ch4: 255, precision: 3})).toEqual('1.000 0.000 0.000 1.000 k'); - expect(doc.__private__.encodeColorString({ch1: 255, ch2: 0, ch3: 0, ch4: 255, precision: 2})).toEqual('1.00 0.00 0.00 1.00 k'); + expect(doc.__private__.encodeColorString({ch1: 1.0, ch2: 0.0, ch3: 0.0, ch4: 1.0, precision: 3})).toEqual('1.000 0.000 0.000 1.000 k'); + expect(doc.__private__.encodeColorString({ch1: 1.0, ch2: 0.0, ch3: 0.0, ch4: 1.0, precision: 2})).toEqual('1.00 0.00 0.00 1.00 k'); + expect(doc.__private__.encodeColorString({ch1: 0.4, ch2: 0.2, ch3: 0.4, ch4: 0.1, precision: 2})).toEqual('0.40 0.20 0.40 0.10 k'); expect(function() {doc.__private__.encodeColorString('invalid');}).toThrow(new Error('Invalid color "invalid" passed to jsPDF.encodeColorString.')); }); - - + + it('jsPDF private function decodeColorString', () => { + const doc = jsPDF(); + expect(doc.__private__.decodeColorString('1.000 0.000 0.000 rg')).toEqual('#ff0000'); + expect(doc.__private__.decodeColorString('1.00 0.00 0.00 rg')).toEqual('#ff0000'); + expect(doc.__private__.decodeColorString('1.00 1.00 0.00 RG')).toEqual('#ffff00'); + expect(doc.__private__.decodeColorString('1.00 1.00 1.00 RG')).toEqual('#ffffff'); + expect(doc.__private__.decodeColorString('0.00 0.00 1.00 rg')).toEqual('#0000ff'); + expect(doc.__private__.decodeColorString('0.33 0.10 1.00 rg')).toEqual('#5419ff'); + expect(doc.__private__.decodeColorString('0 g')).toEqual('#000000'); + expect(doc.__private__.decodeColorString('0 G')).toEqual('#000000'); + expect(doc.__private__.decodeColorString('0.39 G')).toEqual('#636363'); + expect(doc.__private__.decodeColorString('1.0 G')).toEqual('#ffffff'); + expect(doc.__private__.decodeColorString('0.32 0.67 0.10 0.32 k')).toEqual('#75399c'); + expect(doc.__private__.decodeColorString('1.00 0.00 0.00 0.00 K')).toEqual('#00ffff'); + expect(doc.__private__.decodeColorString('1.00 0.00 1.00 0.00 K')).toEqual('#00ff00'); + }); it('jsPDF private function getDocumentProperty, setDocumentProperty', () => { const doc = jsPDF();