First stage of trying to support smasks on native jpegs.
This commit is contained in:
parent
c615342962
commit
2a632d4ab2
@ -1038,21 +1038,24 @@ var CanvasGraphics = (function canvasGraphics() {
|
|||||||
|
|
||||||
paintJpegXObject: function canvasGraphicsPaintJpegXObject(objId, w, h) {
|
paintJpegXObject: function canvasGraphicsPaintJpegXObject(objId, w, h) {
|
||||||
var image = this.objs.get(objId);
|
var image = this.objs.get(objId);
|
||||||
|
debugger;
|
||||||
if (!image) {
|
if (!image) {
|
||||||
error('Dependent image isn\'t ready yet');
|
error('Dependent image isn\'t ready yet');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
this.paintNormalImageXObject(image);
|
||||||
|
/*
|
||||||
this.save();
|
this.save();
|
||||||
|
|
||||||
var ctx = this.ctx;
|
var ctx = this.ctx;
|
||||||
// scale the image to the unit square
|
// scale the image to the unit square
|
||||||
ctx.scale(1 / w, -1 / h);
|
ctx.scale(1 / w, -1 / h);
|
||||||
|
|
||||||
var domImage = image.getImage();
|
ctx.drawImage(image.data, 0, 0, image.width, image.height,
|
||||||
ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
|
|
||||||
0, -h, w, h);
|
0, -h, w, h);
|
||||||
|
|
||||||
this.restore();
|
this.restore(); */
|
||||||
},
|
},
|
||||||
|
|
||||||
paintImageMaskXObject: function canvasGraphicsPaintImageMaskXObject(
|
paintImageMaskXObject: function canvasGraphicsPaintImageMaskXObject(
|
||||||
@ -1104,7 +1107,7 @@ var CanvasGraphics = (function canvasGraphics() {
|
|||||||
this.restore();
|
this.restore();
|
||||||
},
|
},
|
||||||
|
|
||||||
paintImageXObject: function canvasGraphicsPaintImageXObject(imgData) {
|
paintNormalImageXObject: function canvasGraphicsPaintImageXObject(imgData) {
|
||||||
this.save();
|
this.save();
|
||||||
var ctx = this.ctx;
|
var ctx = this.ctx;
|
||||||
var w = imgData.width;
|
var w = imgData.width;
|
||||||
@ -1134,6 +1137,21 @@ var CanvasGraphics = (function canvasGraphics() {
|
|||||||
this.restore();
|
this.restore();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
paintImageXObject: function canvasGraphicsPaintImageXObject(type, data) {
|
||||||
|
debugger;
|
||||||
|
switch(type) {
|
||||||
|
case 'jpeg':
|
||||||
|
this.paintJpegXObject.apply(this, data);
|
||||||
|
break;
|
||||||
|
case 'imageMask':
|
||||||
|
this.paintImageMaskXObject.apply(this, data);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
this.paintNormalImageXObject.apply(this, data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
// Marked content
|
// Marked content
|
||||||
|
|
||||||
markPoint: function canvasGraphicsMarkPoint(tag) {
|
markPoint: function canvasGraphicsMarkPoint(tag) {
|
||||||
|
35
src/core.js
35
src/core.js
@ -6,7 +6,7 @@
|
|||||||
var globalScope = (typeof window === 'undefined') ? this : window;
|
var globalScope = (typeof window === 'undefined') ? this : window;
|
||||||
|
|
||||||
var ERRORS = 0, WARNINGS = 1, TODOS = 5;
|
var ERRORS = 0, WARNINGS = 1, TODOS = 5;
|
||||||
var verbosity = WARNINGS;
|
var verbosity = TODOS;
|
||||||
|
|
||||||
// The global PDFJS object exposes the API
|
// The global PDFJS object exposes the API
|
||||||
// In production, it will be declared outside a global wrapper
|
// In production, it will be declared outside a global wrapper
|
||||||
@ -14,7 +14,7 @@ var verbosity = WARNINGS;
|
|||||||
if (!globalScope.PDFJS) {
|
if (!globalScope.PDFJS) {
|
||||||
globalScope.PDFJS = {};
|
globalScope.PDFJS = {};
|
||||||
}
|
}
|
||||||
|
PDFJS.disableWorker = true;
|
||||||
// getPdf()
|
// getPdf()
|
||||||
// Convenience function to perform binary Ajax GET
|
// Convenience function to perform binary Ajax GET
|
||||||
// Usage: getPdf('http://...', callback)
|
// Usage: getPdf('http://...', callback)
|
||||||
@ -440,6 +440,7 @@ var PDFDocModel = (function pdfDoc() {
|
|||||||
this.startXRef,
|
this.startXRef,
|
||||||
this.mainXRefEntriesOffset);
|
this.mainXRefEntriesOffset);
|
||||||
this.catalog = new Catalog(this.xref);
|
this.catalog = new Catalog(this.xref);
|
||||||
|
this.objs = new PDFObjects();
|
||||||
},
|
},
|
||||||
get numPages() {
|
get numPages() {
|
||||||
var linearization = this.linearization;
|
var linearization = this.linearization;
|
||||||
@ -559,9 +560,9 @@ var PDFDoc = (function pdfDoc() {
|
|||||||
var type = data[1];
|
var type = data[1];
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 'JpegStream':
|
case 'Jpeg':
|
||||||
var IR = data[2];
|
var imageData = data[2];
|
||||||
new JpegImageLoader(id, IR, this.objs);
|
this.objs.resolve(id, imageData);
|
||||||
break;
|
break;
|
||||||
case 'Font':
|
case 'Font':
|
||||||
var name = data[2];
|
var name = data[2];
|
||||||
@ -607,6 +608,30 @@ var PDFDoc = (function pdfDoc() {
|
|||||||
throw data.error;
|
throw data.error;
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
|
messageHandler.on('jpeg_decode', function(message) {
|
||||||
|
var imageData = message.data[0];
|
||||||
|
var img = new Image();
|
||||||
|
img.onload = (function jpegImageLoaderOnload() {
|
||||||
|
var width = img.width;
|
||||||
|
var height = img.height;
|
||||||
|
var length = width * height * 4;
|
||||||
|
var buf = new Uint8Array(length);
|
||||||
|
var tempCanvas = new ScratchCanvas(width, height);
|
||||||
|
var tempCtx = tempCanvas.getContext('2d');
|
||||||
|
tempCtx.drawImage(img, 0, 0);
|
||||||
|
var data = tempCtx.getImageData(0, 0, width, height).data;
|
||||||
|
for (var i = 0; i < length; i += 4) {
|
||||||
|
buf[i] = data[i];
|
||||||
|
buf[i + 1] = data[i + 1];
|
||||||
|
buf[i + 2] = data[i + 2];
|
||||||
|
buf[i + 3] = data[i + 3];
|
||||||
|
}
|
||||||
|
message.resolve({ data: buf, width: width, height: height});
|
||||||
|
}).bind(this);
|
||||||
|
var src = 'data:image/jpeg;base64,' + window.btoa(imageData);
|
||||||
|
img.src = src;
|
||||||
|
});
|
||||||
|
|
||||||
setTimeout(function pdfDocFontReadySetTimeout() {
|
setTimeout(function pdfDocFontReadySetTimeout() {
|
||||||
messageHandler.send('doc', this.data);
|
messageHandler.send('doc', this.data);
|
||||||
this.workerReadyPromise.resolve(true);
|
this.workerReadyPromise.resolve(true);
|
||||||
|
@ -179,21 +179,24 @@ var PartialEvaluator = (function partialEvaluator() {
|
|||||||
return loadedName;
|
return loadedName;
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildPaintImageXObject(image, inline) {
|
function buildPaintImageXObject(image, inline) {
|
||||||
var dict = image.dict;
|
var dict = image.dict;
|
||||||
var w = dict.get('Width', 'W');
|
var w = dict.get('Width', 'W');
|
||||||
var h = dict.get('Height', 'H');
|
var h = dict.get('Height', 'H');
|
||||||
|
fn = 'paintImageXObject';
|
||||||
|
|
||||||
if (image instanceof JpegStream && image.isNative) {
|
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()]);
|
debugger;
|
||||||
|
handler.send('jpeg_decode', [image.getIR()], function(data) {
|
||||||
|
handler.send('obj', [objId, 'Jpeg', data]);
|
||||||
|
});
|
||||||
|
|
||||||
// Add the dependency on the image object.
|
// Add the dependency on the image object.
|
||||||
insertDependency([objId]);
|
insertDependency([objId]);
|
||||||
|
|
||||||
// The normal fn.
|
// The normal fn.
|
||||||
fn = 'paintJpegXObject';
|
args = ['jpeg', [objId, w, h]];
|
||||||
args = [objId, w, h];
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -220,8 +223,7 @@ var PartialEvaluator = (function partialEvaluator() {
|
|||||||
var pixels = imgData.data;
|
var pixels = imgData.data;
|
||||||
imageObj.fillRgbaBuffer(pixels, imageObj.decode);
|
imageObj.fillRgbaBuffer(pixels, imageObj.decode);
|
||||||
|
|
||||||
fn = 'paintImageXObject';
|
args = ['normal', [imgData]];
|
||||||
args = [imgData];
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,7 +232,6 @@ var PartialEvaluator = (function partialEvaluator() {
|
|||||||
// data can't be done here. Instead of creating a
|
// data can't be done here. Instead of creating a
|
||||||
// complete PDFImage, only read the information needed
|
// complete PDFImage, only read the information needed
|
||||||
// for later.
|
// for later.
|
||||||
fn = 'paintImageMaskXObject';
|
|
||||||
|
|
||||||
var width = dict.get('Width', 'W');
|
var width = dict.get('Width', 'W');
|
||||||
var height = dict.get('Height', 'H');
|
var height = dict.get('Height', 'H');
|
||||||
@ -239,7 +240,7 @@ var PartialEvaluator = (function partialEvaluator() {
|
|||||||
var decode = dict.get('Decode', 'D');
|
var decode = dict.get('Decode', 'D');
|
||||||
var inverseDecode = !!decode && decode[0] > 0;
|
var inverseDecode = !!decode && decode[0] > 0;
|
||||||
|
|
||||||
args = [imgArray, inverseDecode, width, height];
|
args = ['imageMask', [imgArray, inverseDecode, width, height]];
|
||||||
}
|
}
|
||||||
|
|
||||||
uniquePrefix = uniquePrefix || '';
|
uniquePrefix = uniquePrefix || '';
|
||||||
|
27
src/image.js
27
src/image.js
@ -228,30 +228,3 @@ var PDFImage = (function pdfImage() {
|
|||||||
};
|
};
|
||||||
return constructor;
|
return constructor;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
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 jpegImageLoaderOnload() {
|
|
||||||
this.loaded = true;
|
|
||||||
|
|
||||||
objs.resolve(objId, this);
|
|
||||||
|
|
||||||
if (this.onLoad)
|
|
||||||
this.onLoad();
|
|
||||||
}).bind(this);
|
|
||||||
img.src = src;
|
|
||||||
this.domImage = img;
|
|
||||||
}
|
|
||||||
|
|
||||||
JpegImageLoader.prototype = {
|
|
||||||
getImage: function jpegImageLoaderGetImage() {
|
|
||||||
return this.domImage;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return JpegImageLoader;
|
|
||||||
})();
|
|
||||||
|
|
||||||
|
@ -804,6 +804,8 @@ var JpegStream = (function jpegStream() {
|
|||||||
|
|
||||||
this.colorTransform = -1;
|
this.colorTransform = -1;
|
||||||
|
|
||||||
|
this.bytes = bytes;
|
||||||
|
|
||||||
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
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
function MessageHandler(name, comObj) {
|
function MessageHandler(name, comObj) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.comObj = comObj;
|
this.comObj = comObj;
|
||||||
|
this.callbackIndex = 1;
|
||||||
|
this.callbacks = {};
|
||||||
var ah = this.actionHandler = {};
|
var ah = this.actionHandler = {};
|
||||||
|
|
||||||
ah['console_log'] = [function ahConsoleLog(data) {
|
ah['console_log'] = [function ahConsoleLog(data) {
|
||||||
@ -14,11 +16,38 @@ function MessageHandler(name, comObj) {
|
|||||||
ah['console_error'] = [function ahConsoleError(data) {
|
ah['console_error'] = [function ahConsoleError(data) {
|
||||||
console.error.apply(console, data);
|
console.error.apply(console, data);
|
||||||
}];
|
}];
|
||||||
|
ah['__resolve__'] = [ function(data) {
|
||||||
|
var callbackId = data.callbackId;
|
||||||
|
if (data.callbackId in this.callbacks) {
|
||||||
|
var callback = this.callbacks[callbackId];
|
||||||
|
delete this.callbacks[callbackId];
|
||||||
|
callback(data.data);
|
||||||
|
} else {
|
||||||
|
throw 'Cannot resolve callback ' + callbackId;
|
||||||
|
}
|
||||||
|
}, this];
|
||||||
|
|
||||||
comObj.onmessage = function messageHandlerComObjOnMessage(event) {
|
comObj.onmessage = function messageHandlerComObjOnMessage(event) {
|
||||||
var data = event.data;
|
var data = event.data;
|
||||||
if (data.action in ah) {
|
if (data.action in ah) {
|
||||||
var action = ah[data.action];
|
var action = ah[data.action];
|
||||||
action[0].call(action[1], data.data);
|
if (data.callbackId) {
|
||||||
|
action[0].call(action[1], {
|
||||||
|
data: data.data,
|
||||||
|
resolve: (function(callbackId) {
|
||||||
|
return function(resolvedData) {
|
||||||
|
comObj.postMessage({
|
||||||
|
action: '__resolve__',
|
||||||
|
data: {
|
||||||
|
data: resolvedData,
|
||||||
|
callbackId: data.callbackId
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}})(data.callbackId)
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
action[0].call(action[1], data.data);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
throw 'Unkown action from worker: ' + data.action;
|
throw 'Unkown action from worker: ' + data.action;
|
||||||
}
|
}
|
||||||
@ -34,11 +63,17 @@ MessageHandler.prototype = {
|
|||||||
ah[actionName] = [handler, scope];
|
ah[actionName] = [handler, scope];
|
||||||
},
|
},
|
||||||
|
|
||||||
send: function messageHandlerSend(actionName, data) {
|
send: function messageHandlerSend(actionName, data, callback) {
|
||||||
this.comObj.postMessage({
|
var message = {
|
||||||
action: actionName,
|
action: actionName,
|
||||||
data: data
|
data: data
|
||||||
});
|
};
|
||||||
|
if (callback) {
|
||||||
|
var callbackId = this.callbackIndex++;
|
||||||
|
this.callbacks[callbackId] = callback;
|
||||||
|
message.callbackId = callbackId;
|
||||||
|
}
|
||||||
|
this.comObj.postMessage(message);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -160,6 +195,13 @@ var WorkerMessageHandler = {
|
|||||||
|
|
||||||
handler.send('font_ready', [objId, obj]);
|
handler.send('font_ready', [objId, obj]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
handler.on('jpeg_decoded', function jpegDecoded(data) {
|
||||||
|
var objId = data[0];
|
||||||
|
var imageData = data[1];
|
||||||
|
console.log('worker recieved decoded jpeg');
|
||||||
|
debugger;
|
||||||
|
}, this);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user