Avoid floating point inaccuracy in gradient color stops

This commit is contained in:
Jani Pehkonen 2019-09-17 21:01:17 +03:00
parent d7c7f15551
commit 911df237f3
4 changed files with 13 additions and 6 deletions

View File

@ -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';

View File

@ -160,6 +160,7 @@
!issue4402_reduced.pdf
!issue845r.pdf
!issue3405r.pdf
!issue7339_reduced.pdf
!issue3438.pdf
!issue2074.pdf
!scan-bad.pdf

Binary file not shown.

View File

@ -1865,6 +1865,12 @@
"link": true,
"type": "load"
},
{ "id": "issue7339",
"file": "pdfs/issue7339_reduced.pdf",
"md5": "7092ab6a1acc31db9d1caaa0447334a0",
"rounds": 1,
"type": "eq"
},
{ "id": "bug1142033",
"file": "pdfs/bug1142033.pdf",
"md5": "1d9afd397e89a0f52c056f449ec93daa",