working separation cs

This commit is contained in:
sbarman 2011-07-07 09:38:58 -07:00
parent 3557bae461
commit da8f0120a5

101
pdf.js
View File

@ -1613,7 +1613,7 @@ var CCITTFaxStream = (function() {
}
if (this.byteAlign)
inputBits &= ~7;
this.inputBits &= ~7;
var gotEOL = false;
@ -4601,8 +4601,14 @@ var ColorSpace = (function() {
var hiVal = cs[2] + 1;
var lookup = xref.fetchIfRef(cs[3]);
return new IndexedCS(base, hiVal, lookup);
break;
case 'Separation':
var name = cs[1];
var alt = ColorSpace.parse(cs[2], xref, res);
var tintFn = new PDFFunction(xref, xref.fetchIfRef(cs[3]));
return new TintCS("Separation", alt, tintFn);
break;
case 'Lab':
case 'Seperation':
case 'DeviceN':
default:
error("unrecognized color space object '" + mode + "'");
@ -4615,6 +4621,44 @@ var ColorSpace = (function() {
return constructor;
})();
var TintCS = (function() {
function constructor(name, base, tintFn) {
this.name = name;
this.numComps = 1;
this.defaultColor = [0];
this.base = base;
this.tintFn = tintFn;
}
constructor.prototype = {
getRgb: function tintcs_getRgb(color) {
var tinted = this.tintFn.func(color);
return this.base.getRgb(tinted);
},
getRgbBuffer: function tintcs_getRgbBuffer(input) {
var tintFn = this.tintFn;
var base = this.base;
var length = 3 * input.length;
var rgbBuf = new Uint8Array(length);
var pos = 0;
for (var i = 0, ii = input.length; i < ii; ++i) {
var scaled = input[i] / 255;
var tinted = tintFn.func([scaled]);
var rgb = base.getRgb(tinted);
for (var j = 0; j < 3; ++j)
rgbBuf[pos++] = Math.round(255 * rgb[j]);
}
return rgbBuf;
}
};
return constructor;
})();
var PatternCS = (function() {
function constructor() {
this.name = 'Pattern';
@ -4655,7 +4699,9 @@ var IndexedCS = (function() {
var numComps = base.numComps;
var c = [];
for (var i = 0; i < numComps; ++i)
var start = color[0] * numComps;
for (var i = start, ii = start + numComps; i < ii; ++i)
c.push(lookup[i]);
return this.base.getRgb(c);
},
@ -4693,7 +4739,7 @@ var DeviceGrayCS = (function() {
return [c, c, c];
},
getRgbBuffer: function graycs_getRgbBuffer(input) {
var length = input.length;
var length = input.length * 3;
var rgbBuf = new Uint8Array(length);
for (var i = 0, j = 0; i < length; ++i) {
var c = input[i];
@ -4786,8 +4832,22 @@ var DeviceCmykCS = (function() {
return [r, g, b];
},
getRgbBuffer: function cmykcs_getRgbBuffer(colorBuf) {
error('conversion from rgb to cmyk not implemented for images');
return colorBuf;
var length = colorBuf.length / 4;
var rgbBuf = new Uint8Array(length * 3);
var rgbBufPos = 0;
var colorBufPos = 0;
for (var i = 0; i < length; i++) {
var cmyk = [];
for (var j = 0; j < 4; ++j)
cmyk.push(colorBuf[colorBufPos++]/255);
var rgb = this.getRgb(cmyk);
for (var j = 0; j < 3; ++j)
rgb[rgbBufPos++] = Math.round(rgb[j] * 255);
}
return rgbBuf;
}
};
return constructor;
@ -4904,7 +4964,7 @@ var PDFImage = (function() {
output[i] = Math.round(255 * ret / ((1 << bpc) - 1));
}
}
return this.colorSpace.getRbaBuffer(output);
return output;
},
getOpacity: function getOpacity() {
var smask = this.smask;
@ -4936,32 +4996,17 @@ var PDFImage = (function() {
var rowBytes = (width * numComps * bpc + 7) >> 3;
var imgArray = this.image.getBytes(height * rowBytes);
var comps = this.getComponents(imgArray);
var comps = this.colorSpace.getRgbBuffer(this.getComponents(imgArray));
var compsPos = 0;
var opacity = this.getOpacity();
var opacityPos = 0;
var length = width * height * 4;
switch (numComps) {
case 1:
for (var i = 0; i < length; i += 4) {
var p = comps[compsPos++];
buffer[i] = p;
buffer[i + 1] = p;
buffer[i + 2] = p;
buffer[i + 3] = opacity[opacityPos++];
}
break;
case 3:
for (var i = 0; i < length; i += 4) {
buffer[i] = comps[compsPos++];
buffer[i + 1] = comps[compsPos++];
buffer[i + 2] = comps[compsPos++];
buffer[i + 3] = opacity[opacityPos++];
}
break;
default:
TODO('Images with ' + numComps + ' components per pixel');
for (var i = 0; i < length; i += 4) {
buffer[i] = comps[compsPos++];
buffer[i + 1] = comps[compsPos++];
buffer[i + 2] = comps[compsPos++];
buffer[i + 3] = opacity[opacityPos++];
}
},
fillGrayBuffer: function fillGrayBuffer(buffer) {