Browse Source

Async getAnnotations(); hide map and xref for Dict

Yury Delendik 13 years ago
parent
commit
42911f1fc9
  1. 19
      src/api.js
  2. 2
      src/evaluator.js
  3. 64
      src/obj.js
  4. 16
      src/worker.js

19
src/api.js

@ -102,9 +102,12 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0); return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0);
}, },
getAnnotations: function() { getAnnotations: function() {
if (this.annotationsPromise)
return this.annotationsPromise;
var promise = new PDFJS.Promise(); var promise = new PDFJS.Promise();
var annotations = this.pageInfo.annotations; this.annotationsPromise = promise;
promise.resolve(annotations); this.transport.getAnnotations(this.pageInfo.pageIndex);
return promise; return promise;
}, },
render: function(renderContext) { render: function(renderContext) {
@ -209,6 +212,7 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
gfx.executeOperatorList(operatorList, startIdx, next, stepper); gfx.executeOperatorList(operatorList, startIdx, next, stepper);
if (startIdx == length) { if (startIdx == length) {
gfx.endDrawing(); gfx.endDrawing();
delete this.operatorList;
stats.timeEnd('Rendering'); stats.timeEnd('Rendering');
stats.timeEnd('Overall'); stats.timeEnd('Overall');
if (callback) callback(); if (callback) callback();
@ -342,6 +346,12 @@ var WorkerTransport = (function WorkerTransportClosure() {
promise.resolve(page); promise.resolve(page);
}, this); }, this);
messageHandler.on('GetAnnotations', function transportAnnotations(data) {
var annotations = data.annotations;
var promise = this.pageCache[data.pageIndex].annotationsPromise;
promise.resolve(annotations);
}, this);
messageHandler.on('RenderPage', function transportRender(data) { messageHandler.on('RenderPage', function transportRender(data) {
var page = this.pageCache[data.pageIndex]; var page = this.pageCache[data.pageIndex];
var depFonts = data.depFonts; var depFonts = data.depFonts;
@ -440,6 +450,11 @@ var WorkerTransport = (function WorkerTransportClosure() {
this.pagePromises[pageIndex] = promise; this.pagePromises[pageIndex] = promise;
this.messageHandler.send('GetPageRequest', { pageIndex: pageIndex }); this.messageHandler.send('GetPageRequest', { pageIndex: pageIndex });
return promise; return promise;
},
getAnnotations: function WorkerTransport_getAnnotations(pageIndex) {
this.messageHandler.send('GetAnnotationsRequest',
{ pageIndex: pageIndex });
} }
}; };
return WorkerTransport; return WorkerTransport;

2
src/evaluator.js

@ -466,7 +466,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
args = []; args = [];
} else if (obj != null) { } else if (obj != null) {
assertWellFormed(args.length <= 33, 'Too many arguments'); assertWellFormed(args.length <= 33, 'Too many arguments');
args.push(obj); args.push(obj instanceof Dict ? obj.getAll() : obj);
} }
} }

64
src/obj.js

