1
0
Fork 0
mirror of https://github.com/mozilla/pdf.js.git synced 2025-04-25 09:38:06 +02:00

Separate page objects/images from the fonts; does not store large images

This commit is contained in:
Yury Delendik 2012-10-28 15:10:34 -05:00
parent d2c1868497
commit 69b72078c0
7 changed files with 97 additions and 73 deletions

View file

@ -172,8 +172,10 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
this.transport = transport;
this.stats = new StatTimer();
this.stats.enabled = !!globalScope.PDFJS.enableStats;
this.objs = transport.objs;
this.commonObjs = transport.commonObjs;
this.objs = new PDFObjects();
this.renderInProgress = false;
this.cleanupAfterRender = false;
}
PDFPageProxy.prototype = {
/**
@ -263,9 +265,10 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
var self = this;
function complete(error) {
self.renderInProgress = false;
if (self.destroyed) {
delete self.operatorList;
if (self.destroyed || self.cleanupAfterRender) {
delete self.displayReadyPromise;
delete self.operatorList;
self.objs.clear();
}
if (error)
@ -283,7 +286,7 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
return;
}
var gfx = new CanvasGraphics(params.canvasContext,
var gfx = new CanvasGraphics(params.canvasContext, this.commonObjs,
this.objs, params.textLayer);
try {
this.display(gfx, params.viewport, complete, continueCallback);
@ -329,7 +332,7 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
// Convert the font names to the corresponding font obj.
var fontObjs = [];
for (var i = 0, ii = fonts.length; i < ii; i++) {
var obj = this.objs.objs[fonts[i]].data;
var obj = this.commonObjs.getData(fonts[i]);
if (obj.error) {
warn('Error during font loading: ' + obj.error);
continue;
@ -423,6 +426,7 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
if (!this.renderInProgress) {
delete this.operatorList;
delete this.displayReadyPromise;
this.objs.clear();
}
}
};
@ -434,7 +438,7 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
var WorkerTransport = (function WorkerTransportClosure() {
function WorkerTransport(workerInitializedPromise, workerReadyPromise) {
this.workerReadyPromise = workerReadyPromise;
this.objs = new PDFObjects();
this.commonObjs = new PDFObjects();
this.pageCache = [];
this.pagePromises = [];
@ -569,21 +573,13 @@ var WorkerTransport = (function WorkerTransportClosure() {
page.startRenderingFromOperatorList(data.operatorList, depFonts);
}, this);
messageHandler.on('obj', function transportObj(data) {
messageHandler.on('commonobj', function transportObj(data) {
var id = data[0];
var type = data[1];
if (this.objs.hasData(id))
if (this.commonObjs.hasData(id))
return;
switch (type) {
case 'JpegStream':
var imageData = data[2];
loadJpegStream(id, imageData, this.objs);
break;
case 'Image':
var imageData = data[2];
this.objs.resolve(id, imageData);
break;
case 'Font':
var exportedData = data[2];
@ -594,10 +590,39 @@ var WorkerTransport = (function WorkerTransportClosure() {
font = new ErrorFont(exportedData.error);
else
font = new Font(exportedData);
this.objs.resolve(id, font);
this.commonObjs.resolve(id, font);
break;
default:
error('Got unkown object type ' + type);
error('Got unknown common object type ' + type);
}
}, this);
messageHandler.on('obj', function transportObj(data) {
var id = data[0];
var pageIndex = data[1];
var type = data[2];
var pageProxy = this.pageCache[pageIndex];
if (pageProxy.objs.hasData(id))
return;
switch (type) {
case 'JpegStream':
var imageData = data[3];
loadJpegStream(id, imageData, pageProxy.objs);
break;
case 'Image':
var imageData = data[3];
pageProxy.objs.resolve(id, imageData);
// heuristics that will allow not to store large data
var MAX_IMAGE_SIZE_TO_STORE = 8000000;
if ('data' in imageData &&
imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) {
pageProxy.cleanupAfterRender = true;
}
break;
default:
error('Got unknown object type ' + type);
}
}, this);