Merge pull request #14899 from Snuffleupagus/issue-14896
[api-minor] Include line endings in Line/Polyline Annotation-data (issue 14896)
This commit is contained in:
commit
ed70ec8726
@ -613,6 +613,39 @@ class Annotation {
|
|||||||
this.color = getRgbColor(color);
|
this.color = getRgbColor(color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the line endings; should only be used with specific annotation types.
|
||||||
|
* @param {Array} lineEndings - The line endings array.
|
||||||
|
*/
|
||||||
|
setLineEndings(lineEndings) {
|
||||||
|
this.lineEndings = ["None", "None"]; // The default values.
|
||||||
|
|
||||||
|
if (Array.isArray(lineEndings) && lineEndings.length === 2) {
|
||||||
|
for (let i = 0; i < 2; i++) {
|
||||||
|
const obj = lineEndings[i];
|
||||||
|
|
||||||
|
if (obj instanceof Name) {
|
||||||
|
switch (obj.name) {
|
||||||
|
case "None":
|
||||||
|
continue;
|
||||||
|
case "Square":
|
||||||
|
case "Circle":
|
||||||
|
case "Diamond":
|
||||||
|
case "OpenArrow":
|
||||||
|
case "ClosedArrow":
|
||||||
|
case "Butt":
|
||||||
|
case "ROpenArrow":
|
||||||
|
case "RClosedArrow":
|
||||||
|
case "Slash":
|
||||||
|
this.lineEndings[i] = obj.name;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
warn(`Ignoring invalid lineEnding: ${obj}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the color for background and border if any.
|
* Set the color for background and border if any.
|
||||||
* The default values are transparent.
|
* The default values are transparent.
|
||||||
@ -2803,22 +2836,26 @@ class LineAnnotation extends MarkupAnnotation {
|
|||||||
constructor(parameters) {
|
constructor(parameters) {
|
||||||
super(parameters);
|
super(parameters);
|
||||||
|
|
||||||
|
const { dict } = parameters;
|
||||||
this.data.annotationType = AnnotationType.LINE;
|
this.data.annotationType = AnnotationType.LINE;
|
||||||
|
|
||||||
const lineCoordinates = parameters.dict.getArray("L");
|
const lineCoordinates = dict.getArray("L");
|
||||||
this.data.lineCoordinates = Util.normalizeRect(lineCoordinates);
|
this.data.lineCoordinates = Util.normalizeRect(lineCoordinates);
|
||||||
|
|
||||||
|
this.setLineEndings(dict.getArray("LE"));
|
||||||
|
this.data.lineEndings = this.lineEndings;
|
||||||
|
|
||||||
if (!this.appearance) {
|
if (!this.appearance) {
|
||||||
// The default stroke color is black.
|
// The default stroke color is black.
|
||||||
const strokeColor = this.color
|
const strokeColor = this.color
|
||||||
? Array.from(this.color).map(c => c / 255)
|
? Array.from(this.color).map(c => c / 255)
|
||||||
: [0, 0, 0];
|
: [0, 0, 0];
|
||||||
const strokeAlpha = parameters.dict.get("CA");
|
const strokeAlpha = dict.get("CA");
|
||||||
|
|
||||||
// The default fill color is transparent. Setting the fill colour is
|
// The default fill color is transparent. Setting the fill colour is
|
||||||
// necessary if/when we want to add support for non-default line endings.
|
// necessary if/when we want to add support for non-default line endings.
|
||||||
let fillColor = null,
|
let fillColor = null,
|
||||||
interiorColor = parameters.dict.getArray("IC");
|
interiorColor = dict.getArray("IC");
|
||||||
if (interiorColor) {
|
if (interiorColor) {
|
||||||
interiorColor = getRgbColor(interiorColor, null);
|
interiorColor = getRgbColor(interiorColor, null);
|
||||||
fillColor = interiorColor
|
fillColor = interiorColor
|
||||||
@ -2996,13 +3033,20 @@ class PolylineAnnotation extends MarkupAnnotation {
|
|||||||
constructor(parameters) {
|
constructor(parameters) {
|
||||||
super(parameters);
|
super(parameters);
|
||||||
|
|
||||||
|
const { dict } = parameters;
|
||||||
this.data.annotationType = AnnotationType.POLYLINE;
|
this.data.annotationType = AnnotationType.POLYLINE;
|
||||||
this.data.vertices = [];
|
this.data.vertices = [];
|
||||||
|
|
||||||
|
if (!(this instanceof PolygonAnnotation)) {
|
||||||
|
// Only meaningful for polyline annotations.
|
||||||
|
this.setLineEndings(dict.getArray("LE"));
|
||||||
|
this.data.lineEndings = this.lineEndings;
|
||||||
|
}
|
||||||
|
|
||||||
// The vertices array is an array of numbers representing the alternating
|
// The vertices array is an array of numbers representing the alternating
|
||||||
// horizontal and vertical coordinates, respectively, of each vertex.
|
// horizontal and vertical coordinates, respectively, of each vertex.
|
||||||
// Convert this to an array of objects with x and y coordinates.
|
// Convert this to an array of objects with x and y coordinates.
|
||||||
const rawVertices = parameters.dict.getArray("Vertices");
|
const rawVertices = dict.getArray("Vertices");
|
||||||
if (!Array.isArray(rawVertices)) {
|
if (!Array.isArray(rawVertices)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3018,7 +3062,7 @@ class PolylineAnnotation extends MarkupAnnotation {
|
|||||||
const strokeColor = this.color
|
const strokeColor = this.color
|
||||||
? Array.from(this.color).map(c => c / 255)
|
? Array.from(this.color).map(c => c / 255)
|
||||||
: [0, 0, 0];
|
: [0, 0, 0];
|
||||||
const strokeAlpha = parameters.dict.get("CA");
|
const strokeAlpha = dict.get("CA");
|
||||||
|
|
||||||
const borderWidth = this.borderStyle.width || 1,
|
const borderWidth = this.borderStyle.width || 1,
|
||||||
borderAdjust = 2 * borderWidth;
|
borderAdjust = 2 * borderWidth;
|
||||||
|
@ -3618,6 +3618,7 @@ describe("annotation", function () {
|
|||||||
lineDict.set("Type", Name.get("Annot"));
|
lineDict.set("Type", Name.get("Annot"));
|
||||||
lineDict.set("Subtype", Name.get("Line"));
|
lineDict.set("Subtype", Name.get("Line"));
|
||||||
lineDict.set("L", [1, 2, 3, 4]);
|
lineDict.set("L", [1, 2, 3, 4]);
|
||||||
|
lineDict.set("LE", ["Square", "Circle"]);
|
||||||
|
|
||||||
const lineRef = Ref.get(122, 0);
|
const lineRef = Ref.get(122, 0);
|
||||||
const xref = new XRefMock([{ ref: lineRef, data: lineDict }]);
|
const xref = new XRefMock([{ ref: lineRef, data: lineDict }]);
|
||||||
@ -3630,6 +3631,28 @@ describe("annotation", function () {
|
|||||||
);
|
);
|
||||||
expect(data.annotationType).toEqual(AnnotationType.LINE);
|
expect(data.annotationType).toEqual(AnnotationType.LINE);
|
||||||
expect(data.lineCoordinates).toEqual([1, 2, 3, 4]);
|
expect(data.lineCoordinates).toEqual([1, 2, 3, 4]);
|
||||||
|
expect(data.lineEndings).toEqual(["None", "None"]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should set the line endings", async function () {
|
||||||
|
const lineDict = new Dict();
|
||||||
|
lineDict.set("Type", Name.get("Annot"));
|
||||||
|
lineDict.set("Subtype", Name.get("Line"));
|
||||||
|
lineDict.set("L", [1, 2, 3, 4]);
|
||||||
|
lineDict.set("LE", [Name.get("Square"), Name.get("Circle")]);
|
||||||
|
|
||||||
|
const lineRef = Ref.get(122, 0);
|
||||||
|
const xref = new XRefMock([{ ref: lineRef, data: lineDict }]);
|
||||||
|
|
||||||
|
const { data } = await AnnotationFactory.create(
|
||||||
|
xref,
|
||||||
|
lineRef,
|
||||||
|
pdfManagerMock,
|
||||||
|
idFactoryMock
|
||||||
|
);
|
||||||
|
expect(data.annotationType).toEqual(AnnotationType.LINE);
|
||||||
|
expect(data.lineCoordinates).toEqual([1, 2, 3, 4]);
|
||||||
|
expect(data.lineEndings).toEqual(["Square", "Circle"]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user