Browse Source

Adds cmyk jpg support. Treats the cmyk jpg as a regular stream.

Brendan Dahl 14 years ago
parent
commit
9bb2b881b0
  1. 1
      Makefile
  2. 1
      examples/helloworld/index.html
  3. 2
      src/core.js
  4. 2
      src/evaluator.js
  5. 12
      src/image.js
  6. 42
      src/stream.js
  7. 1
      test/test_slave.html
  8. 2
      web/viewer.html

1
Makefile

@ -33,6 +33,7 @@ PDF_JS_FILES = \
pattern.js \ pattern.js \
stream.js \ stream.js \
worker.js \ worker.js \
../external/jpgjs/jpg.js \
$(NULL) $(NULL)
# make server # make server

1
examples/helloworld/index.html

@ -22,6 +22,7 @@
<script type="text/javascript" src="../../src/pattern.js"></script> <script type="text/javascript" src="../../src/pattern.js"></script>
<script type="text/javascript" src="../../src/stream.js"></script> <script type="text/javascript" src="../../src/stream.js"></script>
<script type="text/javascript" src="../../src/worker.js"></script> <script type="text/javascript" src="../../src/worker.js"></script>
<script type="text/javascript" src="../../external/jpgjs/jpg.js"></script>
<script type="text/javascript"> <script type="text/javascript">
// Specify the main script used to create a new PDF.JS web worker. // Specify the main script used to create a new PDF.JS web worker.

2
src/core.js

@ -546,7 +546,7 @@ var PDFDoc = (function pdfDoc() {
switch (type) { switch (type) {
case 'JpegStream': case 'JpegStream':
var IR = data[2]; var IR = data[2];
new JpegImage(id, IR, this.objs); new JpegImageLoader(id, IR, this.objs);
break; break;
case 'Font': case 'Font':
var name = data[2]; var name = data[2];

2
src/evaluator.js

@ -179,7 +179,7 @@ var PartialEvaluator = (function partialEvaluator() {
var w = dict.get('Width', 'W'); var w = dict.get('Width', 'W');
var h = dict.get('Height', 'H'); var h = dict.get('Height', 'H');
if (image instanceof JpegStream) { if (image instanceof JpegStream && image.isNative) {
var objId = 'img_' + uniquePrefix + (++self.objIdCounter); var objId = 'img_' + uniquePrefix + (++self.objIdCounter);
handler.send('obj', [objId, 'JpegStream', image.getIR()]); handler.send('obj', [objId, 'JpegStream', image.getIR()]);

12
src/image.js

@ -229,12 +229,12 @@ var PDFImage = (function pdfImage() {
return constructor; return constructor;
})(); })();
var JpegImage = (function jpegImage() { var JpegImageLoader = (function jpegImage() {
function JpegImage(objId, imageData, objs) { function JpegImageLoader(objId, imageData, objs) {
var src = 'data:image/jpeg;base64,' + window.btoa(imageData); var src = 'data:image/jpeg;base64,' + window.btoa(imageData);
var img = new Image(); var img = new Image();
img.onload = (function jpegImageOnload() { img.onload = (function jpegImageLoaderOnload() {
this.loaded = true; this.loaded = true;
objs.resolve(objId, this); objs.resolve(objId, this);
@ -246,12 +246,12 @@ var JpegImage = (function jpegImage() {
this.domImage = img; this.domImage = img;
} }
JpegImage.prototype = { JpegImageLoader.prototype = {
getImage: function jpegImageGetImage() { getImage: function jpegImageLoaderGetImage() {
return this.domImage; return this.domImage;
} }
}; };
return JpegImage; return JpegImageLoader;
})(); })();

42
src/stream.js

@ -793,20 +793,46 @@ var JpegStream = (function jpegStream() {
// 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;
this.isNative = true;
if (isAdobeImage(bytes))
if (isAdobeImage(bytes)) {
// when bug 674619 land, let's check if browser can do
// normal cmyk and then we won't have to the following
var cs = dict.get('ColorSpace');
if (isName(cs) && cs.name === 'DeviceCMYK') {
this.isNative = false;
this.bytes = bytes;
} else {
bytes = fixAdobeImage(bytes); bytes = fixAdobeImage(bytes);
this.src = bytesToString(bytes);
}
} else {
this.src = bytesToString(bytes); this.src = bytesToString(bytes);
} }
constructor.prototype = { DecodeStream.call(this);
getIR: function jpegStreamGetIR() { }
constructor.prototype = Object.create(DecodeStream.prototype);
constructor.prototype.ensureBuffer = function jpegStreamEnsureBuffer(req) {
if (this.bufferLength)
return;
var jpegImage = new JpegImage();
jpegImage.parse(this.bytes);
var width = jpegImage.width;
var height = jpegImage.height;
var dataLength = width * height * 4;
var data = new Uint8Array(dataLength);
jpegImage.getData(data, width, height);
this.buffer = data;
this.bufferLength = data.length;
};
constructor.prototype.getIR = function jpegStreamGetIR() {
return this.src; return this.src;
}, };
getChar: function jpegStreamGetChar() { constructor.prototype.getChar = function jpegStreamGetChar() {
error('internal error: getChar is not valid on JpegStream'); error('internal error: getChar is not valid on JpegStream');
}
}; };
return constructor; return constructor;

1
test/test_slave.html

@ -21,6 +21,7 @@
<script type="text/javascript" src="/src/pattern.js"></script> <script type="text/javascript" src="/src/pattern.js"></script>
<script type="text/javascript" src="/src/stream.js"></script> <script type="text/javascript" src="/src/stream.js"></script>
<script type="text/javascript" src="/src/worker.js"></script> <script type="text/javascript" src="/src/worker.js"></script>
<script type="text/javascript" src="/external/jpgjs/jpg.js"></script>
<script type="text/javascript" src="driver.js"></script> <script type="text/javascript" src="driver.js"></script>
<script type="text/javascript"> <script type="text/javascript">

2
web/viewer.html

@ -25,7 +25,7 @@
<script type="text/javascript" src="../src/pattern.js"></script> <!-- PDFJSSCRIPT_REMOVE --> <script type="text/javascript" src="../src/pattern.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
<script type="text/javascript" src="../src/stream.js"></script> <!-- PDFJSSCRIPT_REMOVE --> <script type="text/javascript" src="../src/stream.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
<script type="text/javascript" src="../src/worker.js"></script> <!-- PDFJSSCRIPT_REMOVE --> <script type="text/javascript" src="../src/worker.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
<script type="text/javascript" src="../external/jpgjs/jpg.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
<script type="text/javascript">PDFJS.workerSrc = '../src/worker_loader.js';</script> <!-- PDFJSSCRIPT_REMOVE --> <script type="text/javascript">PDFJS.workerSrc = '../src/worker_loader.js';</script> <!-- PDFJSSCRIPT_REMOVE -->
<script type="text/javascript" src="viewer.js"></script> <script type="text/javascript" src="viewer.js"></script>

Loading…
Cancel
Save