pattern.js \
stream.js \
worker.js \
+ ../external/jpgjs/jpg.js \
$(NULL)
# make server
<script type="text/javascript" src="../../src/pattern.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="../../external/jpgjs/jpg.js"></script>
<script type="text/javascript">
// Specify the main script used to create a new PDF.JS web worker.
switch (type) {
case 'JpegStream':
var IR = data[2];
- new JpegImage(id, IR, this.objs);
+ new JpegImageLoader(id, IR, this.objs);
break;
case 'Font':
var name = data[2];
var w = dict.get('Width', 'W');
var h = dict.get('Height', 'H');
- if (image instanceof JpegStream) {
+ if (image instanceof JpegStream && image.isNative) {
var objId = 'img_' + uniquePrefix + (++self.objIdCounter);
handler.send('obj', [objId, 'JpegStream', image.getIR()]);
return constructor;
})();
-var JpegImage = (function jpegImage() {
- function JpegImage(objId, imageData, objs) {
+var JpegImageLoader = (function jpegImage() {
+ function JpegImageLoader(objId, imageData, objs) {
var src = 'data:image/jpeg;base64,' + window.btoa(imageData);
var img = new Image();
- img.onload = (function jpegImageOnload() {
+ img.onload = (function jpegImageLoaderOnload() {
this.loaded = true;
objs.resolve(objId, this);
this.domImage = img;
}
- JpegImage.prototype = {
- getImage: function jpegImageGetImage() {
+ JpegImageLoader.prototype = {
+ getImage: function jpegImageLoaderGetImage() {
return this.domImage;
}
};
- return JpegImage;
+ return JpegImageLoader;
})();
// TODO: per poppler, some images may have 'junk' before that
// need to be removed
this.dict = dict;
+ this.isNative = true;
+
+ 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);
+ this.src = bytesToString(bytes);
+ }
+ } else {
+ this.src = bytesToString(bytes);
+ }
- if (isAdobeImage(bytes))
- bytes = fixAdobeImage(bytes);
-
- this.src = bytesToString(bytes);
+ DecodeStream.call(this);
}
- constructor.prototype = {
- getIR: function jpegStreamGetIR() {
- return this.src;
- },
- getChar: function jpegStreamGetChar() {
+ 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;
+ };
+ constructor.prototype.getChar = function jpegStreamGetChar() {
error('internal error: getChar is not valid on JpegStream');
- }
};
return constructor;
<script type="text/javascript" src="/src/pattern.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="/external/jpgjs/jpg.js"></script>
<script type="text/javascript" src="driver.js"></script>
<script type="text/javascript">
<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/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" src="viewer.js"></script>