Add another way to detect cmyk images.

This commit is contained in:
Brendan Dahl 2011-11-08 13:53:56 -08:00
parent 1869888838
commit 8d52a1e92a
3 changed files with 27 additions and 6 deletions

View File

@ -236,7 +236,7 @@ var Parser = (function parserParser() {
return new LZWStream(stream, earlyChange); return new LZWStream(stream, earlyChange);
} else if (name == 'DCTDecode' || name == 'DCT') { } else if (name == 'DCTDecode' || name == 'DCT') {
var bytes = stream.getBytes(length); var bytes = stream.getBytes(length);
return new JpegStream(bytes, stream.dict); return new JpegStream(bytes, stream.dict, this.xref);
} else if (name == 'ASCII85Decode' || name == 'A85') { } else if (name == 'ASCII85Decode' || name == 'A85') {
return new Ascii85Stream(stream); return new Ascii85Stream(stream);
} else if (name == 'ASCIIHexDecode' || name == 'AHx') { } else if (name == 'ASCIIHexDecode' || name == 'AHx') {

View File

@ -776,6 +776,25 @@ var JpegStream = (function jpegStream() {
return false; return false;
} }
function isCmykAdobe(bytes) {
var maxBytesScanned = Math.max(bytes.length - 16, 1024);
// Looking for APP14, 'Adobe'
for (var i = 0; i < maxBytesScanned; ++i) {
if (bytes[i] == 0xFF && bytes[i + 1] == 0xEE &&
bytes[i + 2] == 0x00 && bytes[i + 3] == 0x0E &&
bytes[i + 4] == 0x41 && bytes[i + 5] == 0x64 &&
bytes[i + 6] == 0x6F && bytes[i + 7] == 0x62 &&
bytes[i + 8] == 0x65 && bytes[i + 9] == 0 &&
bytes[i + 15] == 2 ) {
return true;
}
// scanning until frame tag
if (bytes[i] == 0xFF && bytes[i + 1] == 0xC0)
break;
}
return false;
}
function fixAdobeImage(bytes) { function fixAdobeImage(bytes) {
// Inserting 'EMBED' marker after JPEG signature // Inserting 'EMBED' marker after JPEG signature
var embedMarker = new Uint8Array([0xFF, 0xEC, 0, 8, 0x45, 0x4D, 0x42, 0x45, var embedMarker = new Uint8Array([0xFF, 0xEC, 0, 8, 0x45, 0x4D, 0x42, 0x45,
@ -789,19 +808,20 @@ var JpegStream = (function jpegStream() {
return newBytes; return newBytes;
} }
function constructor(bytes, dict) { function constructor(bytes, dict, xref) {
// TODO: per poppler, some images may have 'junk' before that // TODO: per poppler, some images may have 'junk' before that
// need to be removed // need to be removed
this.dict = dict; this.dict = dict;
// Flag indicating wether the image can be natively loaded. // Flag indicating wether the image can be natively loaded.
this.isNative = true; this.isNative = true;
if (isAdobeImage(bytes)) { if (isAdobeImage(bytes)) {
// when bug 674619 land, let's check if browser can do // when bug 674619 land, let's check if browser can do
// normal cmyk and then we won't have to the following // normal cmyk and then we won't have to the following
var cs = dict.get('ColorSpace'); var cs = xref.fetchIfRef(dict.get('ColorSpace'));
if (isName(cs) && cs.name === 'DeviceCMYK') { if (isName(cs) && cs.name === 'DeviceCMYK') {
//if (isCmykAdobe(bytes)) {
this.isNative = false; this.isNative = false;
this.bytes = bytes; this.bytes = bytes;
} else { } else {
@ -826,7 +846,7 @@ var JpegStream = (function jpegStream() {
var height = jpegImage.height; var height = jpegImage.height;
var dataLength = width * height * 4; var dataLength = width * height * 4;
var data = new Uint8Array(dataLength); var data = new Uint8Array(dataLength);
jpegImage.getData(data, width, height); jpegImage.getData(data, width, height, true);
this.buffer = data; this.buffer = data;
this.bufferLength = data.length; this.bufferLength = data.length;
}; };

View File

@ -40,7 +40,8 @@ function onMessageLoader(evt) {
'parser.js', 'parser.js',
'pattern.js', 'pattern.js',
'stream.js', 'stream.js',
'worker.js' 'worker.js',
'../external/jpgjs/jpg.js'
]; ];
// Load all the files. // Load all the files.