@ -37,51 +37,55 @@ var Dict = (function DictClosure() {
// xref is optional // xref is optional
function Dict(xref) { function Dict(xref) {
// Map should only be used internally, use functions below to access. // Map should only be used internally, use functions below to access.
this.map = Object.create(null); var map = Object.create(null);
this.xref = xref;
} this.assignXref = function Dict_assingXref(newXref) {
xref = newXref;
};
Dict.prototype = {
// automatically dereferences Ref objects // automatically dereferences Ref objects
get: function Dict_get(key1, key2, key3) { this.get = function Dict_get(key1, key2, key3) {
var value; var value;
var xref = this.xref; if (typeof (value = map[key1]) != 'undefined' || key1 in map ||
if (typeof (value = this.map[key1]) != 'undefined' || key1 in this.map ||
typeof key2 == 'undefined') { typeof key2 == 'undefined') {
return xref ? this.xref.fetchIfRef(value) : value; return xref ? xref.fetchIfRef(value) : value;
} }
if (typeof (value = this.map[key2]) != 'undefined' || key2 in this.map || if (typeof (value = map[key2]) != 'undefined' || key2 in map ||
typeof key3 == 'undefined') { typeof key3 == 'undefined') {
return xref ? this.xref.fetchIfRef(value) : value; return xref ? xref.fetchIfRef(value) : value;
} }
value = this.map[key3] || null; value = map[key3] || null;
return xref ? this.xref.fetchIfRef(value) : value; return xref ? xref.fetchIfRef(value) : value;
}, };
// no dereferencing // no dereferencing
getRaw: function Dict_getRaw(key) { this.getRaw = function Dict_getRaw(key) {
return this.map[key]; return map[key];
}, };
// creates new map and dereferences all Refs // creates new map and dereferences all Refs
getAll: function Dict_getAll() { this.getAll = function Dict_getAll() {
var all = {}; var all = {};
for (var key in this.map) for (var key in map) {
all[key] = this.get(key); var obj = this.get(key);
all[key] = obj instanceof Dict ? obj.getAll() : obj;
}
return all; return all;
}, };
set: function Dict_set(key, value) { this.set = function Dict_set(key, value) {
this.map[key] = value; map[key] = value;
}, };
has: function Dict_has(key) { this.has = function Dict_has(key) {
return key in this.map; return key in map;
}, };
forEach: function Dict_forEach(callback) { this.forEach = function Dict_forEach(callback) {
for (var key in this.map) { for (var key in map) {
callback(key, this.get(key)); callback(key, this.get(key));
} }
} };
}; };
return Dict; return Dict;
@ -299,7 +303,7 @@ var XRef = (function XRefClosure() {
this.entries = []; this.entries = [];
this.xrefstms = {}; this.xrefstms = {};
var trailerDict = this.readXRef(startXRef); var trailerDict = this.readXRef(startXRef);
trailerDict.xref = this; trailerDict.assignXref(this);
this.trailer = trailerDict; this.trailer = trailerDict;
// prepare the XRef cache // prepare the XRef cache
this.cache = []; this.cache = [];

16
src/worker.js

@ -100,20 +100,27 @@ var WorkerMessageHandler = {
handler.send('GetDoc', {pdfInfo: doc}); handler.send('GetDoc', {pdfInfo: doc});
}); });
handler.on('GetPageRequest', function wphSetupTest(data) { handler.on('GetPageRequest', function wphSetupGetPage(data) {
var pageNumber = data.pageIndex + 1; var pageNumber = data.pageIndex + 1;
var pdfPage = pdfModel.getPage(pageNumber); var pdfPage = pdfModel.getPage(pageNumber);
var page = { var page = {
pageIndex: data.pageIndex, pageIndex: data.pageIndex,
rotate: pdfPage.rotate, rotate: pdfPage.rotate,
ref: pdfPage.ref, ref: pdfPage.ref,
view: pdfPage.view, view: pdfPage.view
annotations: pdfPage.getAnnotations()
}; };
handler.send('GetPage', {pageInfo: page}); handler.send('GetPage', {pageInfo: page});
}); });
handler.on('RenderPageRequest', function wphSetupPageRequest(data) { handler.on('GetAnnotationsRequest', function wphSetupGetAnnotations(data) {
var pdfPage = pdfModel.getPage(data.pageIndex + 1);
handler.send('GetAnnotations', {
pageIndex: data.pageIndex,
annotations: pdfPage.getAnnotations()
});
});
handler.on('RenderPageRequest', function wphSetupRenderPage(data) {
var pageNum = data.pageIndex + 1; var pageNum = data.pageIndex + 1;
@ -170,7 +177,6 @@ var WorkerMessageHandler = {
fonts[dep] = true; fonts[dep] = true;
} }
} }
handler.send('RenderPage', { handler.send('RenderPage', {
pageIndex: data.pageIndex, pageIndex: data.pageIndex,
operatorList: operatorList, operatorList: operatorList,

Loading…
Cancel
Save