mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-26 10:08:06 +02:00
Merge pull request #5585 from timvandermeij/annotation-layer-borderstyle
Annotation border styles
This commit is contained in:
commit
98339f63a8
9 changed files with 337 additions and 54 deletions
|
@ -16,8 +16,8 @@
|
|||
*/
|
||||
/* globals PDFJS, Util, isDict, isName, stringToPDFString, warn, Dict, Stream,
|
||||
stringToBytes, assert, Promise, isArray, ObjectLoader, OperatorList,
|
||||
isValidUrl, OPS, createPromiseCapability, AnnotationType,
|
||||
stringToUTF8String */
|
||||
isValidUrl, OPS, createPromiseCapability, AnnotationType,
|
||||
stringToUTF8String, AnnotationBorderStyleType */
|
||||
|
||||
'use strict';
|
||||
|
||||
|
@ -102,45 +102,8 @@ var Annotation = (function AnnotationClosure() {
|
|||
}
|
||||
}
|
||||
|
||||
// Some types of annotations have border style dict which has more
|
||||
// info than the border array
|
||||
if (dict.has('BS')) {
|
||||
var borderStyle = dict.get('BS');
|
||||
data.borderWidth = borderStyle.has('W') ? borderStyle.get('W') : 1;
|
||||
} else {
|
||||
var borderArray = dict.get('Border') || [0, 0, 1];
|
||||
data.borderWidth = borderArray[2] || 0;
|
||||
|
||||
// TODO: implement proper support for annotations with line dash patterns.
|
||||
var dashArray = borderArray[3];
|
||||
if (data.borderWidth > 0 && dashArray) {
|
||||
if (!isArray(dashArray)) {
|
||||
// Ignore the border if dashArray is not actually an array,
|
||||
// this is consistent with the behaviour in Adobe Reader.
|
||||
data.borderWidth = 0;
|
||||
} else {
|
||||
var dashArrayLength = dashArray.length;
|
||||
if (dashArrayLength > 0) {
|
||||
// According to the PDF specification: the elements in a dashArray
|
||||
// shall be numbers that are nonnegative and not all equal to zero.
|
||||
var isInvalid = false;
|
||||
var numPositive = 0;
|
||||
for (var i = 0; i < dashArrayLength; i++) {
|
||||
var validNumber = (+dashArray[i] >= 0);
|
||||
if (!validNumber) {
|
||||
isInvalid = true;
|
||||
break;
|
||||
} else if (dashArray[i] > 0) {
|
||||
numPositive++;
|
||||
}
|
||||
}
|
||||
if (isInvalid || numPositive === 0) {
|
||||
data.borderWidth = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this.borderStyle = data.borderStyle = new AnnotationBorderStyle();
|
||||
this.setBorderStyle(dict);
|
||||
|
||||
this.appearance = getDefaultAppearance(dict);
|
||||
data.hasAppearance = !!this.appearance;
|
||||
|
@ -148,6 +111,41 @@ var Annotation = (function AnnotationClosure() {
|
|||
}
|
||||
|
||||
Annotation.prototype = {
|
||||
/**
|
||||
* Set the border style (as AnnotationBorderStyle object).
|
||||
*
|
||||
* @public
|
||||
* @memberof Annotation
|
||||
* @param {Dict} borderStyle - The border style dictionary
|
||||
*/
|
||||
setBorderStyle: function Annotation_setBorderStyle(borderStyle) {
|
||||
if (!isDict(borderStyle)) {
|
||||
return;
|
||||
}
|
||||
if (borderStyle.has('BS')) {
|
||||
var dict = borderStyle.get('BS');
|
||||
var dictType;
|
||||
|
||||
if (!dict.has('Type') || (isName(dictType = dict.get('Type')) &&
|
||||
dictType.name === 'Border')) {
|
||||
this.borderStyle.setWidth(dict.get('W'));
|
||||
this.borderStyle.setStyle(dict.get('S'));
|
||||
this.borderStyle.setDashArray(dict.get('D'));
|
||||
}
|
||||
} else if (borderStyle.has('Border')) {
|
||||
var array = borderStyle.get('Border');
|
||||
if (isArray(array) && array.length >= 3) {
|
||||
this.borderStyle.setHorizontalCornerRadius(array[0]);
|
||||
this.borderStyle.setVerticalCornerRadius(array[1]);
|
||||
this.borderStyle.setWidth(array[2]);
|
||||
this.borderStyle.setStyle('S');
|
||||
|
||||
if (array.length === 4) { // Dash array available
|
||||
this.borderStyle.setDashArray(array[3]);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
getData: function Annotation_getData() {
|
||||
return this.data;
|
||||
|
@ -334,6 +332,144 @@ var Annotation = (function AnnotationClosure() {
|
|||
return Annotation;
|
||||
})();
|
||||
|
||||
/**
|
||||
* Contains all data regarding an annotation's border style.
|
||||
*
|
||||
* @class
|
||||
*/
|
||||
var AnnotationBorderStyle = (function AnnotationBorderStyleClosure() {
|
||||
/**
|
||||
* @constructor
|
||||
* @private
|
||||
*/
|
||||
function AnnotationBorderStyle() {
|
||||
this.width = 1;
|
||||
this.style = AnnotationBorderStyleType.SOLID;
|
||||
this.dashArray = [3];
|
||||
this.horizontalCornerRadius = 0;
|
||||
this.verticalCornerRadius = 0;
|
||||
}
|
||||
|
||||
AnnotationBorderStyle.prototype = {
|
||||
/**
|
||||
* Set the width.
|
||||
*
|
||||
* @public
|
||||
* @memberof AnnotationBorderStyle
|
||||
* @param {integer} width - The width
|
||||
*/
|
||||
setWidth: function AnnotationBorderStyle_setWidth(width) {
|
||||
if (width === (width | 0)) {
|
||||
this.width = width;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the style.
|
||||
*
|
||||
* @public
|
||||
* @memberof AnnotationBorderStyle
|
||||
* @param {Object} style - The style object
|
||||
* @see {@link shared/util.js}
|
||||
*/
|
||||
setStyle: function AnnotationBorderStyle_setStyle(style) {
|
||||
if (!style) {
|
||||
return;
|
||||
}
|
||||
switch (style.name) {
|
||||
case 'S':
|
||||
this.style = AnnotationBorderStyleType.SOLID;
|
||||
break;
|
||||
|
||||
case 'D':
|
||||
this.style = AnnotationBorderStyleType.DASHED;
|
||||
break;
|
||||
|
||||
case 'B':
|
||||
this.style = AnnotationBorderStyleType.BEVELED;
|
||||
break;
|
||||
|
||||
case 'I':
|
||||
this.style = AnnotationBorderStyleType.INSET;
|
||||
break;
|
||||
|
||||
case 'U':
|
||||
this.style = AnnotationBorderStyleType.UNDERLINE;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the dash array.
|
||||
*
|
||||
* @public
|
||||
* @memberof AnnotationBorderStyle
|
||||
* @param {Array} dashArray - The dash array with at least one element
|
||||
*/
|
||||
setDashArray: function AnnotationBorderStyle_setDashArray(dashArray) {
|
||||
// We validate the dash array, but we do not use it because CSS does not
|
||||
// allow us to change spacing of dashes. For more information, visit
|
||||
// http://www.w3.org/TR/css3-background/#the-border-style.
|
||||
if (isArray(dashArray) && dashArray.length > 0) {
|
||||
// According to the PDF specification: the elements in a dashArray
|
||||
// shall be numbers that are nonnegative and not all equal to zero.
|
||||
var isValid = true;
|
||||
var allZeros = true;
|
||||
for (var i = 0, len = dashArray.length; i < len; i++) {
|
||||
var element = dashArray[i];
|
||||
var validNumber = (+element >= 0);
|
||||
if (!validNumber) {
|
||||
isValid = false;
|
||||
break;
|
||||
} else if (element > 0) {
|
||||
allZeros = false;
|
||||
}
|
||||
}
|
||||
if (isValid && !allZeros) {
|
||||
this.dashArray = dashArray;
|
||||
} else {
|
||||
this.width = 0; // Adobe behavior when the array is invalid.
|
||||
}
|
||||
} else if (dashArray) {
|
||||
this.width = 0; // Adobe behavior when the array is invalid.
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the horizontal corner radius (from a Border dictionary).
|
||||
*
|
||||
* @public
|
||||
* @memberof AnnotationBorderStyle
|
||||
* @param {integer} radius - The horizontal corner radius
|
||||
*/
|
||||
setHorizontalCornerRadius:
|
||||
function AnnotationBorderStyle_setHorizontalCornerRadius(radius) {
|
||||
if (radius === (radius | 0)) {
|
||||
this.horizontalCornerRadius = radius;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the vertical corner radius (from a Border dictionary).
|
||||
*
|
||||
* @public
|
||||
* @memberof AnnotationBorderStyle
|
||||
* @param {integer} radius - The vertical corner radius
|
||||
*/
|
||||
setVerticalCornerRadius:
|
||||
function AnnotationBorderStyle_setVerticalCornerRadius(radius) {
|
||||
if (radius === (radius | 0)) {
|
||||
this.verticalCornerRadius = radius;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return AnnotationBorderStyle;
|
||||
})();
|
||||
|
||||
var WidgetAnnotation = (function WidgetAnnotationClosure() {
|
||||
|
||||
function WidgetAnnotation(params) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue