Merge pull request #4062 from kkujala/calgray
calgray: fix getRgbBuffer problem
This commit is contained in:
commit
4d01ff4079
@ -639,8 +639,8 @@ var DeviceCmykCS = (function DeviceCmykCSClosure() {
|
|||||||
var CalGrayCS = (function CalGrayCSClosure() {
|
var CalGrayCS = (function CalGrayCSClosure() {
|
||||||
function CalGrayCS(whitePoint, blackPoint, gamma) {
|
function CalGrayCS(whitePoint, blackPoint, gamma) {
|
||||||
this.name = 'CalGray';
|
this.name = 'CalGray';
|
||||||
this.numComps = 3;
|
this.numComps = 1;
|
||||||
this.defaultColor = new Float32Array([0, 0, 0]);
|
this.defaultColor = new Float32Array([0]);
|
||||||
|
|
||||||
if (!whitePoint) {
|
if (!whitePoint) {
|
||||||
error('WhitePoint missing - required for color space CalGray');
|
error('WhitePoint missing - required for color space CalGray');
|
||||||
@ -682,6 +682,33 @@ var CalGrayCS = (function CalGrayCSClosure() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {
|
||||||
|
// A represents a gray component of a calibrated gray space.
|
||||||
|
// A <---> AG in the spec
|
||||||
|
var A = src[srcOffset] * scale;
|
||||||
|
var AG = Math.pow(A, cs.G);
|
||||||
|
|
||||||
|
// Computes intermediate variables M, L, N as per spec.
|
||||||
|
// Except if other than default BlackPoint values are used.
|
||||||
|
var M = cs.XW * AG;
|
||||||
|
var L = cs.YW * AG;
|
||||||
|
var N = cs.ZW * AG;
|
||||||
|
|
||||||
|
// Decode XYZ, as per spec.
|
||||||
|
var X = M;
|
||||||
|
var Y = L;
|
||||||
|
var Z = N;
|
||||||
|
|
||||||
|
// http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4.
|
||||||
|
// This yields values in range [0, 100].
|
||||||
|
var Lstar = Math.max(116 * Math.pow(Y, 1 / 3) - 16, 0);
|
||||||
|
|
||||||
|
// Convert values to rgb range [0, 255].
|
||||||
|
dest[destOffset] = Lstar * 255 / 100;
|
||||||
|
dest[destOffset + 1] = Lstar * 255 / 100;
|
||||||
|
dest[destOffset + 2] = Lstar * 255 / 100;
|
||||||
|
}
|
||||||
|
|
||||||
CalGrayCS.prototype = {
|
CalGrayCS.prototype = {
|
||||||
getRgb: function CalGrayCS_getRgb(src, srcOffset) {
|
getRgb: function CalGrayCS_getRgb(src, srcOffset) {
|
||||||
var rgb = new Uint8Array(3);
|
var rgb = new Uint8Array(3);
|
||||||
@ -690,41 +717,16 @@ var CalGrayCS = (function CalGrayCSClosure() {
|
|||||||
},
|
},
|
||||||
getRgbItem: function CalGrayCS_getRgbItem(src, srcOffset,
|
getRgbItem: function CalGrayCS_getRgbItem(src, srcOffset,
|
||||||
dest, destOffset) {
|
dest, destOffset) {
|
||||||
// A represents a gray component of a calibrated gray space.
|
convertToRgb(this, src, srcOffset, dest, destOffset, 1);
|
||||||
// A <---> AG in the spec
|
|
||||||
var A = src[srcOffset];
|
|
||||||
var AG = Math.pow(A, this.G);
|
|
||||||
|
|
||||||
// Computes intermediate variables M, L, N as per spec.
|
|
||||||
// Except if other than default BlackPoint values are used.
|
|
||||||
var M = this.XW * AG;
|
|
||||||
var L = this.YW * AG;
|
|
||||||
var N = this.ZW * AG;
|
|
||||||
|
|
||||||
// Decode XYZ, as per spec.
|
|
||||||
var X = M;
|
|
||||||
var Y = L;
|
|
||||||
var Z = N;
|
|
||||||
|
|
||||||
// http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4.
|
|
||||||
// This yields values in range [0, 100].
|
|
||||||
var Lstar = Math.max(116 * Math.pow(Y, 1 / 3) - 16, 0);
|
|
||||||
|
|
||||||
// Convert values to rgb range [0, 255].
|
|
||||||
dest[destOffset] = Lstar * 255 / 100;
|
|
||||||
dest[destOffset + 1] = Lstar * 255 / 100;
|
|
||||||
dest[destOffset + 2] = Lstar * 255 / 100;
|
|
||||||
},
|
},
|
||||||
getRgbBuffer: function CalGrayCS_getRgbBuffer(src, srcOffset, count,
|
getRgbBuffer: function CalGrayCS_getRgbBuffer(src, srcOffset, count,
|
||||||
dest, destOffset, bits) {
|
dest, destOffset, bits) {
|
||||||
// TODO: This part is copied from DeviceGray. Make this utility function.
|
var scale = 1 / ((1 << bits) - 1);
|
||||||
var scale = 255 / ((1 << bits) - 1);
|
|
||||||
var j = srcOffset, q = destOffset;
|
|
||||||
for (var i = 0; i < count; ++i) {
|
for (var i = 0; i < count; ++i) {
|
||||||
var c = (scale * src[j++]) | 0;
|
convertToRgb(this, src, srcOffset, dest, destOffset, scale);
|
||||||
dest[q++] = c;
|
srcOffset += 1;
|
||||||
dest[q++] = c;
|
destOffset += 3;
|
||||||
dest[q++] = c;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
getOutputLength: function CalGrayCS_getOutputLength(inputLength) {
|
getOutputLength: function CalGrayCS_getOutputLength(inputLength) {
|
||||||
|
1
test/pdfs/issue3903.pdf.link
Normal file
1
test/pdfs/issue3903.pdf.link
Normal file
@ -0,0 +1 @@
|
|||||||
|
http://www.reloadbench.com/pdf/files/1%20Inch%20Diamonds.pdf
|
@ -84,6 +84,15 @@
|
|||||||
"lastPage": 1,
|
"lastPage": 1,
|
||||||
"type": "eq"
|
"type": "eq"
|
||||||
},
|
},
|
||||||
|
{ "id": "issue3903",
|
||||||
|
"file": "pdfs/issue3903.pdf",
|
||||||
|
"md5": "c9a4a8012e15cf3b10d671982ce35a92",
|
||||||
|
"rounds": 1,
|
||||||
|
"link": true,
|
||||||
|
"firstPage": 1,
|
||||||
|
"lastPage": 1,
|
||||||
|
"type": "eq"
|
||||||
|
},
|
||||||
{ "id": "issue2391-1",
|
{ "id": "issue2391-1",
|
||||||
"file": "pdfs/issue2391-1.pdf",
|
"file": "pdfs/issue2391-1.pdf",
|
||||||
"md5": "25ae9cb959612e7b343b55da63af2716",
|
"md5": "25ae9cb959612e7b343b55da63af2716",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user