Skip to content

Commit

Permalink
[api-minor] Sort PopupAnnotations already on the worker-thread (PR 11…
Browse files Browse the repository at this point in the history
…535 follow-up)

By doing this in the worker-thread this code will only need to run *once*, whereas currently re-rendering of a page forces this to be repeated (e.g. after it's been scrolled out-of-view and then back into view again).
  • Loading branch information
Snuffleupagus authored and pull[bot] committed Oct 11, 2022
1 parent e69cd1d commit 1662426
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 24 deletions.
1 change: 1 addition & 0 deletions src/core/annotation.js
Original file line number Diff line number Diff line change
Expand Up @@ -4092,4 +4092,5 @@ export {
AnnotationFactory,
getQuadPoints,
MarkupAnnotation,
PopupAnnotation,
};
29 changes: 27 additions & 2 deletions src/core/document.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
* limitations under the License.
*/

import { AnnotationFactory, PopupAnnotation } from "./annotation.js";
import {
assert,
FormatError,
Expand Down Expand Up @@ -42,7 +43,6 @@ import {
} from "./core_utils.js";
import { Dict, isName, Name, Ref } from "./primitives.js";
import { getXfaFontDict, getXfaFontName } from "./xfa_fonts.js";
import { AnnotationFactory } from "./annotation.js";
import { BaseStream } from "./base_stream.js";
import { calculateMD5 } from "./crypto.js";
import { Catalog } from "./catalog.js";
Expand Down Expand Up @@ -656,7 +656,32 @@ class Page {
}

return Promise.all(annotationPromises).then(function (annotations) {
return annotations.filter(annotation => !!annotation);
if (annotations.length === 0) {
return annotations;
}

const sortedAnnotations = [];
let popupAnnotations;
// Ensure that PopupAnnotations are handled last, since they depend on
// their parent Annotation in the display layer; fixes issue 11362.
for (const annotation of annotations) {
if (!annotation) {
continue;
}
if (annotation instanceof PopupAnnotation) {
if (!popupAnnotations) {
popupAnnotations = [];
}
popupAnnotations.push(annotation);
continue;
}
sortedAnnotations.push(annotation);
}
if (popupAnnotations) {
sortedAnnotations.push(...popupAnnotations);
}

return sortedAnnotations;
});
});

Expand Down
27 changes: 5 additions & 22 deletions src/display/annotation_layer.js
Original file line number Diff line number Diff line change
Expand Up @@ -2477,30 +2477,13 @@ class AnnotationLayer {

this.#setDimensions(div, viewport);

const sortedAnnotations = [],
popupAnnotations = [];
// Ensure that Popup annotations are handled last, since they're dependant
// upon the parent annotation having already been rendered (please refer to
// the `PopupAnnotationElement.render` method); fixes issue 11362.
for (const data of annotations) {
if (!data) {
continue;
}
if (data.annotationType === AnnotationType.POPUP) {
popupAnnotations.push(data);
continue;
}
const { width, height } = getRectDims(data.rect);
if (width <= 0 || height <= 0) {
continue; // Ignore empty annotations.
if (data.annotationType !== AnnotationType.POPUP) {
const { width, height } = getRectDims(data.rect);
if (width <= 0 || height <= 0) {
continue; // Ignore empty annotations.
}
}
sortedAnnotations.push(data);
}
if (popupAnnotations.length) {
sortedAnnotations.push(...popupAnnotations);
}

for (const data of sortedAnnotations) {
const element = AnnotationElementFactory.create({
data,
layer: div,
Expand Down

0 comments on commit 1662426

Please sign in to comment.