From 911df237f31274da43443479f1eecce6828ba30c Mon Sep 17 00:00:00 2001 From: Jani Pehkonen Date: Tue, 17 Sep 2019 21:01:17 +0300 Subject: [PATCH] Avoid floating point inaccuracy in gradient color stops --- src/core/pattern.js | 12 ++++++------ test/pdfs/.gitignore | 1 + test/pdfs/issue7339_reduced.pdf | Bin 0 -> 1360 bytes test/test_manifest.json | 6 ++++++ 4 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 test/pdfs/issue7339_reduced.pdf diff --git a/src/core/pattern.js b/src/core/pattern.js index 21167f477..fe9c36e1e 100644 --- a/src/core/pattern.js +++ b/src/core/pattern.js @@ -143,12 +143,12 @@ Shadings.RadialAxial = (function RadialAxialClosure() { // 10 samples seems good enough for now, but probably won't work // if there are sharp color changes. Ideally, we would implement // the spec faithfully and add lossless optimizations. - var diff = t1 - t0; - var step = diff / 10; + const NUMBER_OF_SAMPLES = 10; + const step = (t1 - t0) / NUMBER_OF_SAMPLES; var colorStops = this.colorStops = []; - // Protect against bad domains so we don't end up in an infinite loop below. + // Protect against bad domains. if (t0 >= t1 || step <= 0) { // Acrobat doesn't seem to handle these cases so we'll ignore for // now. @@ -158,12 +158,12 @@ Shadings.RadialAxial = (function RadialAxialClosure() { var color = new Float32Array(cs.numComps), ratio = new Float32Array(1); var rgbColor; - for (var i = t0; i <= t1; i += step) { - ratio[0] = i; + for (let i = 0; i <= NUMBER_OF_SAMPLES; i++) { + ratio[0] = t0 + i * step; fn(ratio, 0, color, 0); rgbColor = cs.getRgb(color, 0); var cssColor = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); - colorStops.push([(i - t0) / diff, cssColor]); + colorStops.push([i / NUMBER_OF_SAMPLES, cssColor]); } var background = 'transparent'; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 6c76b3302..64a89b069 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -160,6 +160,7 @@ !issue4402_reduced.pdf !issue845r.pdf !issue3405r.pdf +!issue7339_reduced.pdf !issue3438.pdf !issue2074.pdf !scan-bad.pdf diff --git a/test/pdfs/issue7339_reduced.pdf b/test/pdfs/issue7339_reduced.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1a8f3338eff32a11020e0d21f92a836dbd0c1a56 GIT binary patch literal 1360 zcmbVMF>ljQ5Duz3@L;G^1}ZTepr8UGevad~mf8+U8iWEga*BjxI=Iej;wtg0?3XGa z7LY12AvTKCf&Kx+fRI=i5lmDtvXxf+4emL1k|q%YR$}?ici-Lj-94wPrSdH`qm%T} z@9#f}4ixyt7Fk>*O1a~^!s9+Z1N5!XmhVcu?RdUTGZfUkn$b*C)7Oboq&7ta6(8?| zineO2paMlZL0fyg%^*vbm*L+yN!|d5X0W^eLP|1+uqGp|OQw^#;fodD<#mP(kx}m- z#TR(TuZOm-Wen3a3{a_&(M?m&M{iH@){r+*YE7r^`Hff!rO0`J`6wK!d0NlOttcy9 z!Th?t>9j%y(OqiKTRf<3J1$d7Y{zq%b-N(TVWgaBc4)E{59?{@urN=yp;Vm)3nfO! z7dW^37>ZYVm$V2CiML3G!H4xSQA!{*+p0L&&K~j3M1+WY`?nNJ@}s z6gS>0RBo#vsaXKr3#!x)z25gg1SRk~2L0;E29X28MsWgXe z$P4_$M{^72n9rc&ai)n=8_A_OrBR