From 0739f90707657cc5ef77d57f3c088c1c9b10c936 Mon Sep 17 00:00:00 2001 From: Tim van der Meij Date: Wed, 15 Feb 2017 23:52:15 +0100 Subject: [PATCH] Annotations: move operator list addition logic to `src/core/document.js` Ideally, the `Annotation` class should not have anything to do with the page's operator list. How annotations are added to the page's operator list is logic that belongs in `src/core/document.js` instead where the operator list is constructed. Moreover, some comments have been added to clarify the intent of the code. --- src/core/annotation.js | 19 ------------------- src/core/document.js | 38 +++++++++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 30 deletions(-) diff --git a/src/core/annotation.js b/src/core/annotation.js index 8253864a8..f510c2663 100644 --- a/src/core/annotation.js +++ b/src/core/annotation.js @@ -467,25 +467,6 @@ var Annotation = (function AnnotationClosure() { } }; - Annotation.appendToOperatorList = function Annotation_appendToOperatorList( - annotations, opList, partialEvaluator, task, intent, renderForms) { - var annotationPromises = []; - for (var i = 0, n = annotations.length; i < n; ++i) { - if ((intent === 'display' && annotations[i].viewable) || - (intent === 'print' && annotations[i].printable)) { - annotationPromises.push( - annotations[i].getOperatorList(partialEvaluator, task, renderForms)); - } - } - return Promise.all(annotationPromises).then(function(operatorLists) { - opList.addOp(OPS.beginAnnotations, []); - for (var i = 0, n = operatorLists.length; i < n; ++i) { - opList.addOpList(operatorLists[i]); - } - opList.addOp(OPS.endAnnotations, []); - }); - }; - return Annotation; })(); diff --git a/src/core/document.js b/src/core/document.js index 8d482a317..4bd2c92fc 100644 --- a/src/core/document.js +++ b/src/core/document.js @@ -35,6 +35,7 @@ }(this, function (exports, sharedUtil, corePrimitives, coreStream, coreObj, coreParser, coreCrypto, coreEvaluator, coreAnnotation) { +var OPS = sharedUtil.OPS; var MissingDataException = sharedUtil.MissingDataException; var Util = sharedUtil.Util; var assert = sharedUtil.assert; @@ -63,7 +64,6 @@ var Linearization = coreParser.Linearization; var calculateMD5 = coreCrypto.calculateMD5; var OperatorList = coreEvaluator.OperatorList; var PartialEvaluator = coreEvaluator.PartialEvaluator; -var Annotation = coreAnnotation.Annotation; var AnnotationFactory = coreAnnotation.AnnotationFactory; var Page = (function PageClosure() { @@ -71,6 +71,11 @@ var Page = (function PageClosure() { var DEFAULT_USER_UNIT = 1.0; var LETTER_SIZE_MEDIABOX = [0, 0, 612, 792]; + function isAnnotationRenderable(annotation, intent) { + return (intent === 'display' && annotation.viewable) || + (intent === 'print' && annotation.printable); + } + function Page(pdfManager, xref, pageIndex, pageDict, ref, fontCache, builtInCMapCache) { this.pdfManager = pdfManager; @@ -269,6 +274,8 @@ var Page = (function PageClosure() { }); }); + // Fetch the page's annotations and add their operator lists to the + // page's operator list to render them. var annotationsPromise = pdfManager.ensure(this, 'annotations'); return Promise.all([pageListPromise, annotationsPromise]).then( function(datas) { @@ -280,10 +287,23 @@ var Page = (function PageClosure() { return pageOpList; } - var annotationsReadyPromise = Annotation.appendToOperatorList( - annotations, pageOpList, partialEvaluator, task, intent, - renderInteractiveForms); - return annotationsReadyPromise.then(function () { + // Collect the operator list promises for the annotations. Each promise + // is resolved with the complete operator list for a single annotation. + var i, ii, opListPromises = []; + for (i = 0, ii = annotations.length; i < ii; i++) { + if (isAnnotationRenderable(annotations[i], intent)) { + opListPromises.push(annotations[i].getOperatorList( + partialEvaluator, task, renderInteractiveForms)); + } + } + + return Promise.all(opListPromises).then(function(opLists) { + pageOpList.addOp(OPS.beginAnnotations, []); + for (i = 0, ii = opLists.length; i < ii; i++) { + pageOpList.addOpList(opLists[i]); + } + pageOpList.addOp(OPS.endAnnotations, []); + pageOpList.flush(true); return pageOpList; }); @@ -334,13 +354,9 @@ var Page = (function PageClosure() { var annotations = this.annotations; var annotationsData = []; for (var i = 0, n = annotations.length; i < n; ++i) { - if (intent) { - if (!(intent === 'display' && annotations[i].viewable) && - !(intent === 'print' && annotations[i].printable)) { - continue; - } + if (!intent || isAnnotationRenderable(annotations[i], intent)) { + annotationsData.push(annotations[i].data); } - annotationsData.push(annotations[i].data); } return annotationsData; },