Merge pull request #6672 from timvandermeij/annotation-flags
Refactor annotation flags code
This commit is contained in:
commit
97cb7ff2e6
@ -15,7 +15,8 @@
|
||||
/* globals PDFJS, Util, isDict, isName, stringToPDFString, warn, Dict, Stream,
|
||||
stringToBytes, Promise, isArray, ObjectLoader, OperatorList,
|
||||
isValidUrl, OPS, createPromiseCapability, AnnotationType,
|
||||
stringToUTF8String, AnnotationBorderStyleType, ColorSpace */
|
||||
stringToUTF8String, AnnotationBorderStyleType, ColorSpace,
|
||||
AnnotationFlag, isInt */
|
||||
|
||||
'use strict';
|
||||
|
||||
@ -121,7 +122,8 @@ var Annotation = (function AnnotationClosure() {
|
||||
var data = this.data = {};
|
||||
|
||||
data.subtype = dict.get('Subtype').name;
|
||||
data.annotationFlags = dict.get('F');
|
||||
|
||||
this.setFlags(dict.get('F'));
|
||||
|
||||
this.setRectangle(dict.get('Rect'));
|
||||
data.rect = this.rectangle;
|
||||
@ -138,6 +140,64 @@ var Annotation = (function AnnotationClosure() {
|
||||
}
|
||||
|
||||
Annotation.prototype = {
|
||||
/**
|
||||
* @return {boolean}
|
||||
*/
|
||||
get viewable() {
|
||||
if (this.flags) {
|
||||
return !this.hasFlag(AnnotationFlag.INVISIBLE) &&
|
||||
!this.hasFlag(AnnotationFlag.HIDDEN) &&
|
||||
!this.hasFlag(AnnotationFlag.NOVIEW);
|
||||
}
|
||||
return true;
|
||||
},
|
||||
|
||||
/**
|
||||
* @return {boolean}
|
||||
*/
|
||||
get printable() {
|
||||
if (this.flags) {
|
||||
return this.hasFlag(AnnotationFlag.PRINT) &&
|
||||
!this.hasFlag(AnnotationFlag.INVISIBLE) &&
|
||||
!this.hasFlag(AnnotationFlag.HIDDEN);
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the flags.
|
||||
*
|
||||
* @public
|
||||
* @memberof Annotation
|
||||
* @param {number} flags - Unsigned 32-bit integer specifying annotation
|
||||
* characteristics
|
||||
* @see {@link shared/util.js}
|
||||
*/
|
||||
setFlags: function Annotation_setFlags(flags) {
|
||||
if (isInt(flags)) {
|
||||
this.flags = flags;
|
||||
} else {
|
||||
this.flags = 0;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Check if a provided flag is set.
|
||||
*
|
||||
* @public
|
||||
* @memberof Annotation
|
||||
* @param {number} flag - Hexadecimal representation for an annotation
|
||||
* characteristic
|
||||
* @return {boolean}
|
||||
* @see {@link shared/util.js}
|
||||
*/
|
||||
hasFlag: function Annotation_hasFlag(flag) {
|
||||
if (this.flags) {
|
||||
return (this.flags & flag) > 0;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the rectangle.
|
||||
*
|
||||
@ -237,32 +297,6 @@ var Annotation = (function AnnotationClosure() {
|
||||
}
|
||||
},
|
||||
|
||||
isInvisible: function Annotation_isInvisible() {
|
||||
var data = this.data;
|
||||
return !!(data &&
|
||||
data.annotationFlags && // Default: not invisible
|
||||
data.annotationFlags & 0x1); // Invisible
|
||||
},
|
||||
|
||||
isViewable: function Annotation_isViewable() {
|
||||
var data = this.data;
|
||||
return !!(!this.isInvisible() &&
|
||||
data &&
|
||||
(!data.annotationFlags ||
|
||||
!(data.annotationFlags & 0x22)) && // Hidden or NoView
|
||||
data.rect); // rectangle is necessary
|
||||
},
|
||||
|
||||
isPrintable: function Annotation_isPrintable() {
|
||||
var data = this.data;
|
||||
return !!(!this.isInvisible() &&
|
||||
data &&
|
||||
data.annotationFlags && // Default: not printable
|
||||
data.annotationFlags & 0x4 && // Print
|
||||
!(data.annotationFlags & 0x2) && // Hidden
|
||||
data.rect); // rectangle is necessary
|
||||
},
|
||||
|
||||
loadResources: function Annotation_loadResources(keys) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
this.appearance.dict.getAsync('Resources').then(function (resources) {
|
||||
@ -329,8 +363,8 @@ var Annotation = (function AnnotationClosure() {
|
||||
|
||||
var annotationPromises = [];
|
||||
for (var i = 0, n = annotations.length; i < n; ++i) {
|
||||
if (intent === 'display' && annotations[i].isViewable() ||
|
||||
intent === 'print' && annotations[i].isPrintable()) {
|
||||
if (intent === 'display' && annotations[i].viewable ||
|
||||
intent === 'print' && annotations[i].printable) {
|
||||
annotationPromises.push(
|
||||
annotations[i].getOperatorList(partialEvaluator, task));
|
||||
}
|
||||
@ -506,6 +540,12 @@ var WidgetAnnotation = (function WidgetAnnotationClosure() {
|
||||
data.fieldFlags = Util.getInheritableProperty(dict, 'Ff') || 0;
|
||||
this.fieldResources = Util.getInheritableProperty(dict, 'DR') || Dict.empty;
|
||||
|
||||
// Hide unsupported Widget signatures.
|
||||
if (data.fieldType === 'Sig') {
|
||||
warn('unimplemented annotation type: Widget signature');
|
||||
this.setFlags(AnnotationFlag.HIDDEN);
|
||||
}
|
||||
|
||||
// Building the full field name by collecting the field and
|
||||
// its ancestors 'T' data and joining them using '.'.
|
||||
var fieldName = [];
|
||||
@ -539,17 +579,7 @@ var WidgetAnnotation = (function WidgetAnnotationClosure() {
|
||||
data.fullName = fieldName.join('.');
|
||||
}
|
||||
|
||||
var parent = Annotation.prototype;
|
||||
Util.inherit(WidgetAnnotation, Annotation, {
|
||||
isViewable: function WidgetAnnotation_isViewable() {
|
||||
if (this.data.fieldType === 'Sig') {
|
||||
warn('unimplemented annotation type: Widget signature');
|
||||
return false;
|
||||
}
|
||||
|
||||
return parent.isViewable.call(this);
|
||||
}
|
||||
});
|
||||
Util.inherit(WidgetAnnotation, Annotation, {});
|
||||
|
||||
return WidgetAnnotation;
|
||||
})();
|
||||
|
@ -268,8 +268,7 @@ var Page = (function PageClosure() {
|
||||
for (var i = 0, n = annotationRefs.length; i < n; ++i) {
|
||||
var annotationRef = annotationRefs[i];
|
||||
var annotation = annotationFactory.create(this.xref, annotationRef);
|
||||
if (annotation &&
|
||||
(annotation.isViewable() || annotation.isPrintable())) {
|
||||
if (annotation && (annotation.viewable || annotation.printable)) {
|
||||
annotations.push(annotation);
|
||||
}
|
||||
}
|
||||
|
@ -48,6 +48,19 @@ var AnnotationType = {
|
||||
LINK: 3
|
||||
};
|
||||
|
||||
var AnnotationFlag = {
|
||||
INVISIBLE: 0x01,
|
||||
HIDDEN: 0x02,
|
||||
PRINT: 0x04,
|
||||
NOZOOM: 0x08,
|
||||
NOROTATE: 0x10,
|
||||
NOVIEW: 0x20,
|
||||
READONLY: 0x40,
|
||||
LOCKED: 0x80,
|
||||
TOGGLENOVIEW: 0x100,
|
||||
LOCKEDCONTENTS: 0x200
|
||||
};
|
||||
|
||||
var AnnotationBorderStyleType = {
|
||||
SOLID: 1,
|
||||
DASHED: 2,
|
||||
|
@ -1,10 +1,31 @@
|
||||
/* globals expect, it, describe, Dict, Name, Annotation, AnnotationBorderStyle,
|
||||
AnnotationBorderStyleType */
|
||||
AnnotationBorderStyleType, AnnotationFlag */
|
||||
|
||||
'use strict';
|
||||
|
||||
describe('Annotation layer', function() {
|
||||
describe('Annotation', function() {
|
||||
it('should set and get flags', function() {
|
||||
var dict = new Dict();
|
||||
dict.set('Subtype', '');
|
||||
var annotation = new Annotation({ dict: dict, ref: 0 });
|
||||
annotation.setFlags(13);
|
||||
|
||||
expect(annotation.hasFlag(AnnotationFlag.INVISIBLE)).toEqual(true);
|
||||
expect(annotation.hasFlag(AnnotationFlag.NOZOOM)).toEqual(true);
|
||||
expect(annotation.hasFlag(AnnotationFlag.PRINT)).toEqual(true);
|
||||
expect(annotation.hasFlag(AnnotationFlag.READONLY)).toEqual(false);
|
||||
});
|
||||
|
||||
it('should be viewable and not printable by default', function() {
|
||||
var dict = new Dict();
|
||||
dict.set('Subtype', '');
|
||||
var annotation = new Annotation({ dict: dict, ref: 0 });
|
||||
|
||||
expect(annotation.viewable).toEqual(true);
|
||||
expect(annotation.printable).toEqual(false);
|
||||
});
|
||||
|
||||
it('should set and get a valid rectangle', function() {
|
||||
var dict = new Dict();
|
||||
dict.set('Subtype', '');
|
||||
|
Loading…
Reference in New Issue
Block a user