@markerjs/markerjs3 3.5.2 → 3.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/markerjs3.js +1 -1
- package/markerjs3.js.map +1 -1
- package/package.json +1 -1
- package/umd/markerjs3.js +1 -1
- package/umd/markerjs3.js.map +1 -1
package/umd/markerjs3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markerjs3.js","sources":["../../src/core/SvgHelper.ts","../../src/core/Activator.ts","../../src/core/MarkerBase.ts","../../src/core/TransformMatrix.ts","../../src/core/RectangularBoxMarkerBase.ts","../../src/core/ShapeOutlineMarkerBase.ts","../../src/core/ShapeMarkerBase.ts","../../src/core/FrameMarker.ts","../../src/core/LinearMarkerBase.ts","../../src/core/LineMarker.ts","../../src/core/ArrowMarker.ts","../../src/core/MeasurementMarker.ts","../../src/core/PolygonMarker.ts","../../src/core/FreehandMarker.ts","../../node_modules/tslib/tslib.es6.js","../../src/core/TextBlock.ts","../../src/core/TextMarker.ts","../../src/core/CoverMarker.ts","../../src/core/HighlightMarker.ts","../../src/core/CalloutMarker.ts","../../src/core/EllipseFrameMarker.ts","../../src/core/EllipseMarker.ts","../../src/core/ImageMarkerBase.ts","../../src/core/CustomImageMarker.ts","../../src/core/CheckImageMarker.ts","../../src/core/XImageMarker.ts","../../src/core/CaptionFrameMarker.ts","../../src/core/CurveMarker.ts","../../src/core/HighlighterMarker.ts","../../src/core/SvgFilters.ts","../../src/editor/MarkerBaseEditor.ts","../../src/editor/Grip.ts","../../src/editor/ResizeGrip.ts","../../src/editor/PolygonMarkerEditor.ts","../../src/editor/LinearMarkerEditor.ts","../../src/editor/RectangularBoxMarkerGrips.ts","../../src/editor/RotateGrip.ts","../../src/editor/RectangularBoxMarkerBaseEditor.ts","../../src/editor/ShapeOutlineMarkerEditor.ts","../../src/editor/UndoRedoManager.ts","../../src/editor/FreehandMarkerEditor.ts","../../src/editor/TextBlockEditor.ts","../../src/editor/TextMarkerEditor.ts","../../src/editor/ShapeMarkerEditor.ts","../../src/editor/ArrowMarkerEditor.ts","../../src/editor/CalloutMarkerEditor.ts","../../src/editor/ImageMarkerEditor.ts","../../src/editor/CaptionFrameMarkerEditor.ts","../../src/editor/CurveMarkerEditor.ts","../../src/MarkerArea.ts","../../src/editor.ts","../../src/MarkerView.ts","../../src/viewer.ts","../../src/Renderer.ts"],"sourcesContent":["import { IPoint } from './IPoint';\r\n\r\n/**\r\n * Utility class to simplify SVG operations.\r\n */\r\nexport class SvgHelper {\r\n /**\r\n * Creates SVG \"defs\".\r\n */\r\n public static createDefs(): SVGDefsElement {\r\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\r\n\r\n return defs;\r\n }\r\n\r\n /**\r\n * Sets attributes on an arbitrary SVG element\r\n * @param el - target SVG element.\r\n * @param attributes - set of name-value attribute pairs.\r\n */\r\n public static setAttributes(\r\n el: SVGElement,\r\n attributes: Array<[string, string]>,\r\n ): void {\r\n for (const [attr, value] of attributes) {\r\n el.setAttribute(attr, value);\r\n }\r\n }\r\n\r\n /**\r\n * Creates an SVG rectangle with the specified width and height.\r\n * @param width\r\n * @param height\r\n * @param attributes - additional attributes.\r\n */\r\n public static createRect(\r\n width: number | string,\r\n height: number | string,\r\n attributes?: Array<[string, string]>,\r\n ): SVGRectElement {\r\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\r\n\r\n rect.setAttribute('width', width.toString());\r\n rect.setAttribute('height', height.toString());\r\n if (attributes) {\r\n SvgHelper.setAttributes(rect, attributes);\r\n }\r\n\r\n return rect;\r\n }\r\n\r\n /**\r\n * Creates an SVG line with specified end-point coordinates.\r\n * @param x1\r\n * @param y1\r\n * @param x2\r\n * @param y2\r\n * @param attributes - additional attributes.\r\n */\r\n public static createLine(\r\n x1: number | string,\r\n y1: number | string,\r\n x2: number | string,\r\n y2: number | string,\r\n attributes?: Array<[string, string]>,\r\n ): SVGLineElement {\r\n const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');\r\n\r\n line.setAttribute('x1', x1.toString());\r\n line.setAttribute('y1', y1.toString());\r\n line.setAttribute('x2', x2.toString());\r\n line.setAttribute('y2', y2.toString());\r\n if (attributes) {\r\n SvgHelper.setAttributes(line, attributes);\r\n }\r\n\r\n return line;\r\n }\r\n\r\n /**\r\n * Creates an SVG polygon with specified points.\r\n * @param points - points as string.\r\n * @param attributes - additional attributes.\r\n */\r\n public static createPolygon(\r\n points: string,\r\n attributes?: Array<[string, string]>,\r\n ): SVGPolygonElement {\r\n const polygon = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'polygon',\r\n );\r\n\r\n polygon.setAttribute('points', points);\r\n if (attributes) {\r\n SvgHelper.setAttributes(polygon, attributes);\r\n }\r\n\r\n return polygon;\r\n }\r\n\r\n /**\r\n * Creates an SVG circle with the specified radius.\r\n * @param radius\r\n * @param attributes - additional attributes.\r\n */\r\n public static createCircle(\r\n radius: number,\r\n attributes?: Array<[string, string]>,\r\n ): SVGCircleElement {\r\n const circle = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'circle',\r\n );\r\n\r\n circle.setAttribute('cx', (radius / 2).toString());\r\n circle.setAttribute('cy', (radius / 2).toString());\r\n circle.setAttribute('r', radius.toString());\r\n if (attributes) {\r\n SvgHelper.setAttributes(circle, attributes);\r\n }\r\n\r\n return circle;\r\n }\r\n\r\n /**\r\n * Creates an SVG ellipse with the specified horizontal and vertical radii.\r\n * @param rx\r\n * @param ry\r\n * @param attributes - additional attributes.\r\n */\r\n public static createEllipse(\r\n rx: number,\r\n ry: number,\r\n attributes?: Array<[string, string]>,\r\n ): SVGEllipseElement {\r\n const ellipse = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'ellipse',\r\n );\r\n\r\n ellipse.setAttribute('cx', (rx / 2).toString());\r\n ellipse.setAttribute('cy', (ry / 2).toString());\r\n ellipse.setAttribute('rx', (rx / 2).toString());\r\n ellipse.setAttribute('ry', (ry / 2).toString());\r\n if (attributes) {\r\n SvgHelper.setAttributes(ellipse, attributes);\r\n }\r\n\r\n return ellipse;\r\n }\r\n\r\n /**\r\n * Creates an SVG group.\r\n * @param attributes - additional attributes.\r\n */\r\n public static createGroup(attributes?: Array<[string, string]>): SVGGElement {\r\n const g = document.createElementNS('http://www.w3.org/2000/svg', 'g');\r\n if (attributes) {\r\n SvgHelper.setAttributes(g, attributes);\r\n }\r\n return g;\r\n }\r\n\r\n /**\r\n * Creates an SVG transform.\r\n */\r\n public static createTransform(): SVGTransform {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n\r\n return svg.createSVGTransform();\r\n }\r\n\r\n /**\r\n * Creates an SVG marker.\r\n * @param id\r\n * @param orient\r\n * @param markerWidth\r\n * @param markerHeight\r\n * @param refX\r\n * @param refY\r\n * @param markerElement\r\n */\r\n public static createMarker(\r\n id: string,\r\n orient: string,\r\n markerWidth: number | string,\r\n markerHeight: number | string,\r\n refX: number | string,\r\n refY: number | string,\r\n markerElement: SVGGraphicsElement,\r\n ): SVGMarkerElement {\r\n const marker = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'marker',\r\n );\r\n SvgHelper.setAttributes(marker, [\r\n ['id', id],\r\n ['orient', orient],\r\n ['markerWidth', markerWidth.toString()],\r\n ['markerHeight', markerHeight.toString()],\r\n ['refX', refX.toString()],\r\n ['refY', refY.toString()],\r\n ]);\r\n\r\n marker.appendChild(markerElement);\r\n\r\n return marker;\r\n }\r\n\r\n /**\r\n * Creates an SVG text element.\r\n * @param attributes - additional attributes.\r\n */\r\n public static createText(\r\n attributes?: Array<[string, string]>,\r\n ): SVGTextElement {\r\n const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');\r\n text.setAttribute('x', '0');\r\n text.setAttribute('y', '0');\r\n\r\n if (attributes) {\r\n SvgHelper.setAttributes(text, attributes);\r\n }\r\n\r\n return text;\r\n }\r\n\r\n /**\r\n * Creates an SVG TSpan.\r\n * @param text - inner text.\r\n * @param attributes - additional attributes.\r\n */\r\n public static createTSpan(\r\n text: string,\r\n attributes?: Array<[string, string]>,\r\n ): SVGTSpanElement {\r\n const tspan = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'tspan',\r\n );\r\n tspan.textContent = text;\r\n\r\n if (attributes) {\r\n SvgHelper.setAttributes(tspan, attributes);\r\n }\r\n\r\n return tspan;\r\n }\r\n\r\n /**\r\n * Creates an SVG image element.\r\n * @param attributes - additional attributes.\r\n */\r\n public static createImage(\r\n attributes?: Array<[string, string]>,\r\n ): SVGImageElement {\r\n const image = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'image',\r\n );\r\n\r\n if (attributes) {\r\n SvgHelper.setAttributes(image, attributes);\r\n }\r\n\r\n return image;\r\n }\r\n\r\n /**\r\n * Creates an SVG point with the specified coordinates.\r\n * @param x\r\n * @param y\r\n */\r\n public static createPoint(x: number, y: number): SVGPoint {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n const svgPoint = svg.createSVGPoint();\r\n svgPoint.x = x;\r\n svgPoint.y = y;\r\n\r\n return svgPoint;\r\n }\r\n\r\n /**\r\n * Creates an SVG path with the specified shape (d).\r\n * @param d - path shape\r\n * @param attributes - additional attributes.\r\n */\r\n public static createPath(\r\n d: string,\r\n attributes?: Array<[string, string]>,\r\n ): SVGPathElement {\r\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\r\n\r\n path.setAttribute('d', d);\r\n if (attributes) {\r\n SvgHelper.setAttributes(path, attributes);\r\n }\r\n\r\n return path;\r\n }\r\n\r\n /**\r\n * Creates an SVG text element.\r\n * @param attributes - additional attributes.\r\n */\r\n public static createForeignObject(\r\n attributes?: Array<[string, string]>,\r\n ): SVGForeignObjectElement {\r\n const obj = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'foreignObject',\r\n );\r\n obj.setAttribute('x', '0');\r\n obj.setAttribute('y', '0');\r\n\r\n if (attributes) {\r\n SvgHelper.setAttributes(obj, attributes);\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n /**\r\n * Returns local coordinates relative to the provided `localRoot` of a client (screen) point.\r\n * @param localRoot relative coordinate root\r\n * @param x horizontal client coordinate\r\n * @param y vertical client coordinate\r\n * @param zoomLevel zoom level\r\n * @returns local coordinates relative to `localRoot`\r\n */\r\n public static clientToLocalCoordinates(\r\n localRoot: SVGElement | undefined,\r\n x: number,\r\n y: number,\r\n zoomLevel = 1,\r\n ): IPoint {\r\n if (localRoot) {\r\n const clientRect = localRoot.getBoundingClientRect();\r\n return {\r\n x: (x - clientRect.left) / zoomLevel,\r\n y: (y - clientRect.top) / zoomLevel,\r\n };\r\n } else {\r\n return { x: x, y: y };\r\n }\r\n }\r\n\r\n /**\r\n * Creates an SVG image element from a supplied inner SVG markup string.\r\n * @param stringSvg SVG markup (without the root svg tags)\r\n * @returns SVG image element\r\n */\r\n public static createSvgFromString(stringSvg: string): SVGSVGElement {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.innerHTML = stringSvg;\r\n\r\n return svg;\r\n }\r\n\r\n /**\r\n * Creates an SVG filter element.\r\n * @param id filter id\r\n * @param attributes other filter element attributes\r\n * @param innerHTML filter definition as string\r\n * @returns filter element\r\n */\r\n public static createFilter(\r\n id: string,\r\n attributes?: Array<[string, string]>,\r\n innerHTML?: string,\r\n ): SVGFilterElement {\r\n const filter = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'filter',\r\n );\r\n filter.id = id;\r\n if (attributes) {\r\n SvgHelper.setAttributes(filter, attributes);\r\n }\r\n if (innerHTML) {\r\n filter.innerHTML = innerHTML;\r\n }\r\n return filter;\r\n }\r\n}\r\n","/**\r\n * Manages commercial licenses.\r\n * @ignore\r\n */\r\nexport class Activator {\r\n private static keys: Map<string, string> = new Map<string, string>();\r\n private static keyAddListeners: Array<() => void> = new Array<() => void>();\r\n\r\n /**\r\n * Add a license key\r\n * @param product product identifier.\r\n * @param key license key sent to you after purchase.\r\n */\r\n public static addKey(product: string, key: string): void {\r\n Activator.keys.set(product, key);\r\n Activator.keyAddListeners.forEach((listener) => {\r\n listener();\r\n });\r\n }\r\n\r\n /**\r\n * Add a function to be called when license key is added.\r\n * @param listener\r\n */\r\n public static addKeyAddListener(listener: () => void) {\r\n Activator.keyAddListeners.push(listener);\r\n }\r\n\r\n /**\r\n * Remove a function called when key is added.\r\n * @param listener\r\n */\r\n public static removeKeyAddListener(listener: () => void) {\r\n const li = Activator.keyAddListeners.indexOf(listener);\r\n if (li > -1) {\r\n Activator.keyAddListeners.splice(li, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if the product is commercially licensed.\r\n * @param product product identifier.\r\n */\r\n public static isLicensed(product: string): boolean {\r\n // NOTE:\r\n // before removing or modifying this please consider supporting marker.js development\r\n // by visiting https://markerjs.com/ for details\r\n // thank you!\r\n if (Activator.keys.has(product)) {\r\n const keyRegex = new RegExp(\r\n `${product}-[A-Z][0-9]{3}-[A-Z][0-9]{3}-[0-9]{4}`,\r\n 'i',\r\n );\r\n const key = Activator.keys.get(product);\r\n return key === undefined ? false : keyRegex.test(key);\r\n } else {\r\n return false;\r\n }\r\n }\r\n}\r\n","import { ISize } from './ISize';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\n\r\n/**\r\n * Represents a stage in a marker's lifecycle.\r\n *\r\n * Most markers are created immediately after the user clicks on the canvas.\r\n * However, some markers are only finished creating after additional interactions.\r\n */\r\nexport type MarkerStage = 'creating' | 'normal';\r\n\r\n/**\r\n * Base class for all markers.\r\n *\r\n * When creating custom marker types usually you will want to extend one of the derived classes.\r\n * However, if you cannot find a suitable base class, you can and you should extend this class.\r\n *\r\n * @summary Base class for all markers.\r\n * @group Markers\r\n */\r\nexport class MarkerBase {\r\n /**\r\n * Marker type name.\r\n *\r\n * It's important to set this in each derived class. This value is used to identify marker types\r\n * when restoring marker state and other scenarios.\r\n */\r\n public static typeName = 'MarkerBase';\r\n\r\n /**\r\n * Returns marker type name for the object instance.\r\n */\r\n public get typeName(): string {\r\n return Object.getPrototypeOf(this).constructor.typeName;\r\n }\r\n\r\n /**\r\n * Marker type title (display name) used for accessibility and other attributes.\r\n */\r\n public static title: string;\r\n\r\n /**\r\n * When true, the default filter is applied to the marker's visual.\r\n *\r\n * @since 3.2.0\r\n */\r\n public static applyDefaultFilter: boolean = true;\r\n\r\n /**\r\n * SVG container object holding the marker's visual.\r\n *\r\n * It is created and passed to the constructor by marker editor or viewer when creating the marker.\r\n */\r\n protected _container: SVGGElement;\r\n /**\r\n * SVG container object holding the marker's visual.\r\n */\r\n /**\r\n * SVG container object holding the marker's visual.\r\n */\r\n public get container(): SVGGElement {\r\n return this._container;\r\n }\r\n\r\n /**\r\n * Additional information about the marker.\r\n *\r\n * Generally, this isn't used for anything functional.\r\n * However, in a derived type it could be used for storing arbitrary data with no need to create extra properties and state types.\r\n */\r\n public notes?: string;\r\n\r\n /**\r\n * The default marker size when the marker is created with a click (without dragging).\r\n */\r\n public defaultSize: ISize = { width: 50, height: 20 };\r\n\r\n /**\r\n * Marker lifecycle stage.\r\n *\r\n * Most markers are created immediately after the user clicks on the canvas (`normal`).\r\n * However, some markers are only finished creating after additional interactions (`creating`).\r\n */\r\n public stage: MarkerStage = 'normal';\r\n\r\n /**\r\n * Stroke (outline) color of the marker.\r\n */\r\n protected _strokeColor = 'transparent';\r\n /**\r\n * Stroke (outline) color of the marker.\r\n *\r\n * In a derived class override {@link applyStrokeColor} to apply the color to the marker's visual.\r\n */\r\n public get strokeColor() {\r\n return this._strokeColor;\r\n }\r\n public set strokeColor(color: string) {\r\n this._strokeColor = color;\r\n this.applyStrokeColor();\r\n }\r\n /**\r\n * Applies the stroke color to the marker's visual.\r\n *\r\n * Override this method in a derived class to apply the color to the marker's visual.\r\n */\r\n protected applyStrokeColor() {}\r\n\r\n /**\r\n * Fill color of the marker.\r\n */\r\n protected _fillColor = 'transparent';\r\n /**\r\n * Fill color of the marker.\r\n *\r\n * In a derived class override {@link applyFillColor} to apply the color to the marker's visual.\r\n */\r\n public get fillColor() {\r\n return this._fillColor;\r\n }\r\n public set fillColor(color: string) {\r\n this._fillColor = color;\r\n this.applyFillColor();\r\n }\r\n /**\r\n * Applies the fill color to the marker's visual.\r\n *\r\n * Override this method in a derived class to apply the color to the marker's visual.\r\n */\r\n protected applyFillColor() {}\r\n\r\n /**\r\n * Stroke (outline) width of the marker.\r\n */\r\n protected _strokeWidth = 0;\r\n /**\r\n * Stroke (outline) width of the marker.\r\n *\r\n * In a derived class override {@link applyStrokeWidth} to apply the width to the marker's visual.\r\n */\r\n public get strokeWidth() {\r\n return this._strokeWidth;\r\n }\r\n public set strokeWidth(value) {\r\n this._strokeWidth = value;\r\n this.applyStrokeWidth();\r\n }\r\n /**\r\n * Applies the stroke width to the marker's visual.\r\n *\r\n * Override this method in a derived class to apply the width to the marker's visual.\r\n */\r\n protected applyStrokeWidth() {}\r\n\r\n /**\r\n * Stroke (outline) dash array of the marker.\r\n */\r\n protected _strokeDasharray = '';\r\n /**\r\n * Stroke (outline) dash array of the marker.\r\n *\r\n * In a derived class override {@link applyStrokeDasharray} to apply the dash array to the marker's visual.\r\n */\r\n public get strokeDasharray() {\r\n return this._strokeDasharray;\r\n }\r\n public set strokeDasharray(value) {\r\n this._strokeDasharray = value;\r\n this.applyStrokeDasharray();\r\n }\r\n /**\r\n * Applies the stroke dash array to the marker's visual.\r\n *\r\n * Override this method in a derived class to apply the dash array to the marker's visual.\r\n */\r\n protected applyStrokeDasharray() {}\r\n\r\n /**\r\n * Opacity of the marker.\r\n */\r\n protected _opacity = 1;\r\n /**\r\n * Opacity of the marker.\r\n *\r\n * In a derived class override {@link applyOpacity} to apply the opacity to the marker's visual.\r\n */\r\n public get opacity() {\r\n return this._opacity;\r\n }\r\n public set opacity(value) {\r\n this._opacity = value;\r\n this.applyOpacity();\r\n }\r\n /**\r\n * Applies the opacity to the marker's visual.\r\n *\r\n * Override this method in a derived class to apply the opacity to the marker's visual\r\n */\r\n protected applyOpacity() {}\r\n\r\n /**\r\n * Creates a new marker object.\r\n *\r\n * @param container - SVG container object holding the marker's visual.\r\n */\r\n constructor(container: SVGGElement) {\r\n this._container = container;\r\n\r\n this.applyFillColor = this.applyFillColor.bind(this);\r\n this.applyStrokeColor = this.applyStrokeColor.bind(this);\r\n this.applyStrokeWidth = this.applyStrokeWidth.bind(this);\r\n this.applyStrokeDasharray = this.applyStrokeDasharray.bind(this);\r\n this.applyOpacity = this.applyOpacity.bind(this);\r\n this.getBBox = this.getBBox.bind(this);\r\n }\r\n\r\n /**\r\n * Returns true if passed SVG element belongs to the marker. False otherwise.\r\n *\r\n * @param el - target element.\r\n * @returns true if the element belongs to the marker.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public ownsTarget(el: EventTarget): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Disposes the marker and cleans up.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n public dispose(): void {}\r\n\r\n protected addMarkerVisualToContainer(element: SVGElement): void {\r\n if (this.container.childNodes.length > 0) {\r\n this.container.insertBefore(element, this.container.childNodes[0]);\r\n } else {\r\n this.container.appendChild(element);\r\n }\r\n }\r\n\r\n /**\r\n * When overridden in a derived class, represents a preliminary outline for markers that can be displayed before the marker is actually created.\r\n * @returns SVG path string.\r\n */\r\n public getOutline(): string {\r\n return '';\r\n }\r\n\r\n /**\r\n * Returns current marker state that can be restored in the future.\r\n */\r\n public getState(): MarkerBaseState {\r\n return {\r\n typeName: Object.getPrototypeOf(this).constructor.typeName,\r\n notes: this.notes,\r\n strokeColor: this._strokeColor,\r\n strokeWidth: this._strokeWidth,\r\n strokeDasharray: this._strokeDasharray,\r\n opacity: this._opacity,\r\n };\r\n }\r\n\r\n /**\r\n * Restores previously saved marker state.\r\n *\r\n * @param state - previously saved state.\r\n */\r\n public restoreState(state: MarkerBaseState): void {\r\n this.notes = state.notes;\r\n this._strokeColor = state.strokeColor ?? this._strokeColor;\r\n this._strokeWidth = state.strokeWidth ?? this._strokeWidth;\r\n this._strokeDasharray = state.strokeDasharray ?? this._strokeDasharray;\r\n this._opacity = state.opacity ?? this._opacity;\r\n }\r\n\r\n /**\r\n * Scales marker. Used after resize.\r\n *\r\n * @param scaleX - horizontal scale\r\n * @param scaleY - vertical scale\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars\r\n public scale(scaleX: number, scaleY: number): void {}\r\n\r\n /**\r\n * Returns markers bounding box.\r\n *\r\n * Override to return a custom bounding box.\r\n *\r\n * @returns rectangle fitting the marker.\r\n */\r\n public getBBox(): DOMRect {\r\n return this.container.getBBox();\r\n }\r\n}\r\n","/**\r\n * Represents a simplified version of the SVGMatrix.\r\n */\r\nexport interface ITransformMatrix {\r\n a: number;\r\n b: number;\r\n c: number;\r\n d: number;\r\n e: number;\r\n f: number;\r\n}\r\n\r\n/**\r\n * A utility class to transform between SVGMatrix and its simplified representation.\r\n */\r\nexport class TransformMatrix {\r\n public static toITransformMatrix(matrix: SVGMatrix): ITransformMatrix {\r\n return {\r\n a: matrix.a,\r\n b: matrix.b,\r\n c: matrix.c,\r\n d: matrix.d,\r\n e: matrix.e,\r\n f: matrix.f,\r\n };\r\n }\r\n public static toSVGMatrix(\r\n currentMatrix: SVGMatrix,\r\n newMatrix: ITransformMatrix,\r\n ): SVGMatrix {\r\n currentMatrix.a = newMatrix.a;\r\n currentMatrix.b = newMatrix.b;\r\n currentMatrix.c = newMatrix.c;\r\n currentMatrix.d = newMatrix.d;\r\n currentMatrix.e = newMatrix.e;\r\n currentMatrix.f = newMatrix.f;\r\n return currentMatrix;\r\n }\r\n}\r\n","import { IPoint } from './IPoint';\r\nimport { MarkerBase } from './MarkerBase';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { RectangularBoxMarkerBaseState } from './RectangularBoxMarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\nimport { TransformMatrix } from './TransformMatrix';\r\n\r\n/**\r\n * RectangularBoxMarkerBase is a base class for all marker's that conceptually fit into a rectangle\r\n * such as all rectangle markers, ellipse, text and callout markers.\r\n *\r\n * @summary Base class for all markers that conceptually fit into a rectangle.\r\n * @group Markers\r\n */\r\nexport class RectangularBoxMarkerBase extends MarkerBase {\r\n /**\r\n * x coordinate of the top-left corner.\r\n */\r\n public left = 0;\r\n /**\r\n * y coordinate of the top-left corner.\r\n */\r\n public top = 0;\r\n /**\r\n * Marker width.\r\n */\r\n public width = 0;\r\n /**\r\n * Marker height.\r\n */\r\n public height = 0;\r\n\r\n /**\r\n * Marker's rotation angle.\r\n */\r\n public rotationAngle = 0;\r\n\r\n /**\r\n * x coordinate of the marker's center.\r\n */\r\n public get centerX(): number {\r\n return this.left + this.width / 2;\r\n }\r\n /**\r\n * y coordinate of the marker's center.\r\n */\r\n public get centerY(): number {\r\n return this.top + this.height / 2;\r\n }\r\n\r\n private _visual?: SVGGraphicsElement;\r\n /**\r\n * Container for the marker's visual.\r\n */\r\n protected get visual(): SVGGraphicsElement | undefined {\r\n return this._visual;\r\n }\r\n protected set visual(value: SVGGraphicsElement) {\r\n this._visual = value;\r\n const translate = SvgHelper.createTransform();\r\n this._visual.transform.baseVal.appendItem(translate);\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.rotatePoint = this.rotatePoint.bind(this);\r\n this.unrotatePoint = this.unrotatePoint.bind(this);\r\n\r\n // add rotation transform\r\n this.container.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n }\r\n\r\n /**\r\n * Moves visual to the specified coordinates.\r\n * @param point - coordinates of the new top-left corner of the visual.\r\n */\r\n public moveVisual(point: IPoint): void {\r\n if (this.visual) {\r\n this.visual.style.transform = `translate(${point.x}px, ${point.y}px)`;\r\n }\r\n }\r\n\r\n /**\r\n * Adjusts marker's size.\r\n */\r\n public setSize(): void {\r\n this.moveVisual({ x: this.left, y: this.top });\r\n }\r\n\r\n /**\r\n * Rotates marker around the center.\r\n * @param point - coordinates of the rotation point.\r\n */\r\n public rotate(point: IPoint) {\r\n // avoid glitch when crossing the 0 rotation point\r\n if (Math.abs(point.x - this.centerX) > 0.1) {\r\n const sign = Math.sign(point.x - this.centerX);\r\n this.rotationAngle =\r\n (Math.atan((point.y - this.centerY) / (point.x - this.centerX)) * 180) /\r\n Math.PI +\r\n 90 * sign;\r\n this.applyRotation();\r\n }\r\n }\r\n\r\n private applyRotation() {\r\n const rotate = this.container.transform.baseVal.getItem(0);\r\n rotate.setRotate(this.rotationAngle, this.centerX, this.centerY);\r\n this.container.transform.baseVal.replaceItem(rotate, 0);\r\n }\r\n\r\n /**\r\n * Returns point coordinates based on the actual screen coordinates and marker's rotation.\r\n * @param point - original pointer coordinates\r\n */\r\n public rotatePoint(point: IPoint): IPoint {\r\n if (this.rotationAngle === 0) {\r\n return point;\r\n }\r\n\r\n const matrix = this.container.getCTM();\r\n if (matrix === null) {\r\n return point;\r\n }\r\n let svgPoint = SvgHelper.createPoint(point.x, point.y);\r\n svgPoint = svgPoint.matrixTransform(matrix);\r\n\r\n const result = { x: svgPoint.x, y: svgPoint.y };\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns original point coordinates based on coordinates with rotation applied.\r\n * @param point - rotated point coordinates.\r\n */\r\n public unrotatePoint(point: IPoint): IPoint {\r\n if (this.rotationAngle === 0) {\r\n return point;\r\n }\r\n\r\n let matrix = this.container.getCTM();\r\n if (matrix === null) {\r\n return point;\r\n }\r\n matrix = matrix.inverse();\r\n let svgPoint = SvgHelper.createPoint(point.x, point.y);\r\n svgPoint = svgPoint.matrixTransform(matrix);\r\n\r\n const result = { x: svgPoint.x, y: svgPoint.y };\r\n\r\n return result;\r\n }\r\n\r\n public getOutline(): string {\r\n const result = `M 0 0 \r\n H ${this.defaultSize} \r\n V ${this.defaultSize} \r\n H 0 \r\n V 0 Z`;\r\n\r\n return result;\r\n }\r\n\r\n public getState(): RectangularBoxMarkerBaseState {\r\n const result: RectangularBoxMarkerBaseState = Object.assign(\r\n {\r\n left: this.left,\r\n top: this.top,\r\n width: this.width,\r\n height: this.height,\r\n rotationAngle: this.rotationAngle,\r\n visualTransformMatrix: TransformMatrix.toITransformMatrix(\r\n this.visual!.transform.baseVal.getItem(0).matrix,\r\n ),\r\n containerTransformMatrix: TransformMatrix.toITransformMatrix(\r\n this.container.transform.baseVal.getItem(0).matrix,\r\n ),\r\n },\r\n super.getState(),\r\n );\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n super.restoreState(state);\r\n const rbmState = state as RectangularBoxMarkerBaseState;\r\n this.left = rbmState.left;\r\n this.top = rbmState.top;\r\n this.width = rbmState.width;\r\n this.height = rbmState.height;\r\n this.rotationAngle = rbmState.rotationAngle;\r\n\r\n this.moveVisual({ x: this.left, y: this.top });\r\n\r\n if (rbmState.visualTransformMatrix && rbmState.containerTransformMatrix) {\r\n this.visual!.transform.baseVal.getItem(0).setMatrix(\r\n TransformMatrix.toSVGMatrix(\r\n this.visual!.transform.baseVal.getItem(0).matrix,\r\n rbmState.visualTransformMatrix,\r\n ),\r\n );\r\n this.container.transform.baseVal\r\n .getItem(0)\r\n .setMatrix(\r\n TransformMatrix.toSVGMatrix(\r\n this.container.transform.baseVal.getItem(0).matrix,\r\n rbmState.containerTransformMatrix,\r\n ),\r\n );\r\n } else {\r\n this.applyRotation();\r\n }\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n const rPoint = this.rotatePoint({ x: this.left, y: this.top });\r\n const point = this.unrotatePoint({\r\n x: rPoint.x * scaleX,\r\n y: rPoint.y * scaleY,\r\n });\r\n\r\n this.left = point.x;\r\n this.top = point.y;\r\n this.width = this.width * scaleX;\r\n this.height = this.height * scaleY;\r\n }\r\n\r\n public getBBox(): DOMRect {\r\n const rotatedTL = this.rotatePoint({ x: this.left, y: this.top });\r\n const rotatedTR = this.rotatePoint({\r\n x: this.left + this.width,\r\n y: this.top,\r\n });\r\n const rotatedBL = this.rotatePoint({\r\n x: this.left,\r\n y: this.top + this.height,\r\n });\r\n const rotatedBR = this.rotatePoint({\r\n x: this.left + this.width,\r\n y: this.top + this.height,\r\n });\r\n const absTL = {\r\n x: Math.min(rotatedTL.x, rotatedTR.x, rotatedBL.x, rotatedBR.x),\r\n y: Math.min(rotatedTL.y, rotatedTR.y, rotatedBL.y, rotatedBR.y),\r\n };\r\n const absBR = {\r\n x: Math.max(rotatedTL.x, rotatedTR.x, rotatedBL.x, rotatedBR.x),\r\n y: Math.max(rotatedTL.y, rotatedTR.y, rotatedBL.y, rotatedBR.y),\r\n };\r\n return new DOMRect(absTL.x, absTL.y, absBR.x - absTL.x, absBR.y - absTL.y);\r\n }\r\n}\r\n","import { MarkerBaseState } from './MarkerBaseState';\r\nimport { RectangularBoxMarkerBase } from './RectangularBoxMarkerBase';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\n/**\r\n * Shape outline marker is a base class for all markers that represent a shape outline.\r\n *\r\n * @summary Base class for shape outline (unfilled shape) markers.\r\n * @group Markers\r\n */\r\nexport class ShapeOutlineMarkerBase extends RectangularBoxMarkerBase {\r\n public static title = 'Shape outline marker';\r\n\r\n protected applyStrokeColor() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [['stroke', this._strokeColor]]);\r\n }\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeDasharray() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || el === this.visual) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n protected getPath(\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n width: number = this.width,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n height: number = this.height,\r\n ): string {\r\n return 'M0,0';\r\n }\r\n\r\n public getOutline(): string {\r\n return this.getPath(this.defaultSize.width, this.defaultSize.height);\r\n }\r\n\r\n /**\r\n * Creates marker's visual.\r\n */\r\n public createVisual(): void {\r\n this.visual = SvgHelper.createPath(this.getPath(), [\r\n ['fill', 'transparent'],\r\n ['stroke', this._strokeColor],\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n this.addMarkerVisualToContainer(this.visual);\r\n }\r\n\r\n /**\r\n * Adjusts marker's visual according to the current state\r\n * (color, width, etc.).\r\n */\r\n public adjustVisual(): void {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['d', this.getPath()],\r\n ['fill', 'transparent'],\r\n ['stroke', this._strokeColor],\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n public setSize(): void {\r\n super.setSize();\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [['d', this.getPath()]]);\r\n }\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n this.createVisual();\r\n super.restoreState(state);\r\n this.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.strokeWidth *= (scaleX + scaleY) / 2;\r\n\r\n this.setSize();\r\n }\r\n}\r\n","import { MarkerBaseState } from './MarkerBaseState';\r\nimport { ShapeOutlineMarkerBase } from './ShapeOutlineMarkerBase';\r\nimport { ShapeMarkerBaseState } from './ShapeMarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\n/**\r\n * Base class for filled shape markers.\r\n *\r\n * @summary Base class for filled shape markers.\r\n * @group Markers\r\n */\r\nexport abstract class ShapeMarkerBase extends ShapeOutlineMarkerBase {\r\n public static title = 'Shape marker';\r\n\r\n /**\r\n * Marker's fill color.\r\n */\r\n protected _fillColor = 'transparent';\r\n /**\r\n * Applies the fill color to the marker's visual.\r\n *\r\n * If needed, override this method in a derived class to apply the color to the marker's visual.\r\n */\r\n protected applyFillColor() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [['fill', this._fillColor]]);\r\n }\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n }\r\n\r\n public createVisual(): void {\r\n super.createVisual();\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [['fill', this._fillColor]]);\r\n }\r\n }\r\n\r\n public getState(): ShapeMarkerBaseState {\r\n const result: ShapeMarkerBaseState = Object.assign(\r\n {\r\n fillColor: this._fillColor,\r\n },\r\n super.getState(),\r\n );\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n const rectState = state as ShapeMarkerBaseState;\r\n super.restoreState(state);\r\n\r\n this.fillColor = rectState.fillColor;\r\n\r\n this.setSize();\r\n }\r\n}\r\n","import { ShapeOutlineMarkerBase } from './ShapeOutlineMarkerBase';\r\n\r\n/**\r\n * Frame marker represents unfilled rectangle shape.\r\n *\r\n * @summary Unfilled rectangle marker.\r\n * @group Markers\r\n */\r\nexport class FrameMarker extends ShapeOutlineMarkerBase {\r\n public static typeName = 'FrameMarker';\r\n public static title = 'Frame marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.strokeColor = '#ff0000';\r\n this.strokeWidth = 3;\r\n }\r\n\r\n protected getPath(\r\n width: number = this.width,\r\n height: number = this.height,\r\n ): string {\r\n const result = `M 0 0 \r\n H ${width} \r\n V ${height} \r\n H 0 \r\n V 0 Z`;\r\n\r\n return result;\r\n }\r\n}\r\n","import { LinearMarkerBaseState } from './LinearMarkerBaseState';\r\nimport { MarkerBase } from './MarkerBase';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\n/**\r\n * Base class for line-like markers.\r\n *\r\n * Use one of the derived classes.\r\n *\r\n * @summary Base class for line-like markers.\r\n * @group Markers\r\n */\r\nexport class LinearMarkerBase extends MarkerBase {\r\n /**\r\n * x coordinate of the first end-point\r\n */\r\n public x1 = 0;\r\n /**\r\n * y coordinate of the first end-point\r\n */\r\n public y1 = 0;\r\n /**\r\n * x coordinate of the second end-point\r\n */\r\n public x2 = 0;\r\n /**\r\n * y coordinate of the second end-point\r\n */\r\n public y2 = 0;\r\n\r\n /**\r\n * Marker's main visual.\r\n */\r\n protected visual: SVGGraphicsElement | undefined;\r\n\r\n /**\r\n * Wider invisible visual to make it easier to select and manipulate the marker.\r\n */\r\n protected selectorVisual: SVGGraphicsElement | undefined;\r\n /**\r\n * Visible visual of the marker.\r\n */\r\n protected visibleVisual: SVGGraphicsElement | undefined;\r\n /**\r\n * Line visual of the marker.\r\n */\r\n protected lineVisual: SVGGraphicsElement | undefined;\r\n /**\r\n * Start terminator (ending) visual of the marker.\r\n */\r\n protected startTerminatorVisual: SVGGraphicsElement | undefined;\r\n /**\r\n * End terminator (ending) visual of the marker.\r\n */\r\n protected endTerminatorVisual: SVGGraphicsElement | undefined;\r\n\r\n protected applyStrokeColor() {\r\n if (this.lineVisual) {\r\n SvgHelper.setAttributes(this.lineVisual, [['stroke', this._strokeColor]]);\r\n }\r\n if (this.startTerminatorVisual && this.endTerminatorVisual) {\r\n SvgHelper.setAttributes(this.startTerminatorVisual, [\r\n ['stroke', this._strokeColor],\r\n ['fill', this._strokeColor],\r\n ]);\r\n SvgHelper.setAttributes(this.endTerminatorVisual, [\r\n ['stroke', this._strokeColor],\r\n ['fill', this._strokeColor],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n if (this.lineVisual) {\r\n SvgHelper.setAttributes(this.lineVisual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n }\r\n if (this.selectorVisual) {\r\n SvgHelper.setAttributes(this.selectorVisual, [\r\n ['stroke-width', Math.max(this._strokeWidth, 8).toString()],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeDasharray() {\r\n if (this.lineVisual) {\r\n SvgHelper.setAttributes(this.lineVisual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n this.getState = this.getState.bind(this);\r\n this.restoreState = this.restoreState.bind(this);\r\n this.scale = this.scale.bind(this);\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (\r\n super.ownsTarget(el) ||\r\n el === this.visual ||\r\n el === this.selectorVisual ||\r\n el === this.visibleVisual ||\r\n el === this.lineVisual ||\r\n el === this.startTerminatorVisual ||\r\n el === this.endTerminatorVisual\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * The path representing the line part of the marker visual.\r\n *\r\n * When implemented in derived class should return SVG path for the marker.\r\n *\r\n * @returns SVG path for the marker.\r\n */\r\n protected getPath(): string {\r\n return 'M0,0';\r\n }\r\n\r\n /**\r\n * The path representing the start terminator (ending) part of the marker visual.\r\n * @returns SVG path\r\n */\r\n protected getStartTerminatorPath(): string {\r\n return '';\r\n }\r\n\r\n /**\r\n * The path representing the end terminator (ending) part of the marker visual.\r\n * @returns SVG path\r\n */\r\n protected getEndTerminatorPath(): string {\r\n return '';\r\n }\r\n\r\n /**\r\n * Creates marker's visual.\r\n */\r\n public createVisual(): void {\r\n this.visual = SvgHelper.createGroup();\r\n this.selectorVisual = SvgHelper.createPath(this.getPath(), [\r\n ['stroke', 'transparent'],\r\n ['fill', 'transparent'],\r\n ['stroke-width', Math.max(this.strokeWidth, 8).toString()],\r\n ]);\r\n\r\n this.visibleVisual = SvgHelper.createGroup();\r\n this.lineVisual = SvgHelper.createPath(this.getPath(), [\r\n ['stroke', this.strokeColor],\r\n ['fill', this.strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['stroke-linejoin', 'round'],\r\n ['stroke-dasharray', this.strokeDasharray.toString()],\r\n ['opacity', this.opacity.toString()],\r\n ]);\r\n this.startTerminatorVisual = SvgHelper.createPath(\r\n this.getStartTerminatorPath(),\r\n [\r\n ['stroke', this.strokeColor],\r\n ['fill', this.strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['stroke-linejoin', 'round'],\r\n ['opacity', this.opacity.toString()],\r\n ],\r\n );\r\n this.endTerminatorVisual = SvgHelper.createPath(\r\n this.getEndTerminatorPath(),\r\n [\r\n ['stroke', this.strokeColor],\r\n ['fill', this.strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['stroke-linejoin', 'round'],\r\n ['opacity', this.opacity.toString()],\r\n ],\r\n );\r\n\r\n this.visibleVisual.appendChild(this.lineVisual);\r\n this.visibleVisual.appendChild(this.startTerminatorVisual);\r\n this.visibleVisual.appendChild(this.endTerminatorVisual);\r\n\r\n this.visual.appendChild(this.selectorVisual);\r\n this.visual.appendChild(this.visibleVisual);\r\n\r\n this.addMarkerVisualToContainer(this.visual);\r\n }\r\n\r\n /**\r\n * Adjusts marker visual after manipulation when needed.\r\n */\r\n public adjustVisual(): void {\r\n if (\r\n this.selectorVisual &&\r\n this.lineVisual &&\r\n this.startTerminatorVisual &&\r\n this.endTerminatorVisual\r\n ) {\r\n SvgHelper.setAttributes(this.selectorVisual, [['d', this.getPath()]]);\r\n SvgHelper.setAttributes(this.lineVisual, [\r\n ['d', this.getPath()],\r\n ['stroke', this.strokeColor],\r\n ['fill', this.fillColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['stroke-dasharray', this.strokeDasharray.toString()],\r\n ['opacity', this.opacity.toString()],\r\n ]);\r\n SvgHelper.setAttributes(this.startTerminatorVisual, [\r\n ['d', this.getStartTerminatorPath()],\r\n ['stroke', this.strokeColor],\r\n ['fill', this.strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['opacity', this.opacity.toString()],\r\n ]);\r\n SvgHelper.setAttributes(this.endTerminatorVisual, [\r\n ['d', this.getEndTerminatorPath()],\r\n ['stroke', this.strokeColor],\r\n ['fill', this.strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['opacity', this.opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n public getState(): LinearMarkerBaseState {\r\n const result: LinearMarkerBaseState = Object.assign(\r\n {\r\n x1: this.x1,\r\n y1: this.y1,\r\n x2: this.x2,\r\n y2: this.y2,\r\n },\r\n super.getState(),\r\n );\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n super.restoreState(state);\r\n\r\n const lmbState = state as LinearMarkerBaseState;\r\n this.x1 = lmbState.x1;\r\n this.y1 = lmbState.y1;\r\n this.x2 = lmbState.x2;\r\n this.y2 = lmbState.y2;\r\n\r\n this.createVisual();\r\n this.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.x1 = this.x1 * scaleX;\r\n this.y1 = this.y1 * scaleY;\r\n this.x2 = this.x2 * scaleX;\r\n this.y2 = this.y2 * scaleY;\r\n\r\n this.strokeWidth *= (scaleX + scaleY) / 2;\r\n\r\n this.adjustVisual();\r\n }\r\n}\r\n","import { LinearMarkerBase } from './LinearMarkerBase';\r\n\r\n/**\r\n * Line marker represents a simple straight line.\r\n *\r\n * @summary Line marker.\r\n * @group Markers\r\n */\r\nexport class LineMarker extends LinearMarkerBase {\r\n public static typeName = 'LineMarker';\r\n public static title = 'Line marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.strokeColor = '#ff0000';\r\n this.strokeWidth = 3;\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n }\r\n\r\n protected getPath(): string {\r\n // svg path for line\r\n const result = `M ${this.x1} ${this.y1} L ${this.x2} ${this.y2}`;\r\n\r\n return result;\r\n }\r\n}\r\n","import { ArrowMarkerState, ArrowType } from './ArrowMarkerState';\r\nimport { IPoint } from './IPoint';\r\nimport { LineMarker } from './LineMarker';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\n\r\n/**\r\n * Arrow marker represents a line with arrow heads at the ends.\r\n *\r\n * @summary A line with arrow heads at the ends.\r\n *\r\n * @group Markers\r\n */\r\nexport class ArrowMarker extends LineMarker {\r\n public static typeName = 'ArrowMarker';\r\n public static title = 'Arrow marker';\r\n\r\n private _arrowType: ArrowType = 'end';\r\n /**\r\n * Type of the arrow.\r\n *\r\n * Specify whether the arrow should be drawn at the start, end, both ends or none.\r\n */\r\n public get arrowType(): ArrowType {\r\n return this._arrowType;\r\n }\r\n public set arrowType(value: ArrowType) {\r\n this._arrowType = value;\r\n this.adjustVisual();\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.getArrowProperties = this.getArrowProperties.bind(this);\r\n this.getStartTerminatorPath = this.getStartTerminatorPath.bind(this);\r\n this.getEndTerminatorPath = this.getEndTerminatorPath.bind(this);\r\n }\r\n\r\n private getArrowProperties() {\r\n const arrowHeight = 10 + this.strokeWidth * 2;\r\n const arrowWidth = Math.min(\r\n Math.max(5, this.strokeWidth * 2),\r\n this.strokeWidth + 5,\r\n );\r\n const arrowDipFactor = 0.7; // arrow base \"bend factor\"\r\n\r\n const dx = this.x2 - this.x1;\r\n const dy = this.y2 - this.y1;\r\n const angle = Math.atan2(dy, dx);\r\n return { arrowHeight, arrowDipFactor, angle, arrowWidth };\r\n }\r\n\r\n protected getStartTerminatorPath(): string {\r\n const { arrowHeight, arrowDipFactor, angle, arrowWidth } =\r\n this.getArrowProperties();\r\n\r\n // Start arrow\r\n const startArrowBasePoint: IPoint = {\r\n x: this.x1 + arrowHeight * arrowDipFactor * Math.cos(angle),\r\n y: this.y1 + arrowHeight * arrowDipFactor * Math.sin(angle),\r\n };\r\n\r\n const startArrowTipBasePoint: IPoint = {\r\n x: this.x1 + arrowHeight * Math.cos(angle),\r\n y: this.y1 + arrowHeight * Math.sin(angle),\r\n };\r\n\r\n const startArrowSide1: IPoint = {\r\n x: startArrowTipBasePoint.x + arrowWidth * Math.sin(angle),\r\n y: startArrowTipBasePoint.y - arrowWidth * Math.cos(angle),\r\n };\r\n\r\n const startArrowSide2: IPoint = {\r\n x: startArrowTipBasePoint.x - arrowWidth * Math.sin(angle),\r\n y: startArrowTipBasePoint.y + arrowWidth * Math.cos(angle),\r\n };\r\n\r\n const startSegment =\r\n this.arrowType === 'start' || this.arrowType === 'both'\r\n ? `M ${startArrowBasePoint.x} ${startArrowBasePoint.y}\r\n L ${startArrowSide1.x} ${startArrowSide1.y} L ${this.x1} ${this.y1} L ${startArrowSide2.x} ${startArrowSide2.y} L ${startArrowBasePoint.x} ${startArrowBasePoint.y}\r\n L ${startArrowBasePoint.x} ${startArrowBasePoint.y}`\r\n : ``;\r\n\r\n return startSegment;\r\n }\r\n\r\n protected getEndTerminatorPath(): string {\r\n const { arrowHeight, arrowDipFactor, angle, arrowWidth } =\r\n this.getArrowProperties();\r\n\r\n // End arrow\r\n const endArrowBasePoint: IPoint = {\r\n x: this.x2 - arrowHeight * arrowDipFactor * Math.cos(angle),\r\n y: this.y2 - arrowHeight * arrowDipFactor * Math.sin(angle),\r\n };\r\n\r\n const endArrowTipBasePoint: IPoint = {\r\n x: this.x2 - arrowHeight * Math.cos(angle),\r\n y: this.y2 - arrowHeight * Math.sin(angle),\r\n };\r\n\r\n const endArrowSide1: IPoint = {\r\n x: endArrowTipBasePoint.x + arrowWidth * Math.sin(angle),\r\n y: endArrowTipBasePoint.y - arrowWidth * Math.cos(angle),\r\n };\r\n\r\n const endArrowSide2: IPoint = {\r\n x: endArrowTipBasePoint.x - arrowWidth * Math.sin(angle),\r\n y: endArrowTipBasePoint.y + arrowWidth * Math.cos(angle),\r\n };\r\n\r\n const endSegment =\r\n this.arrowType === 'end' || this.arrowType === 'both'\r\n ? `M ${endArrowBasePoint.x} ${endArrowBasePoint.y} \r\n L ${endArrowSide1.x} ${endArrowSide1.y} L ${this.x2} ${this.y2} L ${endArrowSide2.x} ${endArrowSide2.y} L ${endArrowBasePoint.x} ${endArrowBasePoint.y} Z`\r\n : ``;\r\n\r\n return endSegment;\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n super.applyStrokeWidth();\r\n this.adjustVisual();\r\n }\r\n\r\n public getState(): ArrowMarkerState {\r\n const result: ArrowMarkerState = Object.assign(\r\n {\r\n arrowType: this.arrowType,\r\n },\r\n super.getState(),\r\n );\r\n result.typeName = ArrowMarker.typeName;\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n const arrowState = state as ArrowMarkerState;\r\n this.arrowType = arrowState.arrowType;\r\n\r\n super.restoreState(state);\r\n }\r\n}\r\n","import { IPoint } from './IPoint';\r\nimport { LineMarker } from './LineMarker';\r\n\r\n/**\r\n * Represents a measurement marker.\r\n *\r\n * Measurement marker is a line with two vertical bars at the ends.\r\n *\r\n * @summary A line with two vertical bars at the ends.\r\n * @group Markers\r\n */\r\nexport class MeasurementMarker extends LineMarker {\r\n public static typeName = 'MeasurementMarker';\r\n public static title = 'Measurement marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n }\r\n\r\n protected getStartTerminatorPath(): string {\r\n const { tipLength, angle } = this.getTerminatorProperties();\r\n\r\n const startArrowSide1: IPoint = {\r\n x: this.x1 + tipLength * Math.sin(angle),\r\n y: this.y1 - tipLength * Math.cos(angle),\r\n };\r\n\r\n const startArrowSide2: IPoint = {\r\n x: this.x1 - tipLength * Math.sin(angle),\r\n y: this.y1 + tipLength * Math.cos(angle),\r\n };\r\n\r\n const result = `M ${startArrowSide1.x} ${startArrowSide1.y}\r\n L ${startArrowSide2.x} ${startArrowSide2.y}`;\r\n\r\n return result;\r\n }\r\n\r\n protected getEndTerminatorPath(): string {\r\n const { tipLength, angle } = this.getTerminatorProperties();\r\n\r\n const endArrowSide1: IPoint = {\r\n x: this.x2 + tipLength * Math.sin(angle),\r\n y: this.y2 - tipLength * Math.cos(angle),\r\n };\r\n\r\n const endArrowSide2: IPoint = {\r\n x: this.x2 - tipLength * Math.sin(angle),\r\n y: this.y2 + tipLength * Math.cos(angle),\r\n };\r\n\r\n // svg path for the arrow\r\n const result = `M ${endArrowSide1.x} ${endArrowSide1.y} L ${endArrowSide2.x} ${endArrowSide2.y}`;\r\n\r\n return result;\r\n }\r\n\r\n private getTerminatorProperties() {\r\n const tipLength = 5 + this.strokeWidth * 3;\r\n\r\n const dx = this.x2 - this.x1;\r\n const dy = this.y2 - this.y1;\r\n const angle = Math.atan2(dy, dx);\r\n return { tipLength, angle };\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n super.applyStrokeWidth();\r\n this.adjustVisual();\r\n }\r\n}\r\n","import { IPoint } from './IPoint';\r\nimport { MarkerBase } from './MarkerBase';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { PolygonMarkerState } from './PolygonMarkerState';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\n/**\r\n * Polygon marker is a multi-point marker that represents a polygon.\r\n *\r\n * @summary Polygon marker.\r\n * @group Markers\r\n */\r\nexport class PolygonMarker extends MarkerBase {\r\n public static typeName = 'PolygonMarker';\r\n public static title = 'Polygon marker';\r\n\r\n /**\r\n * Marker's points.\r\n */\r\n public points: IPoint[] = [];\r\n\r\n /**\r\n * Marker's main visual.\r\n */\r\n public visual: SVGGraphicsElement | undefined;\r\n\r\n public selectorVisual: SVGGElement | undefined;\r\n public selectorVisualLines: SVGLineElement[] = [];\r\n public visibleVisual: SVGGraphicsElement | undefined;\r\n\r\n protected applyStrokeColor() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke', this._strokeColor],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyFillColor() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [['fill', this._fillColor]]);\r\n }\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n }\r\n if (this.selectorVisual) {\r\n SvgHelper.setAttributes(this.selectorVisual, [\r\n ['stroke-width', Math.max(this._strokeWidth, 8).toString()],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeDasharray() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.strokeColor = '#ff0000';\r\n this.strokeWidth = 3;\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n this.getState = this.getState.bind(this);\r\n this.restoreState = this.restoreState.bind(this);\r\n this.scale = this.scale.bind(this);\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (\r\n super.ownsTarget(el) ||\r\n el === this.visual ||\r\n el === this.selectorVisual ||\r\n el === this.visibleVisual ||\r\n this.selectorVisualLines.some((l) => l === el)\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Returns SVG path string for the polygon.\r\n *\r\n * @returns Path string for the polygon.\r\n */\r\n protected getPath(): string {\r\n if (this.points.length > 1) {\r\n return (\r\n this.points\r\n .map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x},${p.y}`)\r\n .join(' ') + (this.stage !== 'creating' ? ' Z' : '')\r\n );\r\n }\r\n return 'M0,0';\r\n }\r\n\r\n /**\r\n * Creates marker's main visual.\r\n */\r\n public createVisual(): void {\r\n this.visual = SvgHelper.createGroup();\r\n this.visibleVisual = SvgHelper.createPath(this.getPath(), [\r\n ['stroke', this.strokeColor],\r\n ['fill', this.fillColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['opacity', this.opacity.toString()],\r\n ]);\r\n this.visual.appendChild(this.visibleVisual);\r\n\r\n this.createSelectorVisual();\r\n\r\n this.addMarkerVisualToContainer(this.visual);\r\n }\r\n\r\n /**\r\n * Creates selector visual.\r\n *\r\n * Selector visual is a transparent wider visual that allows easier selection of the marker.\r\n */\r\n private createSelectorVisual() {\r\n if (this.visual) {\r\n this.selectorVisual = SvgHelper.createGroup();\r\n this.visual.appendChild(this.selectorVisual);\r\n\r\n this.points.forEach(() => {\r\n this.addSelectorLine();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Adjusts marker visual after manipulation when needed.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n public adjustVisual(): void {\r\n if (this.selectorVisual && this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['d', this.getPath()],\r\n ['stroke', this.strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['stroke-dasharray', this.strokeDasharray.toString()],\r\n ['fill', this.fillColor],\r\n ['opacity', this.opacity.toString()],\r\n ]);\r\n\r\n this.adjustSelectorVisual();\r\n }\r\n }\r\n\r\n private adjustSelectorVisual() {\r\n if (this.selectorVisual) {\r\n // adjust number of lines\r\n const missingLines = this.points.length - this.selectorVisualLines.length;\r\n if (missingLines > 0) {\r\n for (let i = 0; i < missingLines; i++) {\r\n this.addSelectorLine();\r\n }\r\n } else if (missingLines < 0) {\r\n for (let i = 0; i < -missingLines; i++) {\r\n this.selectorVisual!.removeChild(this.selectorVisualLines.pop()!);\r\n }\r\n }\r\n\r\n // adjust line coordinates\r\n this.selectorVisualLines.forEach((line, i) => {\r\n SvgHelper.setAttributes(line, [\r\n ['x1', this.points[i].x.toString()],\r\n ['y1', this.points[i].y.toString()],\r\n ['x2', this.points[(i + 1) % this.points.length].x.toString()],\r\n ['y2', this.points[(i + 1) % this.points.length].y.toString()],\r\n ]);\r\n });\r\n }\r\n }\r\n\r\n private addSelectorLine() {\r\n const line = SvgHelper.createLine(0, 0, 0, 0, [\r\n ['stroke', 'transparent'],\r\n ['stroke-width', Math.max(this.strokeWidth, 8).toString()],\r\n ]);\r\n this.selectorVisual!.appendChild(line);\r\n this.selectorVisualLines.push(line);\r\n }\r\n\r\n public getState(): PolygonMarkerState {\r\n const result: PolygonMarkerState = Object.assign(\r\n {\r\n points: this.points,\r\n },\r\n super.getState(),\r\n );\r\n result.typeName = PolygonMarker.typeName;\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n super.restoreState(state);\r\n\r\n const pmState = state as PolygonMarkerState;\r\n this.points = pmState.points;\r\n\r\n this.createVisual();\r\n this.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.points.forEach((p) => {\r\n p.x = p.x * scaleX;\r\n p.y = p.y * scaleY;\r\n });\r\n\r\n this.adjustVisual();\r\n }\r\n}\r\n","import { FreehandMarkerState } from './FreehandMarkerState';\r\nimport { IPoint } from './IPoint';\r\nimport { MarkerBase } from './MarkerBase';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\n/**\r\n * Freehand marker represents a hand drawing.\r\n *\r\n * Unlike v2 in v3 freehand marker is represented by an SVG path element.\r\n * This means that the line properties like stroke color, width, dasharray, etc.\r\n * can be modified after drawing.\r\n *\r\n * @summary Freehand drawing marker.\r\n * @group Markers\r\n */\r\nexport class FreehandMarker extends MarkerBase {\r\n public static typeName = 'FreehandMarker';\r\n public static title = 'Freehand marker';\r\n public static applyDefaultFilter = false;\r\n\r\n /**\r\n * Points of the freehand line.\r\n */\r\n public points: IPoint[] = [];\r\n\r\n /**\r\n * Marker's main visual.\r\n */\r\n public visual: SVGGraphicsElement | undefined;\r\n\r\n /**\r\n * Wider invisible visual to make it easier to select and manipulate the marker.\r\n */\r\n protected selectorVisual: SVGGraphicsElement | undefined;\r\n /**\r\n * Visible visual of the marker.\r\n */\r\n public visibleVisual: SVGGraphicsElement | undefined;\r\n\r\n protected applyStrokeColor() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke', this._strokeColor],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n }\r\n if (this.selectorVisual) {\r\n SvgHelper.setAttributes(this.selectorVisual, [\r\n ['stroke-width', Math.max(this._strokeWidth, 8).toString()],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeDasharray() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.strokeColor = '#ff0000';\r\n this.strokeWidth = 3;\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n this.getState = this.getState.bind(this);\r\n this.restoreState = this.restoreState.bind(this);\r\n this.scale = this.scale.bind(this);\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (\r\n super.ownsTarget(el) ||\r\n el === this.visual ||\r\n el === this.selectorVisual ||\r\n el === this.visibleVisual\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Returns SVG path string representing the freehand line.\r\n *\r\n * @returns SVG path string representing the freehand line.\r\n */\r\n protected getPath(): string {\r\n if (this.points.length > 1) {\r\n return this.points\r\n .map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x},${p.y}`)\r\n .join(' ');\r\n }\r\n return 'M0,0';\r\n }\r\n\r\n /**\r\n * Creates the visual elements comprising the marker's visual.\r\n */\r\n public createVisual(): void {\r\n this.visual = SvgHelper.createGroup();\r\n this.selectorVisual = SvgHelper.createPath(this.getPath(), [\r\n ['stroke', 'transparent'],\r\n ['fill', 'transparent'],\r\n ['stroke-width', Math.max(this.strokeWidth, 8).toString()],\r\n ]);\r\n this.visibleVisual = SvgHelper.createPath(this.getPath(), [\r\n ['stroke', this.strokeColor],\r\n ['fill', 'transparent'],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['opacity', this.opacity.toString()],\r\n ]);\r\n this.visual.appendChild(this.selectorVisual);\r\n this.visual.appendChild(this.visibleVisual);\r\n\r\n this.addMarkerVisualToContainer(this.visual);\r\n }\r\n\r\n /**\r\n * Adjusts marker visual after manipulation or with new points.\r\n */\r\n public adjustVisual(): void {\r\n if (this.selectorVisual && this.visibleVisual) {\r\n const path = this.getPath();\r\n SvgHelper.setAttributes(this.selectorVisual, [['d', path]]);\r\n SvgHelper.setAttributes(this.visibleVisual, [['d', path]]);\r\n\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke', this.strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['stroke-dasharray', this.strokeDasharray.toString()],\r\n ['stroke-dasharray', this.strokeDasharray.toString()],\r\n ['opacity', this.opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n public getState(): FreehandMarkerState {\r\n const result: FreehandMarkerState = Object.assign(\r\n {\r\n points: this.points,\r\n },\r\n super.getState(),\r\n );\r\n result.typeName = FreehandMarker.typeName;\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n super.restoreState(state);\r\n\r\n const pmState = state as FreehandMarkerState;\r\n this.points = pmState.points;\r\n\r\n this.createVisual();\r\n this.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.points.forEach((p) => {\r\n p.x = p.x * scaleX;\r\n p.y = p.y * scaleY;\r\n });\r\n\r\n this.adjustVisual();\r\n }\r\n}\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n function next() {\r\n while (env.stack.length) {\r\n var rec = env.stack.pop();\r\n try {\r\n var result = rec.dispose && rec.dispose.call(rec.value);\r\n if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n};\r\n","import { FontSize } from './FontSize';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\n/**\r\n * TextBlock represents a block of text used across all text-based markers.\r\n */\r\nexport class TextBlock {\r\n /**\r\n * Fired when text size changes.\r\n *\r\n * @group Events\r\n */\r\n public onTextSizeChanged?: (textBlock: TextBlock) => void;\r\n\r\n private _text = '';\r\n /**\r\n * Returns the text block's text.\r\n */\r\n public get text() {\r\n return this._text;\r\n }\r\n /**\r\n * Sets the text block's text.\r\n */\r\n public set text(value) {\r\n this._text = value;\r\n this.renderText();\r\n }\r\n\r\n /**\r\n * Text block's horizontal offset from the automatically calculated position.\r\n */\r\n public offsetX = 0;\r\n /**\r\n * Text block's vertical offset from the automatically calculated position.\r\n */\r\n public offsetY = 0;\r\n\r\n private _boundingBox: DOMRect = new DOMRect();\r\n /**\r\n * Returns the bounding box where text should fit and/or be anchored.\r\n */\r\n public get boundingBox(): DOMRect {\r\n return this._boundingBox;\r\n }\r\n /**\r\n * Sets the bounding box where text should fit and/or be anchored.\r\n */\r\n public set boundingBox(value: DOMRect) {\r\n this._boundingBox = value;\r\n this.renderText();\r\n //this.positionText();\r\n }\r\n\r\n private _labelBackground: SVGRectElement = SvgHelper.createRect(10, 10, [\r\n ['fill', 'white'],\r\n ]);\r\n /**\r\n * Returns the background rectangle (behind the text).\r\n */\r\n public get labelBackground(): SVGRectElement {\r\n return this._labelBackground;\r\n }\r\n\r\n private _textElement: SVGTextElement = SvgHelper.createText();\r\n /**\r\n * Returns the text block's text element.\r\n */\r\n public get textElement(): SVGTextElement {\r\n return this._textElement;\r\n }\r\n\r\n private _color = 'transparent';\r\n /**\r\n * Sets the text color.\r\n */\r\n public set color(value: string) {\r\n if (this.textElement) {\r\n SvgHelper.setAttributes(this._textElement, [['fill', value]]);\r\n }\r\n this._color = value;\r\n }\r\n /**\r\n * Returns the text color.\r\n */\r\n public get color(): string {\r\n return this._color;\r\n }\r\n\r\n private _fontFamily = '';\r\n /**\r\n * Returns the text's font family.\r\n */\r\n public get fontFamily() {\r\n return this._fontFamily;\r\n }\r\n /**\r\n * Sets the text's font family.\r\n */\r\n public set fontFamily(value) {\r\n if (this._textElement) {\r\n this._textElement.style.fontFamily = value;\r\n }\r\n this._fontFamily = value;\r\n this.positionText();\r\n }\r\n\r\n private _fontSize: FontSize = {\r\n value: 1,\r\n units: 'rem',\r\n step: 0.1,\r\n };\r\n /**\r\n * Returns the text's font size.\r\n */\r\n public get fontSize() {\r\n return this._fontSize;\r\n }\r\n /**\r\n * Sets the text's font size.\r\n */\r\n public set fontSize(value: FontSize) {\r\n if (this._textElement) {\r\n this._textElement.style.fontSize = `${value.value}${value.units}`;\r\n }\r\n this._fontSize = value;\r\n this.positionText();\r\n }\r\n\r\n /**\r\n * Creates a text block\r\n * @param text initial text\r\n */\r\n constructor(text?: string) {\r\n this.setupTextElement();\r\n\r\n if (text !== undefined) {\r\n this.text = text;\r\n }\r\n\r\n this.setupTextElement = this.setupTextElement.bind(this);\r\n this.renderText = this.renderText.bind(this);\r\n this.positionText = this.positionText.bind(this);\r\n this.ownsTarget = this.ownsTarget.bind(this);\r\n this.show = this.show.bind(this);\r\n this.hide = this.hide.bind(this);\r\n this.showControlBox = this.showControlBox.bind(this);\r\n this.hideControlBox = this.hideControlBox.bind(this);\r\n this.applyFontStyles = this.applyFontStyles.bind(this);\r\n this.wrapText = this.wrapText.bind(this);\r\n }\r\n\r\n /**\r\n * Returns true if the text block contains the supplied element.\r\n * @param el element to test.\r\n * @returns true if the element belongs to the text block, false otherwise.\r\n */\r\n public ownsTarget(el: EventTarget) {\r\n if (el === this._textElement) {\r\n return true;\r\n } else {\r\n let found = false;\r\n this._textElement.childNodes.forEach((span) => {\r\n if (span === el) {\r\n found = true;\r\n }\r\n });\r\n return found;\r\n }\r\n }\r\n\r\n private setupTextElement() {\r\n this._textElement.style.fontSize = `${this.fontSize.value}${this.fontSize.units}`;\r\n this._textElement.style.textAnchor = 'middle';\r\n this._textElement.style.userSelect = 'none';\r\n\r\n this._labelBackground.style.stroke = '#aaa';\r\n this._labelBackground.style.strokeDasharray = '2 2';\r\n this._labelBackground.style.strokeWidth = '1';\r\n this._labelBackground.style.strokeOpacity = '0';\r\n }\r\n\r\n private wrapText(): string {\r\n function getTextAspectRatio(textLines: string[]): number {\r\n const charsLinesAspectRatio = 0.35;\r\n\r\n let longestLineChars = textLines[0].length;\r\n textLines.forEach((line) => {\r\n if (line.length > longestLineChars) {\r\n longestLineChars = line.length;\r\n }\r\n });\r\n\r\n return (longestLineChars * charsLinesAspectRatio) / textLines.length;\r\n }\r\n\r\n if (this.text !== '') {\r\n const lines = this.text.split(/\\r\\n|[\\n\\v\\f\\r\\x85\\u2028\\u2029]/);\r\n const boxAspectRatio =\r\n (this.boundingBox.width * 1.0) / this.boundingBox.height;\r\n let processedLines = new Array<string>(...lines);\r\n\r\n let textAspectRatio = getTextAspectRatio(processedLines);\r\n\r\n let maxLineLength = Number.MAX_VALUE;\r\n while (textAspectRatio > boxAspectRatio) {\r\n let longestLine = processedLines[0];\r\n processedLines.forEach((line) => {\r\n if (line.length > longestLine.length) {\r\n longestLine = line;\r\n }\r\n });\r\n maxLineLength = longestLine.lastIndexOf(' ', maxLineLength - 1);\r\n\r\n if (maxLineLength > 0) {\r\n processedLines = [];\r\n lines.forEach((line) => {\r\n let reminderLine = line;\r\n while (reminderLine.length > maxLineLength) {\r\n let maxEnd = reminderLine.lastIndexOf(' ', maxLineLength);\r\n if (maxEnd < 0) {\r\n // if the first word is longer than max, at least wrap after it\r\n maxEnd = reminderLine.indexOf(' ');\r\n }\r\n if (maxEnd > 0) {\r\n processedLines.push(reminderLine.substring(0, maxEnd));\r\n reminderLine = reminderLine.substring(maxEnd).trim();\r\n } else {\r\n processedLines.push(reminderLine);\r\n reminderLine = '';\r\n }\r\n }\r\n processedLines.push(reminderLine);\r\n });\r\n textAspectRatio = getTextAspectRatio(processedLines);\r\n } else {\r\n // can't wrap no more\r\n textAspectRatio = -1;\r\n }\r\n }\r\n\r\n return processedLines.join(`\\r\\n`);\r\n } else {\r\n return this.text;\r\n }\r\n }\r\n\r\n public wordWrap = false;\r\n private prevWrappedText = '';\r\n /**\r\n * Renders text within the text block according to its settings.\r\n */\r\n public async renderText() {\r\n const LINE_SIZE = '1em'; // `${this.fontSize.value}${this.fontSize.units}`;\r\n\r\n if (this._textElement) {\r\n const processedText = this.wordWrap ? this.wrapText() : this.text;\r\n if (this.prevWrappedText === processedText) {\r\n this.positionText();\r\n return;\r\n }\r\n this.prevWrappedText = processedText;\r\n\r\n while (this._textElement.lastChild) {\r\n this._textElement.removeChild(this._textElement.lastChild);\r\n }\r\n\r\n const lines = processedText.split(/\\r\\n|[\\n\\v\\f\\r\\x85\\u2028\\u2029]/);\r\n lines.forEach((line, lineno) => {\r\n this._textElement.appendChild(\r\n SvgHelper.createTSpan(\r\n // workaround for swallowed empty lines\r\n line.trim() === '' ? ' ' : line.trim(),\r\n [\r\n // ['x', '0'],\r\n ['dy', lineno > 0 ? LINE_SIZE : '0'],\r\n ],\r\n ),\r\n );\r\n });\r\n\r\n // hide to prevent jerky movements during layout\r\n this.textElement.style.opacity = '0';\r\n\r\n // Wait for next frame to ensure DOM is updated\r\n await new Promise((resolve) => requestAnimationFrame(resolve));\r\n this.positionText(this);\r\n }\r\n }\r\n\r\n private applyFontStyles() {\r\n this._textElement.childNodes.forEach((ts) => {\r\n const tspan = <SVGTSpanElement>ts;\r\n tspan.style.fontFamily = this._textElement.style.fontFamily;\r\n tspan.style.fontSize = this._textElement.style.fontSize;\r\n });\r\n }\r\n\r\n private _textSize?: DOMRect;\r\n /**\r\n * Returns the size of the rectangle containing the text block's text.\r\n */\r\n public get textSize(): DOMRect | undefined {\r\n return this._textSize;\r\n }\r\n\r\n /**\r\n * Positions the text within the text block.\r\n * @param textBlock\r\n */\r\n public positionText(textBlock?: TextBlock) {\r\n const self = textBlock === undefined ? this : textBlock;\r\n const LINE_SIZE = '1em'; //`${this.fontSize.value}${this.fontSize.units}`;\r\n\r\n self.applyFontStyles();\r\n\r\n self._textSize = self._textElement.getBBox();\r\n const centerX =\r\n self.boundingBox.x + self._textSize.width / 2 + self.offsetX;\r\n\r\n const noOfLines = self._textElement.childNodes.length;\r\n const lineHeight = self._textSize.height / noOfLines;\r\n // arbitrary approximation for correct vertical alignment\r\n const autoOffset =\r\n noOfLines > 1 ? -(lineHeight * (noOfLines - 2)) / 2 : lineHeight / 3;\r\n\r\n const centerY =\r\n self.boundingBox.y +\r\n self._textSize.height / 2 +\r\n // - self._textSize.height / 2\r\n autoOffset +\r\n self.offsetY;\r\n\r\n self._textElement.childNodes.forEach((ts, lineno) => {\r\n const tspan = <SVGTSpanElement>ts;\r\n SvgHelper.setAttributes(tspan, [\r\n ['x', `${centerX}`],\r\n ['dy', lineno > 0 ? LINE_SIZE : '0'],\r\n ]);\r\n });\r\n SvgHelper.setAttributes(self._textElement, [['x', `${centerX}`]]);\r\n SvgHelper.setAttributes(self._textElement, [['y', `${centerY}`]]);\r\n\r\n self._textSize = self._textElement.getBBox();\r\n const bgPadding = 1.2;\r\n SvgHelper.setAttributes(self.labelBackground, [\r\n ['width', (self._textSize.width * bgPadding).toString()],\r\n ['height', (self._textSize.height * bgPadding).toString()],\r\n ['x', (centerX - (self._textSize.width * bgPadding) / 2).toString()],\r\n [\r\n 'y',\r\n (self._textSize.y - bgPadding)\r\n // centerY -\r\n // (self._textSize.height / 2) * (bgPadding - 1) * 2\r\n // - lineHeight / 2\r\n .toString(),\r\n ],\r\n ]);\r\n\r\n if (self.onTextSizeChanged) {\r\n self.onTextSizeChanged(self);\r\n }\r\n\r\n // restore visibility\r\n this.textElement.style.opacity = '1';\r\n }\r\n\r\n /**\r\n * Makes the text block content visible.\r\n */\r\n public show() {\r\n this._textElement.style.display = '';\r\n this._labelBackground.style.display = '';\r\n }\r\n /**\r\n * Hides the text block content.\r\n */\r\n public hide() {\r\n this._textElement.style.display = 'none';\r\n this._labelBackground.style.display = 'none';\r\n }\r\n\r\n /**\r\n * Shows the text block's dashed outline.\r\n */\r\n public showControlBox() {\r\n this.labelBackground.style.strokeOpacity = '1';\r\n }\r\n /**\r\n * Hides the text block's dashed outline.\r\n */\r\n public hideControlBox() {\r\n this.labelBackground.style.strokeOpacity = '0';\r\n }\r\n}\r\n","import { FontSize } from './FontSize';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { RectangularBoxMarkerBase } from './RectangularBoxMarkerBase';\r\nimport { SvgHelper } from './SvgHelper';\r\nimport { TextBlock } from './TextBlock';\r\nimport { TextMarkerState } from './TextMarkerState';\r\n\r\n/**\r\n * Text marker.\r\n *\r\n * Used to represent a text block as well a base class for other text-based markers.\r\n *\r\n * @summary Text marker.\r\n * @group Markers\r\n */\r\nexport class TextMarker extends RectangularBoxMarkerBase {\r\n public static typeName = 'TextMarker';\r\n\r\n public static title = 'Text marker';\r\n\r\n /**\r\n * Default text for the marker type.\r\n */\r\n protected static DEFAULT_TEXT = 'Text';\r\n // protected static DEFAULT_TEXT =\r\n // 'Longer text to see what happens when it is too long to fit the bounding box.';\r\n\r\n /**\r\n * Callback to be called when the text size changes.\r\n */\r\n public onSizeChanged?: (textMarker: TextMarker) => void;\r\n\r\n private _color = 'black';\r\n /**\r\n * Returns markers's text color.\r\n */\r\n public get color() {\r\n return this._color;\r\n }\r\n /**\r\n * Sets the markers's text color.\r\n */\r\n public set color(value) {\r\n this._color = value;\r\n this.textBlock.color = value;\r\n }\r\n\r\n private _fontFamily = 'Helvetica, Arial, sans-serif';\r\n /**\r\n * Returns the markers's font family.\r\n */\r\n public get fontFamily() {\r\n return this._fontFamily;\r\n }\r\n /**\r\n * Sets the markers's font family.\r\n */\r\n public set fontFamily(value) {\r\n this._fontFamily = value;\r\n this.textBlock.fontFamily = value;\r\n }\r\n\r\n private _fontSize: FontSize = {\r\n value: 1,\r\n units: 'rem',\r\n step: 0.1,\r\n };\r\n /**\r\n * Returns the marker's font size.\r\n */\r\n public get fontSize(): FontSize {\r\n return this._fontSize;\r\n }\r\n /**\r\n * Sets the marker's font size.\r\n */\r\n public set fontSize(value: FontSize) {\r\n this._fontSize = value;\r\n this.textBlock.fontSize = value;\r\n }\r\n\r\n /**\r\n * Returns the default text for the marker type.\r\n * @returns marker type's default text.\r\n */\r\n protected getDefaultText(): string {\r\n return Object.getPrototypeOf(this).constructor.DEFAULT_TEXT;\r\n }\r\n private _text: string = this.getDefaultText();\r\n /**\r\n * Returns the marker's text.\r\n */\r\n public get text(): string {\r\n return this.textBlock.text;\r\n }\r\n /**\r\n * Sets the marker's text.\r\n */\r\n public set text(value: string) {\r\n this._text = value;\r\n this.textBlock.text = this._text;\r\n }\r\n\r\n /**\r\n * Text padding from the bounding box.\r\n */\r\n public padding = 2;\r\n\r\n /**\r\n * Text's bounding box where text should fit and/or be anchored to.\r\n */\r\n public textBoundingBox: DOMRect;\r\n\r\n /**\r\n * Text block handling the text rendering.\r\n */\r\n public textBlock: TextBlock = new TextBlock(this.getDefaultText());\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.setColor = this.setColor.bind(this);\r\n this.setFont = this.setFont.bind(this);\r\n this.setFontSize = this.setFontSize.bind(this);\r\n this.setSize = this.setSize.bind(this);\r\n this.textSizeChanged = this.textSizeChanged.bind(this);\r\n this.setSizeFromTextSize = this.setSizeFromTextSize.bind(this);\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n\r\n this.textBoundingBox = new DOMRect();\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this.opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n /**\r\n * Creates marker's visual.\r\n */\r\n public createVisual(): void {\r\n this.textBlock.fontFamily = this.fontFamily;\r\n this.textBlock.fontSize = this.fontSize;\r\n this.textBlock.color = this.color;\r\n this.textBlock.offsetX = this.padding;\r\n this.textBlock.offsetY = this.padding;\r\n\r\n this.textBlock.onTextSizeChanged = this.textSizeChanged;\r\n\r\n this.visual = SvgHelper.createGroup();\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n this.visual.appendChild(this.textBlock.textElement);\r\n this.addMarkerVisualToContainer(this.visual);\r\n\r\n this.textBlock.text = this._text;\r\n }\r\n\r\n /**\r\n * Adjusts marker's visual according to the current state.\r\n */\r\n public adjustVisual(): void {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n this.setSize();\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (\r\n super.ownsTarget(el) ||\r\n el === this.visual ||\r\n this.textBlock.ownsTarget(el)\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Sets the text bounding box.\r\n */\r\n protected setTextBoundingBox() {\r\n this.textBoundingBox.x = this.padding;\r\n this.textBoundingBox.y = this.padding;\r\n this.textBoundingBox.width = Number.MAX_VALUE; // this.width - this.padding * 2;\r\n this.textBoundingBox.height = Number.MAX_VALUE; // this.height - this.padding * 2;\r\n //this.textBlock.boundingBox = this.textBoundingBox;\r\n }\r\n\r\n /**\r\n * Sets (adjusts) the marker's size.\r\n */\r\n public setSize(): void {\r\n const [prevWidth, prevHeight] = [this.width, this.height];\r\n\r\n super.setSize();\r\n this.setSizeFromTextSize();\r\n\r\n if (\r\n (prevWidth !== this.width || prevHeight !== this.height) &&\r\n this.onSizeChanged\r\n ) {\r\n this.onSizeChanged(this);\r\n }\r\n\r\n this.setTextBoundingBox();\r\n }\r\n\r\n /**\r\n * Sets the marker's size based on the text size.\r\n */\r\n protected setSizeFromTextSize(): void {\r\n if (this.textBlock.textSize) {\r\n this.width = this.textBlock.textSize.width + this.padding * 2;\r\n this.height = this.textBlock.textSize.height + this.padding * 2;\r\n }\r\n\r\n this.textBlock.offsetX = this.padding;\r\n this.textBlock.offsetY = this.padding;\r\n }\r\n\r\n private textSizeChanged(): void {\r\n this.adjustVisual();\r\n }\r\n\r\n /**\r\n * Sets the text color.\r\n * @param color text color\r\n */\r\n public setColor(color: string): void {\r\n this.color = color;\r\n }\r\n\r\n /**\r\n * Sets the font family.\r\n * @param font font family string\r\n */\r\n public setFont(font: string): void {\r\n this.fontFamily = font;\r\n }\r\n\r\n /**\r\n * Sets the font size.\r\n * @param fontSize font size\r\n */\r\n public setFontSize(fontSize: FontSize): void {\r\n this.fontSize = fontSize;\r\n }\r\n\r\n /**\r\n * Hides the marker's visual.\r\n *\r\n * Used when editing the text.\r\n */\r\n public hideVisual(): void {\r\n if (this.visual) {\r\n this.visual.style.visibility = 'hidden';\r\n }\r\n }\r\n /**\r\n * Shows the marker's visual.\r\n *\r\n * Eg. when done editing the text.\r\n */\r\n public showVisual() {\r\n if (this.visual) {\r\n this.visual.style.visibility = 'visible';\r\n this.textBlock.renderText();\r\n }\r\n }\r\n\r\n public getState(): TextMarkerState {\r\n const result: TextMarkerState = Object.assign(\r\n {\r\n color: this.color,\r\n fontFamily: this.fontFamily,\r\n fontSize: this.fontSize,\r\n text: this.text,\r\n },\r\n super.getState(),\r\n );\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n const textState = state as TextMarkerState;\r\n this.color = textState.color;\r\n this.fontFamily = textState.fontFamily;\r\n this.fontSize = textState.fontSize;\r\n this.text = textState.text;\r\n\r\n this.createVisual();\r\n\r\n super.restoreState(state);\r\n this.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n const newFontSize = {\r\n ...this.fontSize,\r\n value: this.fontSize.value * Math.min(scaleX, scaleY),\r\n };\r\n this.fontSize = newFontSize;\r\n\r\n this.padding = this.padding * Math.min(scaleX, scaleY);\r\n\r\n this.adjustVisual();\r\n }\r\n}\r\n","import { ShapeMarkerBase } from './ShapeMarkerBase';\r\n\r\n/**\r\n * Cover marker is a filled rectangle marker.\r\n *\r\n * A typical use case is to cover some area of the image with a colored rectangle as a \"redaction\".\r\n *\r\n * @summary Filled rectangle marker.\r\n * @group Markers\r\n */\r\nexport class CoverMarker extends ShapeMarkerBase {\r\n public static typeName = 'CoverMarker';\r\n public static title = 'Cover marker';\r\n public static applyDefaultFilter = false;\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.fillColor = '#000000';\r\n this.strokeColor = 'transparent';\r\n this.strokeWidth = 0;\r\n }\r\n\r\n protected getPath(\r\n width: number = this.width,\r\n height: number = this.height,\r\n ): string {\r\n const result = `M 0 0 \r\n H ${width} \r\n V ${height} \r\n H 0 \r\n V 0 Z`;\r\n\r\n return result;\r\n }\r\n}\r\n","import { ShapeMarkerBase } from './ShapeMarkerBase';\r\n\r\n/**\r\n * Highlight marker is a semi-transparent rectangular marker.\r\n *\r\n * @summary Semi-transparent rectangular marker.\r\n * @group Markers\r\n */\r\nexport class HighlightMarker extends ShapeMarkerBase {\r\n public static typeName = 'HighlightMarker';\r\n public static title = 'Highlight marker';\r\n public static applyDefaultFilter = false;\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.fillColor = '#ffff00';\r\n this.opacity = 0.5;\r\n this.strokeColor = 'transparent';\r\n this.strokeWidth = 0;\r\n }\r\n\r\n protected getPath(\r\n width: number = this.width,\r\n height: number = this.height,\r\n ): string {\r\n const result = `M 0 0 \r\n H ${width} \r\n V ${height} \r\n H 0 \r\n V 0 Z`;\r\n\r\n return result;\r\n }\r\n}\r\n","import { CalloutMarkerState } from './CalloutMarkerState';\r\nimport { IPoint } from './IPoint';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\nimport { TextMarker } from './TextMarker';\r\n\r\n/**\r\n * Callout marker is a text-based marker with a callout outline with a tip that can point to specific place\r\n * on the underlying image or annotation.\r\n *\r\n * @summary Text-based marker with a callout outline with a tip that can point to specific place\r\n * on the underlying image or annotation.\r\n *\r\n * @group Markers\r\n */\r\nexport class CalloutMarker extends TextMarker {\r\n public static typeName = 'CalloutMarker';\r\n\r\n public static title = 'Callout marker';\r\n\r\n private _tipPosition: IPoint = { x: 0, y: 0 };\r\n /**\r\n * Coordinates of the position of the tip of the callout.\r\n */\r\n public get tipPosition(): IPoint {\r\n return this._tipPosition;\r\n }\r\n public set tipPosition(value: IPoint) {\r\n this._tipPosition = value;\r\n this.adjustVisual();\r\n }\r\n\r\n private tipBase1Position: IPoint = { x: 0, y: 0 };\r\n private tipBase2Position: IPoint = { x: 0, y: 0 };\r\n\r\n private _calloutVisual: SVGPathElement = SvgHelper.createPath('M0,0');\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.color = '#ffffff';\r\n this.fillColor = '#ff0000';\r\n this.strokeColor = '#ffffff';\r\n this.strokeWidth = 3;\r\n this.padding = 20;\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n this.getPath = this.getPath.bind(this);\r\n this.setTipPoints = this.setTipPoints.bind(this);\r\n }\r\n\r\n protected applyStrokeColor() {\r\n SvgHelper.setAttributes(this._calloutVisual, [\r\n ['stroke', this._strokeColor],\r\n ]);\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n SvgHelper.setAttributes(this._calloutVisual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n }\r\n\r\n protected applyStrokeDasharray() {\r\n SvgHelper.setAttributes(this._calloutVisual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyFillColor() {\r\n SvgHelper.setAttributes(this._calloutVisual, [['fill', this._fillColor]]);\r\n }\r\n\r\n /**\r\n * Returns the SVG path string for the callout outline.\r\n *\r\n * @returns Path string for the callout outline.\r\n */\r\n protected getPath(): string {\r\n const r = 5;\r\n this.setTipPoints();\r\n\r\n const result = `M ${r} 0 \r\n ${\r\n this.tipBase1Position.y === 0\r\n ? `H ${this.tipBase1Position.x} L ${this.tipPosition.x} ${this.tipPosition.y} L ${this.tipBase2Position.x} 0`\r\n : ''\r\n }\r\n H ${this.width - r} \r\n A ${r} ${r} 0 0 1 ${this.width} ${r} \r\n ${\r\n this.tipBase1Position.x === this.width\r\n ? `V ${this.tipBase1Position.y} L ${this.tipPosition.x} ${this.tipPosition.y} L ${this.tipBase2Position.x} ${this.tipBase2Position.y}`\r\n : ''\r\n }\r\n V ${this.height - r} \r\n A ${r} ${r} 0 0 1 ${this.width - r} ${this.height} \r\n ${\r\n this.tipBase1Position.y === this.height\r\n ? `H ${this.tipBase2Position.x} L ${this.tipPosition.x} ${this.tipPosition.y} L ${this.tipBase1Position.x} ${this.height}`\r\n : ''\r\n }\r\n H ${r}\r\n A ${r} ${r} 0 0 1 0 ${this.height - r} \r\n ${\r\n this.tipBase1Position.x === 0\r\n ? `V ${this.tipBase2Position.y} L ${this.tipPosition.x} ${this.tipPosition.y} L ${this.tipBase1Position.x} ${this.tipBase1Position.y}`\r\n : ''\r\n }\r\n V ${r} \r\n A ${r} ${r} 0 0 1 ${r} 0 \r\n Z`;\r\n\r\n return result;\r\n }\r\n\r\n private setTipPoints() {\r\n let offset = Math.min(this.height / 2, 15);\r\n let baseWidth = this.height / 5;\r\n\r\n const cornerAngle = Math.atan(this.height / 2 / (this.width / 2));\r\n if (\r\n this.tipPosition.x < this.width / 2 &&\r\n this.tipPosition.y < this.height / 2\r\n ) {\r\n // top left\r\n const tipAngle = Math.atan(\r\n (this.height / 2 - this.tipPosition.y) /\r\n (this.width / 2 - this.tipPosition.x),\r\n );\r\n if (cornerAngle < tipAngle) {\r\n baseWidth = this.width / 5;\r\n offset = Math.min(this.width / 2, 15);\r\n this.tipBase1Position = { x: offset, y: 0 };\r\n this.tipBase2Position = { x: offset + baseWidth, y: 0 };\r\n } else {\r\n this.tipBase1Position = { x: 0, y: offset };\r\n this.tipBase2Position = { x: 0, y: offset + baseWidth };\r\n }\r\n } else if (\r\n this.tipPosition.x >= this.width / 2 &&\r\n this.tipPosition.y < this.height / 2\r\n ) {\r\n // top right\r\n const tipAngle = Math.atan(\r\n (this.height / 2 - this.tipPosition.y) /\r\n (this.tipPosition.x - this.width / 2),\r\n );\r\n if (cornerAngle < tipAngle) {\r\n baseWidth = this.width / 5;\r\n offset = Math.min(this.width / 2, 15);\r\n this.tipBase1Position = { x: this.width - offset - baseWidth, y: 0 };\r\n this.tipBase2Position = { x: this.width - offset, y: 0 };\r\n } else {\r\n this.tipBase1Position = { x: this.width, y: offset };\r\n this.tipBase2Position = { x: this.width, y: offset + baseWidth };\r\n }\r\n } else if (\r\n this.tipPosition.x >= this.width / 2 &&\r\n this.tipPosition.y >= this.height / 2\r\n ) {\r\n // bottom right\r\n const tipAngle = Math.atan(\r\n (this.tipPosition.y - this.height / 2) /\r\n (this.tipPosition.x - this.width / 2),\r\n );\r\n if (cornerAngle < tipAngle) {\r\n baseWidth = this.width / 5;\r\n offset = Math.min(this.width / 2, 15);\r\n this.tipBase1Position = {\r\n x: this.width - offset - baseWidth,\r\n y: this.height,\r\n };\r\n this.tipBase2Position = { x: this.width - offset, y: this.height };\r\n } else {\r\n this.tipBase1Position = {\r\n x: this.width,\r\n y: this.height - offset - baseWidth,\r\n };\r\n this.tipBase2Position = { x: this.width, y: this.height - offset };\r\n }\r\n } else {\r\n // bottom left\r\n const tipAngle = Math.atan(\r\n (this.tipPosition.y - this.height / 2) /\r\n (this.width / 2 - this.tipPosition.x),\r\n );\r\n if (cornerAngle < tipAngle) {\r\n baseWidth = this.width / 5;\r\n offset = Math.min(this.width / 2, 15);\r\n this.tipBase1Position = { x: offset, y: this.height };\r\n this.tipBase2Position = { x: offset + baseWidth, y: this.height };\r\n } else {\r\n this.tipBase1Position = { x: 0, y: this.height - offset - baseWidth };\r\n this.tipBase2Position = { x: 0, y: this.height - offset };\r\n }\r\n }\r\n }\r\n\r\n public createVisual(): void {\r\n super.createVisual();\r\n\r\n this._tipPosition = {\r\n // x: -50,\r\n // x: this.width + 50,\r\n x: this.width / 4,\r\n // y: this.height / 4,\r\n // y: -50,\r\n y: this.height + 20,\r\n };\r\n\r\n this._calloutVisual = SvgHelper.createPath(this.getPath(), [\r\n ['fill', this._fillColor],\r\n ['stroke', this._strokeColor],\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n this.visual?.insertBefore(this._calloutVisual, this.textBlock.textElement);\r\n }\r\n\r\n public adjustVisual(): void {\r\n super.adjustVisual();\r\n if (this._calloutVisual) {\r\n SvgHelper.setAttributes(this._calloutVisual, [\r\n ['d', this.getPath()],\r\n ['fill', this._fillColor],\r\n ['stroke', this._strokeColor],\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this._calloutVisual === el) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public getState(): CalloutMarkerState {\r\n const result: CalloutMarkerState = Object.assign(\r\n {\r\n fillColor: this.fillColor,\r\n tipPosition: this.tipPosition,\r\n },\r\n super.getState(),\r\n );\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n const calloutState = state as CalloutMarkerState;\r\n super.restoreState(state);\r\n this.fillColor = calloutState.fillColor;\r\n this.tipPosition = calloutState.tipPosition;\r\n\r\n this.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.width = this.width * scaleX;\r\n this.height = this.height * scaleY;\r\n\r\n this.strokeWidth *= (scaleX + scaleY) / 2;\r\n\r\n this._tipPosition = {\r\n x: this._tipPosition.x * scaleX,\r\n y: this._tipPosition.y * scaleY,\r\n };\r\n\r\n this.adjustVisual();\r\n }\r\n}\r\n","import { ShapeOutlineMarkerBase } from './ShapeOutlineMarkerBase';\r\n\r\n/**\r\n * Ellipse frame marker represents unfilled circle/ellipse shape.\r\n *\r\n * @summary Unfilled ellipse marker.\r\n * @group Markers\r\n */\r\nexport class EllipseFrameMarker extends ShapeOutlineMarkerBase {\r\n public static typeName = 'EllipseFrameMarker';\r\n public static title = 'Ellipse frame marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.strokeColor = '#ff0000';\r\n this.strokeWidth = 3;\r\n }\r\n\r\n protected getPath(\r\n width: number = this.width,\r\n height: number = this.height,\r\n ): string {\r\n const result = `M ${width / 2} 0 \r\n a ${width / 2} ${height / 2} 0 1 0 0 ${height} \r\n a ${width / 2} ${height / 2} 0 1 0 0 -${height} z`;\r\n\r\n return result;\r\n }\r\n}\r\n","import { ShapeMarkerBase } from './ShapeMarkerBase';\r\n\r\n/**\r\n * Ellipse marker is a filled ellipse marker.\r\n *\r\n * @summary Filled ellipse marker.\r\n * @group Markers\r\n */\r\nexport class EllipseMarker extends ShapeMarkerBase {\r\n public static typeName = 'EllipseMarker';\r\n public static title = 'Ellipse marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.fillColor = '#ff0000';\r\n this.strokeColor = '#ff0000';\r\n }\r\n\r\n protected getPath(\r\n width: number = this.width,\r\n height: number = this.height,\r\n ): string {\r\n const result = `M ${width / 2} 0 \r\n a ${width / 2} ${height / 2} 0 1 0 0 ${height} \r\n a ${width / 2} ${height / 2} 0 1 0 0 -${height} z`;\r\n\r\n return result;\r\n }\r\n}\r\n","import { ImageMarkerBaseState, ImageType } from './ImageMarkerBaseState';\r\nimport { RectangularBoxMarkerBase } from './RectangularBoxMarkerBase';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\n/**\r\n * Base class for image markers.\r\n *\r\n * This class isn't meant to be used directly. Use one of the derived classes instead.\r\n *\r\n * @summary Image marker base class.\r\n * @group Markers\r\n */\r\nexport class ImageMarkerBase extends RectangularBoxMarkerBase {\r\n public static title = 'Image marker';\r\n\r\n /**\r\n * Main SVG or image element of the marker.\r\n */\r\n protected SVGImage?: SVGSVGElement | SVGImageElement;\r\n /**\r\n * Type of the image: SVG or bitmap.\r\n */\r\n protected imageType: ImageType = 'svg';\r\n\r\n /**\r\n * For SVG images this holds the SVG markup of the image.\r\n */\r\n protected _svgString?: string;\r\n /**\r\n * For SVG images this holds the SVG markup of the image.\r\n */\r\n public get svgString() {\r\n return this._svgString;\r\n }\r\n public set svgString(value) {\r\n this._svgString = value;\r\n if (this.SVGImage && this.imageType === 'svg') {\r\n if (value !== undefined) {\r\n this.SVGImage.outerHTML = value;\r\n } else {\r\n this.SVGImage.outerHTML = '';\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * For bitmap images this holds the base64 encoded image.\r\n */\r\n protected _imageSrc?: string; // = 'data:image/png;base64,...';\r\n /**\r\n * For bitmap images this holds the base64 encoded image.\r\n *\r\n * @remarks\r\n * Technically this could be any URL but due to browser security constraints\r\n * an external image will almost certainly cause bitmap rendering of the image to fail.\r\n *\r\n * In cases you know you will never render the annotation as a static image,\r\n * it should be safe to use external URLs. Otherwise, use base64 encoded images\r\n * like 'data:image/png;base64,...'.\r\n */\r\n public get imageSrc() {\r\n return this._imageSrc;\r\n }\r\n public set imageSrc(value) {\r\n this._imageSrc = value;\r\n if (this.SVGImage && this.imageType === 'bitmap') {\r\n if (value !== undefined) {\r\n SvgHelper.setAttributes(this.SVGImage, [['href', value]]);\r\n } else {\r\n SvgHelper.setAttributes(this.SVGImage, [['href', '']]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Natural (real) width of the image.\r\n */\r\n protected naturalWidth = 24;\r\n /**\r\n * Natural (real) height of the image.\r\n */\r\n protected naturalHeight = 24;\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.defaultSize = { width: this.naturalWidth, height: this.naturalHeight };\r\n\r\n this.createImage = this.createImage.bind(this);\r\n this.createVisual = this.createVisual.bind(this);\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n this.adjustImage = this.adjustImage.bind(this);\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this.opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n /**\r\n * Creates the image element based on the image type and source.\r\n */\r\n protected createImage(): void {\r\n if (this._svgString !== undefined) {\r\n this.imageType = 'svg';\r\n // Import into current document to avoid cross-document issues\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(this._svgString, 'image/svg+xml');\r\n const element = doc.documentElement;\r\n if (!(element instanceof SVGSVGElement)) {\r\n throw new Error('Invalid SVG string');\r\n }\r\n const svgElement = element;\r\n this.SVGImage = this.container.ownerDocument.importNode(svgElement, true);\r\n } else {\r\n this.imageType = 'bitmap';\r\n this.SVGImage = SvgHelper.createImage([['href', this._imageSrc ?? '']]);\r\n }\r\n }\r\n\r\n /**\r\n * Creates marker's visual, including its image element.\r\n */\r\n public createVisual(): void {\r\n this.createImage();\r\n if (this.SVGImage !== undefined) {\r\n this.visual = SvgHelper.createGroup();\r\n\r\n if (this.imageType === 'svg') {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['viewBox', `0 0 ${this.naturalWidth} ${this.naturalHeight}`],\r\n ['fill', this._fillColor],\r\n ['stroke', this._strokeColor],\r\n ['color', this._strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['stroke-dasharray', this.strokeDasharray],\r\n ['opacity', this.opacity.toString()],\r\n ['pointer-events', 'bounding-box'],\r\n ]);\r\n // } else if (this.imageType === 'bitmap') {\r\n }\r\n this.adjustImage();\r\n this.visual.appendChild(this.SVGImage);\r\n this.addMarkerVisualToContainer(this.visual);\r\n }\r\n }\r\n\r\n /**\r\n * Adjusts marker's visual according to the current state\r\n * (color, width, etc.).\r\n */\r\n public adjustVisual(): void {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n /**\r\n * Adjusts the image size and position.\r\n */\r\n public adjustImage(): void {\r\n if (this.SVGImage !== undefined) {\r\n this.SVGImage.setAttribute('x', `0px`);\r\n this.SVGImage.setAttribute('y', `0px`);\r\n this.SVGImage.setAttribute('width', `${this.width}px`);\r\n this.SVGImage.setAttribute('height', `${this.height}px`);\r\n }\r\n }\r\n\r\n private isDescendant(parent: Element, target: EventTarget): boolean {\r\n if (parent === target) {\r\n return true;\r\n }\r\n\r\n for (let i = 0; i < parent.children.length; i++) {\r\n if (this.isDescendant(parent.children[i], target)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n return (\r\n super.ownsTarget(el) ||\r\n (this.SVGImage !== undefined && this.isDescendant(this.SVGImage, el))\r\n );\r\n }\r\n\r\n public setSize(): void {\r\n super.setSize();\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['width', `${this.width}px`],\r\n ['height', `${this.height}px`],\r\n ]);\r\n this.adjustImage();\r\n }\r\n }\r\n\r\n public getState(): ImageMarkerBaseState {\r\n const result: ImageMarkerBaseState = Object.assign(\r\n {\r\n imageType: this.imageType,\r\n svgString: this.svgString,\r\n imageSrc: this.imageSrc,\r\n },\r\n super.getState(),\r\n );\r\n\r\n return result;\r\n }\r\n\r\n protected applyStrokeColor() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [['color', this._strokeColor]]);\r\n }\r\n }\r\n\r\n public restoreState(state: ImageMarkerBaseState): void {\r\n const imgState = state as ImageMarkerBaseState;\r\n if (imgState.imageType !== undefined) {\r\n this.imageType = imgState.imageType;\r\n }\r\n if (imgState.svgString !== undefined) {\r\n this._svgString = imgState.svgString;\r\n }\r\n if (imgState.imageSrc !== undefined) {\r\n this._imageSrc = imgState.imageSrc;\r\n }\r\n this.createVisual();\r\n super.restoreState(state);\r\n this.setSize();\r\n this.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.setSize();\r\n }\r\n}\r\n","import { ImageMarkerBase } from './ImageMarkerBase';\r\n\r\n/**\r\n * Used to represent user-set images.\r\n *\r\n * Use this marker to display custom images at runtime.\r\n * For example, you can use this type to represent emojis selected in an emoji picker.\r\n *\r\n * @summary Custom image marker.\r\n * @group Markers\r\n */\r\nexport class CustomImageMarker extends ImageMarkerBase {\r\n public static typeName = 'CustomImageMarker';\r\n public static title = 'Custom image marker';\r\n}\r\n","import { ImageMarkerBase } from './ImageMarkerBase';\r\n\r\n/**\r\n * Check mark marker.\r\n *\r\n * Represents a check mark image marker. Can be used to quickly mark something as correct, or\r\n * similar use cases.\r\n *\r\n * @summary Check mark image marker.\r\n * @group Markers\r\n */\r\nexport class CheckImageMarker extends ImageMarkerBase {\r\n public static typeName = 'CheckImageMarker';\r\n public static title = 'Check image marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this._svgString = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"><path d=\"M21.801 10A10 10 0 1 1 17 3.335\"/><path d=\"m9 11l3 3L22 4\"/></g></svg>`;\r\n this.strokeColor = '#008000';\r\n }\r\n}\r\n","import { ImageMarkerBase } from './ImageMarkerBase';\r\n\r\n/**\r\n * X mark image marker.\r\n *\r\n * @summary X (crossed) image marker.\r\n * @group Markers\r\n */\r\nexport class XImageMarker extends ImageMarkerBase {\r\n public static typeName = 'XImageMarker';\r\n public static title = 'X image marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this._svgString = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"m15 9l-6 6m0-6l6 6\"/></g></svg>`;\r\n this.strokeColor = '#d00000';\r\n }\r\n}\r\n","import { CaptionFrameMarkerState } from './CaptionFrameMarkerState';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\nimport { TextMarker } from './TextMarker';\r\n\r\n/**\r\n * Caption frame marker is a combination of a frame (rectangle) and a text caption that goes with it.\r\n *\r\n * @summary A combination of a frame (rectangle) and a text caption that goes with it.\r\n *\r\n * @group Markers\r\n */\r\nexport class CaptionFrameMarker extends TextMarker {\r\n public static typeName = 'CaptionFrameMarker';\r\n\r\n public static title = 'Caption frame marker';\r\n\r\n private _outerFrameVisual: SVGPathElement = SvgHelper.createPath('M0,0');\r\n private _captionFrameVisual: SVGPathElement = SvgHelper.createPath('M0,0');\r\n private _frameVisual: SVGGElement = SvgHelper.createGroup();\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.color = '#ffffff';\r\n this.fillColor = '#ff0000';\r\n this.strokeColor = '#ff0000';\r\n this.strokeWidth = 3;\r\n this.padding = 5;\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n this.adjustFrameVisual = this.adjustFrameVisual.bind(this);\r\n this.getPaths = this.getPaths.bind(this);\r\n }\r\n\r\n protected applyStrokeColor() {\r\n SvgHelper.setAttributes(this._outerFrameVisual, [\r\n ['stroke', this._strokeColor],\r\n ]);\r\n SvgHelper.setAttributes(this._captionFrameVisual, [\r\n ['stroke', this._strokeColor],\r\n ]);\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n SvgHelper.setAttributes(this._outerFrameVisual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n SvgHelper.setAttributes(this._captionFrameVisual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n this.adjustTextPosition();\r\n this.adjustFrameVisual();\r\n }\r\n\r\n protected applyStrokeDasharray() {\r\n SvgHelper.setAttributes(this._outerFrameVisual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n SvgHelper.setAttributes(this._captionFrameVisual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyFillColor() {\r\n SvgHelper.setAttributes(this._captionFrameVisual, [\r\n ['fill', this._fillColor],\r\n ]);\r\n }\r\n\r\n /**\r\n * Returns the SVG path strings for the frame and the caption background.\r\n *\r\n * @param width\r\n * @param height\r\n * @returns SVG path strings for the frame and the caption background.\r\n */\r\n protected getPaths(\r\n width: number = this.width,\r\n height: number = this.height,\r\n ): { frame: string; caption: string } {\r\n const titleHeight =\r\n (this.textBlock.textSize?.height ?? 40) +\r\n this.padding * 2 +\r\n this.strokeWidth;\r\n return {\r\n frame: `M 0 0\r\n V ${height}\r\n H ${width}\r\n V 0\r\n Z`,\r\n caption: `M 0 0\r\n H ${width}\r\n V ${titleHeight}\r\n H 0\r\n Z`,\r\n };\r\n }\r\n\r\n public createVisual(): void {\r\n super.createVisual();\r\n\r\n const paths = this.getPaths();\r\n\r\n this._outerFrameVisual = SvgHelper.createPath(paths.frame, [\r\n ['fill', 'transparent'],\r\n ['stroke', this._strokeColor],\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n this._captionFrameVisual = SvgHelper.createPath(paths.caption, [\r\n ['fill', 'this._fillColor'],\r\n ['fill-rule', 'evenodd'],\r\n ['stroke', this._strokeColor],\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n this._frameVisual.appendChild(this._outerFrameVisual);\r\n this._frameVisual.appendChild(this._captionFrameVisual);\r\n this.visual?.insertBefore(this._frameVisual, this.textBlock.textElement);\r\n }\r\n\r\n public adjustVisual(): void {\r\n super.adjustVisual();\r\n\r\n this.adjustTextPosition();\r\n this.adjustFrameVisual();\r\n }\r\n\r\n /**\r\n * Adjusts text position inside the caption frame.\r\n */\r\n protected adjustTextPosition(): void {\r\n if (this.textBlock.textSize) {\r\n this.textBlock.textElement.style.transform = `translate(${\r\n this.width / 2 - this.textBlock.textSize?.width / 2 - this.padding\r\n }px, ${this.strokeWidth / 2}px)`;\r\n }\r\n }\r\n\r\n /**\r\n * Adjusts frame visual according to the current marker properties.\r\n */\r\n protected adjustFrameVisual(): void {\r\n const paths = this.getPaths();\r\n if (this._outerFrameVisual) {\r\n SvgHelper.setAttributes(this._outerFrameVisual, [\r\n ['d', paths.frame],\r\n ['stroke', this._strokeColor],\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n if (this._captionFrameVisual) {\r\n SvgHelper.setAttributes(this._captionFrameVisual, [\r\n ['d', paths.caption],\r\n ['fill', this._fillColor],\r\n ['stroke', this._strokeColor],\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (\r\n super.ownsTarget(el) ||\r\n this._outerFrameVisual === el ||\r\n this._captionFrameVisual === el\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public setSize(): void {\r\n super.setSize();\r\n this.adjustTextPosition();\r\n this.adjustFrameVisual();\r\n }\r\n protected setSizeFromTextSize(): void {}\r\n\r\n /**\r\n * Hides the marker visual.\r\n *\r\n * Used by the editor to hide rendered marker while editing the text.\r\n */\r\n public hideVisual(): void {\r\n this.textBlock.hide();\r\n }\r\n /**\r\n * Shows the marker visual.\r\n *\r\n * Used by the editor to show rendered marker after editing the text.\r\n */\r\n public showVisual() {\r\n this.textBlock.show();\r\n this.textBlock.renderText();\r\n }\r\n\r\n public getState(): CaptionFrameMarkerState {\r\n const result: CaptionFrameMarkerState = Object.assign(\r\n {\r\n fillColor: this.fillColor,\r\n },\r\n super.getState(),\r\n );\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n const captionState = state as CaptionFrameMarkerState;\r\n super.restoreState(state);\r\n this.fillColor = captionState.fillColor;\r\n\r\n this.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.strokeWidth *= (scaleX + scaleY) / 2;\r\n\r\n this.setSize();\r\n }\r\n}\r\n","import { CurveMarkerState } from './CurveMarkerState';\r\nimport { LineMarker } from './LineMarker';\r\n\r\n/**\r\n * Curve marker represents a curved line.\r\n *\r\n * @summary Curve marker.\r\n * @group Markers\r\n */\r\nexport class CurveMarker extends LineMarker {\r\n public static typeName = 'CurveMarker';\r\n public static title = 'Curve marker';\r\n\r\n /**\r\n * x coordinate for the curve control point.\r\n */\r\n public curveX = 0;\r\n /**\r\n * y coordinate for the curve control point.\r\n */\r\n public curveY = 0;\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.fillColor = 'transparent';\r\n }\r\n\r\n protected getPath(): string {\r\n const result = `M ${this.x1} ${this.y1} Q ${this.curveX} ${this.curveY}, ${this.x2} ${this.y2}`;\r\n return result;\r\n }\r\n\r\n public getState(): CurveMarkerState {\r\n const result: CurveMarkerState = Object.assign(\r\n {\r\n curveX: this.curveX,\r\n curveY: this.curveY,\r\n },\r\n super.getState(),\r\n );\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: CurveMarkerState): void {\r\n this.curveX = state.curveX;\r\n this.curveY = state.curveY;\r\n\r\n super.restoreState(state);\r\n }\r\n}\r\n","import { FreehandMarker } from './FreehandMarker';\r\n\r\n/**\r\n * Highlighter marker imitates a freeform highlighter pen.\r\n *\r\n * @summary Semi-transparent freeform marker.\r\n * @group Markers\r\n * @since 3.2.0\r\n */\r\nexport class HighlighterMarker extends FreehandMarker {\r\n public static typeName = 'HighlighterMarker';\r\n public static title = 'Highlighter marker';\r\n public static applyDefaultFilter = false;\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.opacity = 0.5;\r\n this.strokeColor = '#ffff00';\r\n this.strokeWidth = 20;\r\n }\r\n}\r\n","import { SvgHelper } from './SvgHelper';\r\n\r\n/**\r\n * A set of common SVG filters that can be used to make markers more legible\r\n * or just for visual effect.\r\n */\r\nexport class SvgFilters {\r\n /**\r\n * Returns a set of default filters that can be used to make markers more legible.\r\n * @returns array of SVG filters.\r\n */\r\n public static getDefaultFilterSet(): SVGFilterElement[] {\r\n const dsFilter = SvgHelper.createFilter(\r\n 'dropShadow',\r\n [\r\n ['x', '-20%'],\r\n ['y', '-20%'],\r\n ['width', '140%'],\r\n ['height', '140%'],\r\n ],\r\n `<feDropShadow dx=\"2\" dy=\"2\" stdDeviation=\"2\" flood-color=\"rgba(0,0,0,0.8)\"/>`,\r\n );\r\n\r\n const outlineFilter = SvgHelper.createFilter(\r\n 'outline',\r\n [\r\n ['x', '-5%'],\r\n ['y', '-5%'],\r\n ['width', '110%'],\r\n ['height', '110%'],\r\n ],\r\n `<feMorphology operator=\"dilate\" radius=\"2\" in=\"SourceAlpha\" result=\"expanded\"/>\r\n <feFlood flood-color=\"white\" flood-opacity=\"1\"/>\r\n <feComposite in2=\"expanded\" operator=\"in\"/>\r\n <feComposite in=\"SourceGraphic\" operator=\"over\"/>`,\r\n );\r\n\r\n const glowFilter = SvgHelper.createFilter(\r\n 'glow',\r\n [\r\n ['x', '-50%'],\r\n ['y', '-50%'],\r\n ['width', '200%'],\r\n ['height', '200%'],\r\n ],\r\n `<feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"3\" result=\"blur\"/>\r\n <feFlood flood-color=\"#ffffff\" flood-opacity=\"1\"/>\r\n <feComposite in2=\"blur\" operator=\"in\"/>\r\n <feMerge>\r\n <feMergeNode/>\r\n <feMergeNode in=\"SourceGraphic\"/>\r\n </feMerge>`,\r\n );\r\n\r\n return [dsFilter, outlineFilter, glowFilter];\r\n }\r\n}\r\n","import { IPoint, MarkerBase, MarkerBaseState, SvgHelper } from '../core';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\n\r\n/**\r\n * Represents marker's state (status) in time.\r\n */\r\nexport type MarkerEditorState =\r\n | 'new'\r\n | 'creating'\r\n | 'select'\r\n | 'move'\r\n | 'resize'\r\n | 'rotate'\r\n | 'edit';\r\n\r\n/**\r\n * Marker creation style defines whether markers are created by drawing them or just dropping them on the canvas.\r\n */\r\nexport type MarkerCreationStyle = 'draw' | 'drop';\r\n\r\n/**\r\n * Base class for all marker editors.\r\n *\r\n * @typeParam TMarkerType - marker type the instance of the editor is for.\r\n *\r\n * @summary Base class for all marker editors.\r\n * @group Editors\r\n */\r\nexport class MarkerBaseEditor<TMarkerType extends MarkerBase = MarkerBase> {\r\n /**\r\n * Marker type constructor.\r\n */\r\n protected _markerType: new (container: SVGGElement) => TMarkerType;\r\n\r\n /**\r\n * Marker creation style.\r\n *\r\n * Markers can either be created by drawing them or just dropping them on the canvas.\r\n */\r\n protected _creationStyle: MarkerCreationStyle = 'draw';\r\n /**\r\n * Marker creation style.\r\n *\r\n * Markers can either be created by drawing them or just dropping them on the canvas.\r\n */\r\n public get creationStyle(): MarkerCreationStyle {\r\n return this._creationStyle;\r\n }\r\n\r\n /**\r\n * Type guard for specific marker editor types.\r\n *\r\n * This allows to check if the editor is of a specific type which is useful for displaying type-specific UI.\r\n *\r\n * @typeParam T - specific marker editor type.\r\n * @param cls\r\n * @returns\r\n */\r\n public is<T>(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cls: new (...args: any[]) => T,\r\n ): this is T {\r\n return this instanceof cls;\r\n }\r\n\r\n /**\r\n * Marker instance.\r\n */\r\n protected _marker: TMarkerType;\r\n\r\n /**\r\n * Returns the marker instance.\r\n */\r\n public get marker(): TMarkerType {\r\n return this._marker;\r\n }\r\n\r\n /**\r\n * SVG container for the marker's and editor's visual elements.\r\n */\r\n protected _container: SVGGElement;\r\n /**\r\n * Returns the SVG container for the marker's and editor's visual elements.\r\n */\r\n public get container(): SVGGElement {\r\n return this._container;\r\n }\r\n\r\n /**\r\n * Overlay container for HTML elements like text editors, etc.\r\n */\r\n protected _overlayContainer: HTMLDivElement;\r\n /**\r\n * Overlay container for HTML elements like text editors, etc.\r\n */\r\n public get overlayContainer(): HTMLDivElement {\r\n return this._overlayContainer;\r\n }\r\n\r\n /**\r\n * Editor's state.\r\n */\r\n protected _state: MarkerEditorState = 'new';\r\n /**\r\n * Gets editor's state.\r\n */\r\n public get state(): MarkerEditorState {\r\n return this._state;\r\n }\r\n /**\r\n * Sets editor's state.\r\n */\r\n public set state(value: MarkerEditorState) {\r\n this._state = value;\r\n }\r\n\r\n /**\r\n * SVG group holding editor's control box.\r\n */\r\n protected _controlBox = SvgHelper.createGroup();\r\n\r\n /**\r\n * Method called when marker creation is finished.\r\n */\r\n public onMarkerCreated?: <T extends MarkerBaseEditor<MarkerBase>>(\r\n editor: T,\r\n ) => void;\r\n\r\n /**\r\n * Method to call when marker state changes.\r\n */\r\n public onStateChanged?: <T extends MarkerBaseEditor<MarkerBase>>(\r\n editor: T,\r\n ) => void;\r\n\r\n /**\r\n * Marker's state when it is selected\r\n */\r\n protected manipulationStartState?: string;\r\n\r\n /**\r\n * Is this marker selected?\r\n */\r\n protected _isSelected = false;\r\n\r\n /**\r\n * Returns true if the marker is currently selected\r\n */\r\n public get isSelected(): boolean {\r\n return this._isSelected;\r\n }\r\n\r\n /**\r\n * When set to true, a new marker of the same type is created immediately after the current one is finished.\r\n */\r\n protected _continuousCreation = false;\r\n /**\r\n * When set to true, a new marker of the same type is created immediately after the current one is finished.\r\n */\r\n public get continuousCreation() {\r\n return this._continuousCreation;\r\n }\r\n\r\n /**\r\n * Sets marker's stroke (outline) color.\r\n * @param color - color as string\r\n */\r\n public set strokeColor(color: string) {\r\n this.marker.strokeColor = color;\r\n }\r\n\r\n /**\r\n * Gets marker's stroke (outline) color.\r\n */\r\n public get strokeColor(): string {\r\n return this.marker.strokeColor;\r\n }\r\n\r\n /**\r\n * Sets marker's stroke (outline) width.\r\n * @param width - stroke width in pixels.\r\n */\r\n public set strokeWidth(width: number) {\r\n this.marker.strokeWidth = width;\r\n this.adjustControlBox();\r\n this.stateChanged();\r\n }\r\n\r\n /**\r\n * Gets marker's stroke (outline) width.\r\n */\r\n public get strokeWidth(): number {\r\n return this.marker.strokeWidth;\r\n }\r\n\r\n /**\r\n * Sets marker's stroke (outline) dash array.\r\n * @param dashes - dash array as string\r\n */\r\n public set strokeDasharray(dashes: string) {\r\n this.marker.strokeDasharray = dashes;\r\n this.stateChanged();\r\n }\r\n\r\n /**\r\n * Gets marker's stroke (outline) dash array.\r\n */\r\n public get strokeDasharray(): string {\r\n return this.marker.strokeDasharray;\r\n }\r\n\r\n /**\r\n * Sets marker's fill color.\r\n */\r\n public set fillColor(color: string) {\r\n this.marker.fillColor = color;\r\n }\r\n\r\n /**\r\n * Gets marker's fill color.\r\n */\r\n public get fillColor(): string {\r\n return this.marker.fillColor;\r\n }\r\n\r\n /**\r\n * Sets marker's opacity.\r\n */\r\n public set opacity(value: number) {\r\n this.marker.opacity = value;\r\n }\r\n\r\n /**\r\n * Gets marker's opacity.\r\n */\r\n public get opacity(): number {\r\n return this.marker.opacity;\r\n }\r\n\r\n /**\r\n * Sets marker's notes.\r\n */\r\n public set notes(value: string | undefined) {\r\n this.marker.notes = value;\r\n }\r\n\r\n /**\r\n * Gets marker's notes.\r\n */\r\n public get notes(): string | undefined {\r\n return this.marker.notes;\r\n }\r\n\r\n /**\r\n * Creates a new instance of marker editor.\r\n *\r\n * @param properties - marker editor properties.\r\n */\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n this._container = properties.container;\r\n this._overlayContainer = properties.overlayContainer;\r\n this._markerType = properties.markerType;\r\n this._marker =\r\n properties.marker ?? new properties.markerType(properties.container);\r\n\r\n this.select = this.select.bind(this);\r\n this.deselect = this.deselect.bind(this);\r\n this.ownsTarget = this.ownsTarget.bind(this);\r\n this.adjustControlBox = this.adjustControlBox.bind(this);\r\n this.stateChanged = this.stateChanged.bind(this);\r\n this.scale = this.scale.bind(this);\r\n this.dispose = this.dispose.bind(this);\r\n this.pointerDown = this.pointerDown.bind(this);\r\n this.pointerUp = this.pointerUp.bind(this);\r\n this.manipulate = this.manipulate.bind(this);\r\n this.dblClick = this.dblClick.bind(this);\r\n }\r\n\r\n /**\r\n * Returns true if the marker or the editor owns supplied target element.\r\n *\r\n * @param el target element\r\n * @returns\r\n */\r\n public ownsTarget(el: EventTarget | null): boolean {\r\n let found = false;\r\n if (el !== null) {\r\n if (this._marker?.ownsTarget(el)) {\r\n found = true;\r\n }\r\n }\r\n return found;\r\n }\r\n\r\n /**\r\n * Is this marker selected in a multi-selection?\r\n */\r\n protected isMultiSelected = false;\r\n /**\r\n * Selects this marker and displays appropriate selected marker UI.\r\n */\r\n public select(multi = false): void {\r\n this.isMultiSelected = multi;\r\n this.container.style.cursor = 'move';\r\n this._isSelected = true;\r\n this.manipulationStartState = JSON.stringify(this._marker.getState());\r\n //console.log('manipulationStartState', this.manipulationStartState);\r\n }\r\n\r\n /**\r\n * Deselects this marker and hides selected marker UI.\r\n */\r\n public deselect(): void {\r\n this.container.style.cursor = 'default';\r\n this._isSelected = false;\r\n this.stateChanged();\r\n }\r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) down event.\r\n *\r\n * @param point - event coordinates.\r\n * @param target - direct event target element.\r\n * @param ev - pointer event.\r\n */\r\n // prettier-ignore\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function\r\n public pointerDown(point: IPoint, target?: EventTarget, ev?: PointerEvent): void {}\r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) double click event.\r\n *\r\n * @param point - event coordinates.\r\n * @param target - direct event target element.\r\n * @param ev - pointer event.\r\n */\r\n // prettier-ignore\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function\r\n public dblClick(point: IPoint, target?: EventTarget, ev?: MouseEvent): void {}\r\n\r\n /**\r\n * Handles marker manipulation (move, resize, rotate, etc.).\r\n *\r\n * @param point - event coordinates.\r\n * @param ev - pointer event.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function\r\n public manipulate(point: IPoint, ev?: PointerEvent): void {}\r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) up event.\r\n *\r\n * @param point - event coordinates.\r\n * @param ev - pointer event.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function\r\n public pointerUp(point: IPoint, ev?: PointerEvent): void {}\r\n\r\n /**\r\n * Disposes the marker and clean's up.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n public dispose(): void {}\r\n\r\n /**\r\n * Adjusts marker's control box.\r\n */\r\n protected adjustControlBox() {}\r\n\r\n /**\r\n * Scales the marker and the editor.\r\n *\r\n * @param scaleX\r\n * @param scaleY\r\n */\r\n public scale(scaleX: number, scaleY: number): void {\r\n this._marker.scale(scaleX, scaleY);\r\n\r\n this.adjustControlBox();\r\n }\r\n\r\n /**\r\n * Called by a marker when its state could have changed.\r\n * Does a check if the state has indeed changed before firing the handler.\r\n */\r\n protected stateChanged(): void {\r\n if (\r\n this.onStateChanged &&\r\n this.state !== 'creating' &&\r\n this.state !== 'new'\r\n ) {\r\n const currentState = JSON.stringify(this._marker.getState());\r\n // console.log('currentState', currentState);\r\n // @todo - check if this is needed\r\n // avoid reacting to state (mode) differences\r\n // if (this.manipulationStartState !== undefined) {\r\n // this.manipulationStartState.state = 'select';\r\n // }\r\n // currentState.state = 'select';\r\n if (this.manipulationStartState != currentState) {\r\n this.manipulationStartState = currentState;\r\n this.onStateChanged(this);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Returns marker's state that can be restored in the future.\r\n *\r\n * @returns\r\n */\r\n public getState(): MarkerBaseState {\r\n return this.marker.getState();\r\n }\r\n\r\n /**\r\n * Restores previously saved marker state.\r\n *\r\n * @param state - previously saved state.\r\n */\r\n public restoreState(state: MarkerBaseState): void {\r\n this._state = 'select';\r\n this.marker.restoreState(state);\r\n this.adjustControlBox();\r\n }\r\n}\r\n","import { SvgHelper } from '../core/SvgHelper';\r\n\r\n/**\r\n * Represents location of the manipulation grips.\r\n */\r\nexport type GripLocation =\r\n | 'topleft'\r\n | 'topcenter'\r\n | 'topright'\r\n | 'leftcenter'\r\n | 'rightcenter'\r\n | 'bottomleft'\r\n | 'bottomcenter'\r\n | 'bottomright';\r\n\r\n/**\r\n * Represents a single resize-manipulation grip used in marker's manipulation controls.\r\n */\r\nexport class Grip {\r\n /**\r\n * Grip's visual element.\r\n */\r\n protected _visual?: SVGGraphicsElement;\r\n /**\r\n * Grip's visual element.\r\n */\r\n public get visual(): SVGGraphicsElement {\r\n if (!this._visual) {\r\n this.createVisual();\r\n }\r\n return this._visual!;\r\n }\r\n\r\n /**\r\n * Grip's size (radius).\r\n */\r\n public gripSize = 5;\r\n\r\n /**\r\n * Grip's fill color.\r\n */\r\n public fillColor = 'rgba(255,255,255,0.9)';\r\n /**\r\n * Grip's stroke color.\r\n */\r\n public strokeColor = '#0ea5e9';\r\n\r\n /**\r\n * Creates a new grip.\r\n */\r\n constructor() {\r\n this.createVisual = this.createVisual.bind(this);\r\n }\r\n\r\n /**\r\n * Creates grip's visual.\r\n */\r\n protected createVisual() {\r\n this._visual = SvgHelper.createGroup();\r\n this._visual.appendChild(\r\n SvgHelper.createCircle(this.gripSize * 2, [\r\n ['fill', 'transparent'],\r\n ['cx', (this.gripSize / 2).toString()],\r\n ['cy', (this.gripSize / 2).toString()],\r\n ]),\r\n );\r\n const visual = SvgHelper.createCircle(this.gripSize, [\r\n ['fill-opacity', '1'],\r\n ['stroke-width', '1'],\r\n ['stroke-opacity', '1'],\r\n ]);\r\n visual.style.fill = `var(--mjs-grip-fill, ${this.fillColor})`;\r\n visual.style.stroke = `var(--mjs-grip-stroke, ${this.strokeColor})`;\r\n visual.style.filter = 'drop-shadow(0px 0px 2px rgba(0, 0, 0, .7))';\r\n this._visual.appendChild(visual);\r\n }\r\n\r\n /**\r\n * Returns true if passed SVG element belongs to the grip. False otherwise.\r\n *\r\n * @param el - target element.\r\n */\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (el === this._visual) {\r\n return true;\r\n } else {\r\n let found = false;\r\n this._visual?.childNodes.forEach((child) => {\r\n if (child === el) {\r\n found = true;\r\n }\r\n });\r\n return found;\r\n }\r\n }\r\n}\r\n","import { Grip } from './Grip';\r\n\r\n/**\r\n * Represents a resize grip.\r\n */\r\nexport class ResizeGrip extends Grip {}\r\n","import { IPoint, PolygonMarker, SvgHelper } from '../core';\r\nimport { MarkerBaseEditor } from './MarkerBaseEditor';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { ResizeGrip } from './ResizeGrip';\r\n\r\n/**\r\n * Editor for polygon markers.\r\n *\r\n * @summary Polygon marker editor.\r\n * @group Editors\r\n */\r\nexport class PolygonMarkerEditor<\r\n TMarkerType extends PolygonMarker = PolygonMarker,\r\n> extends MarkerBaseEditor<TMarkerType> {\r\n /**\r\n * Default line length when marker is created with a simple click (without dragging).\r\n */\r\n protected defaultLength = 50;\r\n\r\n /**\r\n * Pointer X coordinate at the start of move or resize.\r\n */\r\n protected manipulationStartX = 0;\r\n /**\r\n * Pointer Y coordinate at the start of move or resize.\r\n */\r\n protected manipulationStartY = 0;\r\n\r\n /**\r\n * Container for control elements.\r\n */\r\n protected controlBox: SVGGElement = SvgHelper.createGroup();\r\n /**\r\n * Container for manipulation grips.\r\n */\r\n protected manipulationBox: SVGGElement = SvgHelper.createGroup();\r\n\r\n /**\r\n * Array of manipulation grips.\r\n */\r\n protected grips: ResizeGrip[] = [];\r\n /**\r\n * Active manipulation grip.\r\n */\r\n protected activeGrip?: ResizeGrip;\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this.ownsTarget = this.ownsTarget.bind(this);\r\n\r\n this.setupControlBox = this.setupControlBox.bind(this);\r\n this.adjustControlBox = this.adjustControlBox.bind(this);\r\n\r\n this.adjustControlGrips = this.adjustControlGrips.bind(this);\r\n this.createGrip = this.createGrip.bind(this);\r\n this.positionGrip = this.positionGrip.bind(this);\r\n this.positionGrips = this.positionGrips.bind(this);\r\n\r\n this.resize = this.resize.bind(this);\r\n\r\n this.manipulate = this.manipulate.bind(this);\r\n this.pointerDown = this.pointerDown.bind(this);\r\n this.pointerUp = this.pointerUp.bind(this);\r\n\r\n this.setupControlBox();\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this.marker.ownsTarget(el)) {\r\n return true;\r\n } else if (this.grips.some((grip) => grip.ownsTarget(el))) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public override pointerDown(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: PointerEvent,\r\n ): void {\r\n super.pointerDown(point, target, ev);\r\n\r\n this.manipulationStartX = point.x;\r\n this.manipulationStartY = point.y;\r\n\r\n if (this.state === 'new') {\r\n this.startCreation(point);\r\n } else if (this._state === 'creating') {\r\n if (this.grips.length > 0 && target && this.grips[0].ownsTarget(target)) {\r\n this.finishCreation();\r\n } else {\r\n this.addNewPointWhileCreating(point);\r\n }\r\n } else {\r\n this.select(this.isMultiSelected);\r\n this.activeGrip =\r\n target && this.grips.find((grip) => grip.ownsTarget(target));\r\n\r\n if (this.activeGrip) {\r\n this._state = 'resize';\r\n } else {\r\n this._state = 'move';\r\n }\r\n }\r\n }\r\n\r\n private startCreation(point: IPoint) {\r\n this.marker.stage = 'creating';\r\n this.marker.points.push(point);\r\n this.marker.points.push(point);\r\n this.marker.createVisual();\r\n this.marker.adjustVisual();\r\n this.adjustControlGrips();\r\n\r\n this.activeGrip = this.grips.at(-1);\r\n if (this.activeGrip) {\r\n this.activeGrip.visual.style.pointerEvents = 'none';\r\n }\r\n\r\n this._state = 'creating';\r\n }\r\n\r\n private addNewPointWhileCreating(point: IPoint) {\r\n this.marker.points.push(point);\r\n this.marker.adjustVisual();\r\n this.adjustControlGrips();\r\n this.activeGrip = this.grips.at(-1);\r\n if (this.activeGrip) {\r\n this.activeGrip.visual.style.pointerEvents = 'none';\r\n }\r\n }\r\n\r\n private finishCreation() {\r\n this.marker.stage = 'normal';\r\n // connected the last point with the first one\r\n // remove the first point and adjust grips\r\n this.marker.points.splice(0, 1);\r\n this.marker.adjustVisual();\r\n this.adjustControlGrips();\r\n this.grips.forEach((grip) => {\r\n grip.visual.style.pointerEvents = '';\r\n });\r\n\r\n this._state = 'select';\r\n if (this.onMarkerCreated) {\r\n this.onMarkerCreated(this);\r\n }\r\n }\r\n\r\n public override pointerUp(point: IPoint, ev?: PointerEvent): void {\r\n super.pointerUp(point, ev);\r\n this.manipulate(point, ev);\r\n if (this._state !== 'creating') {\r\n this._state = 'select';\r\n }\r\n this.stateChanged();\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public override manipulate(point: IPoint, ev?: PointerEvent): void {\r\n if (this.state === 'creating') {\r\n this.resize(point);\r\n } else if (this.state === 'move') {\r\n this.marker.points.forEach((p) => {\r\n p.x += point.x - this.manipulationStartX;\r\n p.y += point.y - this.manipulationStartY;\r\n });\r\n this.manipulationStartX = point.x;\r\n this.manipulationStartY = point.y;\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n } else if (this.state === 'resize') {\r\n this.resize(point);\r\n }\r\n }\r\n\r\n protected resize(point: IPoint): void {\r\n const activeGripIndex = this.activeGrip\r\n ? this.grips.indexOf(this.activeGrip)\r\n : -1;\r\n if (activeGripIndex >= 0) {\r\n this.marker.points[activeGripIndex] = point;\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n }\r\n }\r\n\r\n public override dblClick(\r\n point: IPoint,\r\n target?: EventTarget,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n ev?: MouseEvent,\r\n ): void {\r\n if (target && this.state === 'select') {\r\n const selectorLineIndex = this.marker.selectorVisualLines.findIndex(\r\n (l) => l === target,\r\n );\r\n if (selectorLineIndex > -1) {\r\n this.marker.points.splice(selectorLineIndex + 1, 0, point);\r\n this.marker.adjustVisual();\r\n this.adjustControlGrips();\r\n } else {\r\n const gripIndex = this.grips.findIndex((g) => g.ownsTarget(target));\r\n if (gripIndex > -1) {\r\n this.marker.points.splice(gripIndex, 1);\r\n this.marker.adjustVisual();\r\n this.adjustControlGrips();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates control box for manipulation controls.\r\n */\r\n protected setupControlBox(): void {\r\n this.controlBox = SvgHelper.createGroup();\r\n this.container.appendChild(this.controlBox);\r\n this.manipulationBox = SvgHelper.createGroup();\r\n this.controlBox.appendChild(this.manipulationBox);\r\n\r\n this.adjustControlGrips();\r\n\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n protected adjustControlBox() {\r\n // this.positionGrips();\r\n this.adjustControlGrips();\r\n }\r\n\r\n /**\r\n * Adds control grips to control box.\r\n */\r\n protected adjustControlGrips(): void {\r\n const noOfMissingGrips = this.marker.points.length - this.grips.length;\r\n if (noOfMissingGrips > 0) {\r\n for (let i = 0; i < noOfMissingGrips; i++) {\r\n this.grips.push(this.createGrip());\r\n }\r\n } else if (noOfMissingGrips < 0) {\r\n for (let i = 0; i < -noOfMissingGrips; i++) {\r\n const grip = this.grips.pop();\r\n if (grip) {\r\n this.manipulationBox.removeChild(grip.visual);\r\n }\r\n }\r\n }\r\n\r\n this.positionGrips();\r\n }\r\n\r\n /**\r\n * Creates manipulation grip.\r\n * @returns - manipulation grip.\r\n */\r\n protected createGrip(): ResizeGrip {\r\n const grip = new ResizeGrip();\r\n grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n this.manipulationBox.appendChild(grip.visual);\r\n\r\n return grip;\r\n }\r\n\r\n /**\r\n * Updates manipulation grip layout.\r\n */\r\n protected positionGrips(): void {\r\n this.grips.forEach((grip, i) => {\r\n const point = this.marker.points[i];\r\n this.positionGrip(\r\n grip.visual,\r\n point.x - grip.gripSize / 2,\r\n point.y - grip.gripSize / 2,\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Positions manipulation grip.\r\n * @param grip - grip to position\r\n * @param x - new X coordinate\r\n * @param y - new Y coordinate\r\n */\r\n protected positionGrip(grip: SVGGraphicsElement, x: number, y: number): void {\r\n const translate = grip.transform.baseVal.getItem(0);\r\n translate.setTranslate(x, y);\r\n grip.transform.baseVal.replaceItem(translate, 0);\r\n }\r\n\r\n public select(multi = false): void {\r\n super.select(multi);\r\n this.adjustControlBox();\r\n this.manipulationBox.style.display = multi ? 'none' : '';\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n public deselect(): void {\r\n super.deselect();\r\n this.controlBox.style.display = 'none';\r\n if (this.state === 'creating') {\r\n this.finishCreation();\r\n }\r\n }\r\n}\r\n","import { IPoint, LinearMarkerBase, SvgHelper } from '../core';\r\nimport { MarkerBaseEditor } from './MarkerBaseEditor';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { ResizeGrip } from './ResizeGrip';\r\n\r\n/**\r\n * Editor for linear markers.\r\n *\r\n * @summary Editor for line-like markers.\r\n * @group Editors\r\n */\r\nexport class LinearMarkerEditor<\r\n TMarkerType extends LinearMarkerBase = LinearMarkerBase,\r\n> extends MarkerBaseEditor<TMarkerType> {\r\n /**\r\n * Default line length when marker is created with a simple click (without dragging).\r\n */\r\n protected defaultLength = 50;\r\n\r\n /**\r\n * Pointer X coordinate at the start of move or resize.\r\n */\r\n protected manipulationStartX = 0;\r\n /**\r\n * Pointer Y coordinate at the start of move or resize.\r\n */\r\n protected manipulationStartY = 0;\r\n\r\n private manipulationStartX1 = 0;\r\n private manipulationStartY1 = 0;\r\n private manipulationStartX2 = 0;\r\n private manipulationStartY2 = 0;\r\n\r\n /**\r\n * Container for manipulation grips.\r\n */\r\n protected manipulationBox: SVGGElement = SvgHelper.createGroup();\r\n\r\n /**\r\n * First manipulation grip\r\n */\r\n protected grip1?: ResizeGrip;\r\n /**\r\n * Second manipulation grip.\r\n */\r\n protected grip2?: ResizeGrip;\r\n /**\r\n * Active manipulation grip.\r\n */\r\n protected activeGrip?: ResizeGrip;\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this.ownsTarget = this.ownsTarget.bind(this);\r\n\r\n this.setupControlBox = this.setupControlBox.bind(this);\r\n this.adjustControlBox = this.adjustControlBox.bind(this);\r\n\r\n this.addControlGrips = this.addControlGrips.bind(this);\r\n this.createGrip = this.createGrip.bind(this);\r\n this.positionGrip = this.positionGrip.bind(this);\r\n this.positionGrips = this.positionGrips.bind(this);\r\n\r\n this.resize = this.resize.bind(this);\r\n\r\n this.manipulate = this.manipulate.bind(this);\r\n this.pointerDown = this.pointerDown.bind(this);\r\n this.pointerUp = this.pointerUp.bind(this);\r\n\r\n this.setupControlBox();\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this.marker.ownsTarget(el)) {\r\n return true;\r\n } else if (this.grip1?.ownsTarget(el) || this.grip2?.ownsTarget(el)) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public override pointerDown(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: PointerEvent,\r\n ): void {\r\n super.pointerDown(point, target, ev);\r\n\r\n this.manipulationStartX = point.x;\r\n this.manipulationStartY = point.y;\r\n\r\n if (this.state === 'new') {\r\n this.marker.x1 = point.x;\r\n this.marker.y1 = point.y;\r\n this.marker.x2 = point.x;\r\n this.marker.y2 = point.y;\r\n }\r\n\r\n this.manipulationStartX1 = this.marker.x1;\r\n this.manipulationStartY1 = this.marker.y1;\r\n this.manipulationStartX2 = this.marker.x2;\r\n this.manipulationStartY2 = this.marker.y2;\r\n\r\n if (this.state === 'new') {\r\n this.marker.createVisual();\r\n this.marker.adjustVisual();\r\n\r\n this._state = 'creating';\r\n } else {\r\n this.select(this.isMultiSelected);\r\n if (target && this.grip1?.ownsTarget(target)) {\r\n this.activeGrip = this.grip1;\r\n } else if (target && this.grip2?.ownsTarget(target)) {\r\n this.activeGrip = this.grip2;\r\n } else {\r\n this.activeGrip = undefined;\r\n }\r\n\r\n if (this.activeGrip) {\r\n this._state = 'resize';\r\n } else {\r\n this._state = 'move';\r\n }\r\n }\r\n }\r\n\r\n public override pointerUp(point: IPoint, ev?: PointerEvent): void {\r\n const inState = this.state;\r\n super.pointerUp(point, ev);\r\n if (\r\n this.state === 'creating' &&\r\n Math.abs(this.marker.x1 - this.marker.x2) < 10 &&\r\n Math.abs(this.marker.y1 - this.marker.y2) < 10\r\n ) {\r\n this.marker.x2 = this.marker.x1 + this.defaultLength;\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n } else {\r\n this.manipulate(point, ev);\r\n }\r\n this._state = 'select';\r\n if (inState === 'creating' && this.onMarkerCreated) {\r\n this.onMarkerCreated(this);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public override manipulate(point: IPoint, ev?: PointerEvent): void {\r\n if (this.state === 'creating') {\r\n this.resize(point);\r\n } else if (this.state === 'move') {\r\n this.marker.x1 =\r\n this.manipulationStartX1 + point.x - this.manipulationStartX;\r\n this.marker.y1 =\r\n this.manipulationStartY1 + point.y - this.manipulationStartY;\r\n this.marker.x2 =\r\n this.manipulationStartX2 + point.x - this.manipulationStartX;\r\n this.marker.y2 =\r\n this.manipulationStartY2 + point.y - this.manipulationStartY;\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n } else if (this.state === 'resize') {\r\n this.resize(point);\r\n }\r\n }\r\n\r\n protected resize(point: IPoint): void {\r\n switch (this.activeGrip) {\r\n case this.grip1:\r\n this.marker.x1 = point.x;\r\n this.marker.y1 = point.y;\r\n break;\r\n case this.grip2:\r\n case undefined:\r\n this.marker.x2 = point.x;\r\n this.marker.y2 = point.y;\r\n break;\r\n }\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n }\r\n\r\n /**\r\n * Creates control box for manipulation controls.\r\n */\r\n protected setupControlBox(): void {\r\n this.container.appendChild(this._controlBox);\r\n this.manipulationBox = SvgHelper.createGroup();\r\n this._controlBox.appendChild(this.manipulationBox);\r\n\r\n this.addControlGrips();\r\n\r\n this._controlBox.style.display = 'none';\r\n }\r\n\r\n protected adjustControlBox() {\r\n this.positionGrips();\r\n }\r\n\r\n /**\r\n * Adds control grips to control box.\r\n */\r\n protected addControlGrips(): void {\r\n this.grip1 = this.createGrip();\r\n this.grip2 = this.createGrip();\r\n\r\n this.positionGrips();\r\n }\r\n\r\n /**\r\n * Creates manipulation grip.\r\n * @returns - manipulation grip.\r\n */\r\n protected createGrip(): ResizeGrip {\r\n const grip = new ResizeGrip();\r\n grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n this.manipulationBox.appendChild(grip.visual);\r\n\r\n return grip;\r\n }\r\n\r\n /**\r\n * Updates manipulation grip layout.\r\n */\r\n protected positionGrips(): void {\r\n if (this.grip1 && this.grip2) {\r\n const gripSize = this.grip1.gripSize;\r\n\r\n this.positionGrip(\r\n this.grip1.visual,\r\n this.marker.x1 - gripSize / 2,\r\n this.marker.y1 - gripSize / 2,\r\n );\r\n this.positionGrip(\r\n this.grip2.visual,\r\n this.marker.x2 - gripSize / 2,\r\n this.marker.y2 - gripSize / 2,\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Positions manipulation grip.\r\n * @param grip - grip to position\r\n * @param x - new X coordinate\r\n * @param y - new Y coordinate\r\n */\r\n protected positionGrip(grip: SVGGraphicsElement, x: number, y: number): void {\r\n const translate = grip.transform.baseVal.getItem(0);\r\n translate.setTranslate(x, y);\r\n grip.transform.baseVal.replaceItem(translate, 0);\r\n }\r\n\r\n public select(multi = false): void {\r\n super.select(multi);\r\n this.adjustControlBox();\r\n this.manipulationBox.style.display = multi ? 'none' : '';\r\n this._controlBox.style.display = '';\r\n }\r\n\r\n public deselect(): void {\r\n super.deselect();\r\n this._controlBox.style.display = 'none';\r\n }\r\n}\r\n","import { GripLocation } from './Grip';\r\nimport { ResizeGrip } from './ResizeGrip';\r\n\r\n/**\r\n * RectangularBoxMarkerGrips is a set of resize/rotation grips for a rectangular marker.\r\n */\r\nexport class RectangularBoxMarkerGrips {\r\n public grips = new Map<GripLocation, ResizeGrip>([\r\n ['topleft', new ResizeGrip()],\r\n ['topcenter', new ResizeGrip()],\r\n ['topright', new ResizeGrip()],\r\n ['leftcenter', new ResizeGrip()],\r\n ['rightcenter', new ResizeGrip()],\r\n ['bottomleft', new ResizeGrip()],\r\n ['bottomcenter', new ResizeGrip()],\r\n ['bottomright', new ResizeGrip()],\r\n ]);\r\n /**\r\n * Creates a new marker grip set.\r\n */\r\n constructor() {\r\n this.findGripByVisual = this.findGripByVisual.bind(this);\r\n }\r\n\r\n /**\r\n * Returns a marker grip owning the specified visual.\r\n * @param gripVisual - visual for owner to be determined.\r\n */\r\n public findGripByVisual(gripVisual: EventTarget): ResizeGrip | undefined {\r\n for (const grip of this.grips.values()) {\r\n if (grip.ownsTarget(gripVisual)) {\r\n return grip;\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Returns a grip by its location.\r\n * @param location\r\n * @returns\r\n */\r\n public getGrip(location: GripLocation): ResizeGrip {\r\n return this.grips.get(location)!;\r\n }\r\n}\r\n","import { Grip } from './Grip';\r\n\r\n/**\r\n * Represents a rotation grip.\r\n */\r\nexport class RotateGrip extends Grip {\r\n constructor() {\r\n super();\r\n // swap fill and stroke colors\r\n const oldFill = this.fillColor;\r\n this.fillColor = this.strokeColor;\r\n this.strokeColor = oldFill;\r\n }\r\n}\r\n","import { IPoint, RectangularBoxMarkerBase, SvgHelper } from '../core';\r\nimport { Grip, GripLocation } from './Grip';\r\nimport { MarkerBaseEditor } from './MarkerBaseEditor';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { RectangularBoxMarkerGrips } from './RectangularBoxMarkerGrips';\r\nimport { RotateGrip } from './RotateGrip';\r\n\r\n/**\r\n * Base editor for markers that can be represented by a rectangular area.\r\n *\r\n * @summary Base editor for markers that can be represented by a rectangular area.\r\n * @group Editors\r\n */\r\nexport class RectangularBoxMarkerBaseEditor<\r\n TMarkerType extends RectangularBoxMarkerBase = RectangularBoxMarkerBase,\r\n> extends MarkerBaseEditor<TMarkerType> {\r\n /**\r\n * x coordinate of the top-left corner at the start of manipulation.\r\n */\r\n protected manipulationStartLeft = 0;\r\n /**\r\n * y coordinate of the top-left corner at the start of manipulation.\r\n */\r\n protected manipulationStartTop = 0;\r\n /**\r\n * Width at the start of manipulation.\r\n */\r\n protected manipulationStartWidth = 0;\r\n /**\r\n * Height at the start of manipulation.\r\n */\r\n protected manipulationStartHeight = 0;\r\n\r\n /**\r\n * x coordinate of the pointer at the start of manipulation.\r\n */\r\n protected manipulationStartX = 0;\r\n /**\r\n * y coordinate of the pointer at the start of manipulation.\r\n */\r\n protected manipulationStartY = 0;\r\n\r\n /**\r\n * Pointer's horizontal distance from the top left corner.\r\n */\r\n protected offsetX = 0;\r\n /**\r\n * Pointer's vertical distance from the top left corner.\r\n */\r\n protected offsetY = 0;\r\n\r\n /**\r\n * Container for the marker's editing controls.\r\n */\r\n protected controlBox = SvgHelper.createGroup();\r\n /**\r\n * Container for the marker's manipulation grips.\r\n */\r\n protected manipulationBox = SvgHelper.createGroup();\r\n private readonly CB_DISTANCE: number = 0;\r\n private controlRect?: SVGRectElement;\r\n private rotatorGripLine?: SVGLineElement;\r\n\r\n private controlGrips: RectangularBoxMarkerGrips =\r\n new RectangularBoxMarkerGrips();\r\n /**\r\n * Array of disabled resize grips.\r\n *\r\n * Use this in derived classes to disable specific resize grips.\r\n */\r\n protected disabledResizeGrips: GripLocation[] = [];\r\n private rotatorGrip?: RotateGrip;\r\n /**\r\n * Active grip during manipulation\r\n */\r\n protected activeGrip?: Grip;\r\n private disableRotation = false;\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this.setupControlBox();\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this._marker.ownsTarget(el)) {\r\n return true;\r\n } else if (\r\n this.controlGrips?.findGripByVisual(el) !== undefined ||\r\n (this.rotatorGrip !== undefined && this.rotatorGrip.ownsTarget(el))\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public override pointerDown(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: PointerEvent,\r\n ): void {\r\n super.pointerDown(point, target, ev);\r\n\r\n if (this.state === 'new') {\r\n this.marker.left = point.x;\r\n this.marker.top = point.y;\r\n }\r\n\r\n this.manipulationStartLeft = this.marker.left;\r\n this.manipulationStartTop = this.marker.top;\r\n this.manipulationStartWidth = this.marker.width;\r\n this.manipulationStartHeight = this.marker.height;\r\n\r\n const rotatedPoint = this.marker.unrotatePoint(point);\r\n this.manipulationStartX = rotatedPoint.x;\r\n this.manipulationStartY = rotatedPoint.y;\r\n\r\n this.offsetX = rotatedPoint.x - this.marker.left;\r\n this.offsetY = rotatedPoint.y - this.marker.top;\r\n\r\n if (this.state !== 'new') {\r\n this.select(this.isMultiSelected);\r\n this.activeGrip = this.controlGrips?.findGripByVisual(\r\n target as SVGGraphicsElement,\r\n );\r\n if (this.activeGrip !== undefined) {\r\n this._state = 'resize';\r\n } else if (\r\n this.rotatorGrip !== undefined &&\r\n target !== undefined &&\r\n this.rotatorGrip.ownsTarget(target)\r\n ) {\r\n this.activeGrip = this.rotatorGrip;\r\n\r\n const rotatedCenter = this.marker.rotatePoint({\r\n x: this.marker.centerX,\r\n y: this.marker.centerY,\r\n });\r\n this.marker.left = rotatedCenter.x - this.marker.width / 2;\r\n this.marker.top = rotatedCenter.y - this.marker.height / 2;\r\n this.marker.moveVisual({ x: this.marker.left, y: this.marker.top });\r\n\r\n const rotate = this.container.transform.baseVal.getItem(0);\r\n rotate.setRotate(\r\n this.marker.rotationAngle,\r\n this.marker.centerX,\r\n this.marker.centerY,\r\n );\r\n this.container.transform.baseVal.replaceItem(rotate, 0);\r\n\r\n this.adjustControlBox();\r\n\r\n this._state = 'rotate';\r\n } else {\r\n this._state = 'move';\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * When set to true marker created event will not be triggered.\r\n */\r\n protected _suppressMarkerCreateEvent = false;\r\n\r\n public override pointerUp(point: IPoint, ev?: PointerEvent): void {\r\n const inState = this.state;\r\n super.pointerUp(point, ev);\r\n if (\r\n this.state === 'creating' &&\r\n this.marker.width < 10 &&\r\n this.marker.height < 10\r\n ) {\r\n this.marker.width = this.marker.defaultSize.width;\r\n this.marker.height = this.marker.defaultSize.height;\r\n } else {\r\n this.manipulate(point, ev);\r\n }\r\n this._state = 'select';\r\n if (\r\n inState === 'creating' &&\r\n this.onMarkerCreated &&\r\n this._suppressMarkerCreateEvent === false\r\n ) {\r\n this.onMarkerCreated(this);\r\n }\r\n this.stateChanged();\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public override manipulate(point: IPoint, ev?: PointerEvent): void {\r\n const rotatedPoint = this.marker.unrotatePoint(point);\r\n\r\n if (this.state === 'creating') {\r\n this.resize(point, ev?.shiftKey);\r\n } else if (this.state === 'move') {\r\n this.marker.left =\r\n this.manipulationStartLeft +\r\n (rotatedPoint.x - this.manipulationStartLeft) -\r\n this.offsetX;\r\n this.marker.top =\r\n this.manipulationStartTop +\r\n (rotatedPoint.y - this.manipulationStartTop) -\r\n this.offsetY;\r\n this.marker.moveVisual({ x: this.marker.left, y: this.marker.top });\r\n this.adjustControlBox();\r\n } else if (this.state === 'resize') {\r\n this.resize(rotatedPoint, ev?.shiftKey);\r\n } else if (this.state === 'rotate') {\r\n this.marker.rotate(point);\r\n }\r\n }\r\n\r\n protected resize(point: IPoint, preserveAspectRatio = false): void {\r\n let newX = this.manipulationStartLeft;\r\n let newWidth = this.manipulationStartWidth;\r\n let newY = this.manipulationStartTop;\r\n let newHeight = this.manipulationStartHeight;\r\n\r\n const deltaX = point.x - this.manipulationStartX;\r\n const deltaY = point.y - this.manipulationStartY;\r\n if (preserveAspectRatio) {\r\n const aspectRatio =\r\n this.manipulationStartWidth !== 0 && this.manipulationStartHeight !== 0\r\n ? this.manipulationStartWidth / this.manipulationStartHeight\r\n : 1;\r\n switch (this.activeGrip) {\r\n // undefined when creating a new marker\r\n case this.controlGrips.getGrip('bottomright'):\r\n case undefined: {\r\n newWidth = this.manipulationStartWidth + Math.max(deltaX, deltaY);\r\n newHeight =\r\n this.manipulationStartHeight +\r\n Math.max(deltaX, deltaY) / aspectRatio;\r\n break;\r\n }\r\n case this.controlGrips.getGrip('bottomcenter'): {\r\n newWidth = this.manipulationStartWidth + deltaY;\r\n newHeight = this.manipulationStartHeight + deltaY / aspectRatio;\r\n newX = this.manipulationStartLeft - deltaY / 2;\r\n break;\r\n }\r\n case this.controlGrips.getGrip('bottomleft'): {\r\n newWidth = this.manipulationStartWidth + Math.max(-deltaX, deltaY);\r\n newHeight =\r\n this.manipulationStartHeight +\r\n Math.max(-deltaX, deltaY) / aspectRatio;\r\n newX = this.manipulationStartLeft - Math.max(-deltaX, deltaY);\r\n break;\r\n }\r\n case this.controlGrips.getGrip('leftcenter'): {\r\n newWidth = this.manipulationStartWidth - deltaX;\r\n newHeight = this.manipulationStartHeight - deltaX / aspectRatio;\r\n newX = this.manipulationStartLeft + deltaX;\r\n newY = this.manipulationStartTop + deltaX / aspectRatio / 2;\r\n break;\r\n }\r\n case this.controlGrips.getGrip('topleft'): {\r\n newWidth = this.manipulationStartWidth + Math.max(-deltaX, -deltaY);\r\n newHeight =\r\n this.manipulationStartHeight +\r\n Math.max(-deltaX, -deltaY) / aspectRatio;\r\n newX = this.manipulationStartLeft - Math.max(-deltaX, -deltaY);\r\n newY =\r\n this.manipulationStartTop -\r\n Math.max(-deltaX, -deltaY) / aspectRatio;\r\n break;\r\n }\r\n case this.controlGrips.getGrip('topcenter'): {\r\n newWidth = this.manipulationStartWidth - deltaY;\r\n newHeight = this.manipulationStartHeight - deltaY / aspectRatio;\r\n newX = this.manipulationStartLeft + deltaY / 2;\r\n newY = this.manipulationStartTop + deltaY / aspectRatio;\r\n break;\r\n }\r\n case this.controlGrips.getGrip('topright'): {\r\n newWidth = this.manipulationStartWidth + Math.max(deltaX, -deltaY);\r\n newHeight =\r\n this.manipulationStartHeight +\r\n Math.max(deltaX, -deltaY) / aspectRatio;\r\n newY =\r\n this.manipulationStartTop - Math.max(deltaX, -deltaY) / aspectRatio;\r\n break;\r\n }\r\n case this.controlGrips.getGrip('rightcenter'): {\r\n newWidth = this.manipulationStartWidth + deltaX;\r\n newHeight = this.manipulationStartHeight + deltaX / aspectRatio;\r\n newY = this.manipulationStartTop - deltaX / aspectRatio / 2;\r\n break;\r\n }\r\n }\r\n } else {\r\n // free form resizing\r\n switch (this.activeGrip) {\r\n case this.controlGrips.getGrip('bottomleft'):\r\n case this.controlGrips.getGrip('leftcenter'):\r\n case this.controlGrips.getGrip('topleft'):\r\n newX = this.manipulationStartLeft + point.x - this.manipulationStartX;\r\n newWidth =\r\n this.manipulationStartWidth + this.manipulationStartLeft - newX;\r\n break;\r\n case this.controlGrips.getGrip('bottomright'):\r\n case this.controlGrips.getGrip('rightcenter'):\r\n case this.controlGrips.getGrip('topright'):\r\n case undefined:\r\n newWidth =\r\n this.manipulationStartWidth + point.x - this.manipulationStartX;\r\n break;\r\n }\r\n\r\n switch (this.activeGrip) {\r\n case this.controlGrips.getGrip('topcenter'):\r\n case this.controlGrips.getGrip('topleft'):\r\n case this.controlGrips.getGrip('topright'):\r\n newY = this.manipulationStartTop + point.y - this.manipulationStartY;\r\n newHeight =\r\n this.manipulationStartHeight + this.manipulationStartTop - newY;\r\n break;\r\n case this.controlGrips.getGrip('bottomcenter'):\r\n case this.controlGrips.getGrip('bottomleft'):\r\n case this.controlGrips.getGrip('bottomright'):\r\n case undefined:\r\n newHeight =\r\n this.manipulationStartHeight + point.y - this.manipulationStartY;\r\n break;\r\n }\r\n }\r\n\r\n if (newWidth >= 0) {\r\n this.marker.left = newX;\r\n this.marker.width = newWidth;\r\n } else {\r\n this.marker.left = newX + newWidth;\r\n this.marker.width = -newWidth;\r\n }\r\n if (newHeight >= 0) {\r\n this.marker.top = newY;\r\n this.marker.height = newHeight;\r\n } else {\r\n this.marker.top = newY + newHeight;\r\n this.marker.height = -newHeight;\r\n }\r\n\r\n this.setSize();\r\n }\r\n\r\n /**\r\n * Sets control box size and location.\r\n */\r\n protected setSize(): void {\r\n this.marker.setSize();\r\n this.adjustControlBox();\r\n }\r\n\r\n public select(multi = false): void {\r\n super.select(multi);\r\n this.adjustControlBox();\r\n this.manipulationBox.style.display = multi ? 'none' : '';\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n public deselect(): void {\r\n super.deselect();\r\n this.controlBox.style.display = 'none';\r\n }\r\n\r\n /**\r\n * Creates control box for manipulation controls.\r\n */\r\n protected setupControlBox() {\r\n this.controlBox = SvgHelper.createGroup();\r\n const translate = SvgHelper.createTransform();\r\n translate.setTranslate(-this.CB_DISTANCE / 2, -this.CB_DISTANCE / 2);\r\n this.controlBox.transform.baseVal.appendItem(translate);\r\n\r\n this.container.appendChild(this.controlBox);\r\n\r\n this.manipulationBox = SvgHelper.createGroup();\r\n this.controlBox.appendChild(this.manipulationBox);\r\n\r\n this.controlRect = SvgHelper.createRect(\r\n this.marker.width + this.CB_DISTANCE,\r\n this.marker.height + this.CB_DISTANCE,\r\n [\r\n ['stroke', 'black'],\r\n ['stroke-width', '1'],\r\n ['stroke-opacity', '0.5'],\r\n ['stroke-dasharray', '3, 2'],\r\n ['fill', 'transparent'],\r\n ['pointer-events', 'none'],\r\n ],\r\n );\r\n\r\n this.controlBox.appendChild(this.controlRect);\r\n\r\n if (this.disableRotation !== true) {\r\n this.rotatorGripLine = SvgHelper.createLine(\r\n (this.marker.width + this.CB_DISTANCE * 2) / 2,\r\n this.marker.top - this.CB_DISTANCE,\r\n (this.marker.width + this.CB_DISTANCE * 2) / 2,\r\n this.marker.top - this.CB_DISTANCE * 3,\r\n [\r\n ['stroke', 'black'],\r\n ['stroke-width', '1'],\r\n ['stroke-opacity', '0.5'],\r\n ['stroke-dasharray', '3, 2'],\r\n ],\r\n );\r\n this.rotatorGripLine.style.filter =\r\n 'drop-shadow(rgba(255, 255, 255, 0.7) 0px 2px 0px)';\r\n\r\n this.manipulationBox.appendChild(this.rotatorGripLine);\r\n }\r\n\r\n this.controlGrips = new RectangularBoxMarkerGrips();\r\n this.addControlGrips();\r\n\r\n this.controlBox.style.display = 'none';\r\n }\r\n\r\n /**\r\n * Adjusts control box size and location.\r\n */\r\n protected adjustControlBox() {\r\n const translate = this.controlBox.transform.baseVal.getItem(0);\r\n translate.setTranslate(\r\n this.marker.left - this.CB_DISTANCE / 2,\r\n this.marker.top - this.CB_DISTANCE / 2,\r\n );\r\n this.controlBox.transform.baseVal.replaceItem(translate, 0);\r\n this.controlRect?.setAttribute(\r\n 'width',\r\n (this.marker.width + this.CB_DISTANCE).toString(),\r\n );\r\n this.controlRect?.setAttribute(\r\n 'height',\r\n (this.marker.height + this.CB_DISTANCE).toString(),\r\n );\r\n\r\n if (this.rotatorGripLine !== undefined) {\r\n this.rotatorGripLine.setAttribute(\r\n 'x1',\r\n ((this.marker.width + this.CB_DISTANCE) / 2).toString(),\r\n );\r\n this.rotatorGripLine.setAttribute(\r\n 'y1',\r\n (-this.CB_DISTANCE / 2).toString(),\r\n );\r\n this.rotatorGripLine.setAttribute(\r\n 'x2',\r\n ((this.marker.width + this.CB_DISTANCE) / 2).toString(),\r\n );\r\n this.rotatorGripLine.setAttribute(\r\n 'y2',\r\n (-Math.max(this.CB_DISTANCE * 3, 30)).toString(),\r\n );\r\n }\r\n\r\n this.positionGrips();\r\n }\r\n\r\n /**\r\n * Adds control grips to control box.\r\n */\r\n protected addControlGrips() {\r\n for (const grip of this.controlGrips.grips.values()) {\r\n grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n this.manipulationBox.appendChild(grip.visual);\r\n\r\n this.manipulationBox.appendChild(grip.visual);\r\n }\r\n\r\n if (this.disableRotation !== true) {\r\n this.rotatorGrip = this.createRotateGrip();\r\n }\r\n\r\n this.positionGrips();\r\n }\r\n\r\n // private createResizeGrip(): ResizeGrip {\r\n // const grip = new ResizeGrip();\r\n // grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n // this.controlBox.appendChild(grip.visual);\r\n\r\n // return grip;\r\n // }\r\n\r\n private createRotateGrip(): RotateGrip {\r\n const grip = new RotateGrip();\r\n grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n this.manipulationBox.appendChild(grip.visual);\r\n\r\n return grip;\r\n }\r\n\r\n /**\r\n * Updates manipulation grip layout.\r\n */\r\n protected positionGrips() {\r\n if (this.controlGrips !== undefined) {\r\n const gripSize = this.controlGrips.getGrip('topleft').gripSize ?? 0;\r\n\r\n const left = -gripSize / 2;\r\n const top = left;\r\n const cx = (this.marker.width + this.CB_DISTANCE) / 2 - gripSize / 2;\r\n const cy = (this.marker.height + this.CB_DISTANCE) / 2 - gripSize / 2;\r\n const bottom = this.marker.height + this.CB_DISTANCE - gripSize / 2;\r\n const right = this.marker.width + this.CB_DISTANCE - gripSize / 2;\r\n\r\n this.positionGrip(this.controlGrips.getGrip('topleft').visual, left, top);\r\n this.positionGrip(this.controlGrips.getGrip('topcenter').visual, cx, top);\r\n this.positionGrip(\r\n this.controlGrips.getGrip('topright').visual,\r\n right,\r\n top,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('leftcenter').visual,\r\n left,\r\n cy,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('rightcenter').visual,\r\n right,\r\n cy,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('bottomleft').visual,\r\n left,\r\n bottom,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('bottomcenter').visual,\r\n cx,\r\n bottom,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('bottomright').visual,\r\n right,\r\n bottom,\r\n );\r\n\r\n if (this.rotatorGrip !== undefined) {\r\n const rotatorGripSize = this.rotatorGrip.gripSize ?? 0;\r\n const rtop = -rotatorGripSize / 2;\r\n const rcx =\r\n (this.marker.width + this.CB_DISTANCE) / 2 - rotatorGripSize / 2;\r\n\r\n this.positionGrip(\r\n this.rotatorGrip.visual,\r\n rcx,\r\n rtop - Math.max(this.CB_DISTANCE * 3, 30),\r\n );\r\n }\r\n }\r\n this.adjustGripVisibility();\r\n }\r\n\r\n /**\r\n * Positions specific grip.\r\n * @param grip\r\n * @param x\r\n * @param y\r\n */\r\n protected positionGrip(\r\n grip: SVGGraphicsElement | undefined,\r\n x: number,\r\n y: number,\r\n ) {\r\n if (grip !== undefined) {\r\n const translate = grip.transform.baseVal.getItem(0);\r\n translate.setTranslate(x, y);\r\n grip.transform.baseVal.replaceItem(translate, 0);\r\n }\r\n }\r\n\r\n /**\r\n * Hides marker's editing controls.\r\n */\r\n protected hideControlBox(): void {\r\n this.controlBox.style.display = 'none';\r\n }\r\n /**\r\n * Shows marker's editing controls.\r\n */\r\n protected showControlBox(): void {\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n /**\r\n * Adjusts visibility of resize grips.\r\n */\r\n protected adjustGripVisibility() {\r\n for (const location of this.disabledResizeGrips) {\r\n const grip = this.controlGrips.getGrip(location);\r\n if (grip !== undefined) {\r\n grip.visual.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.adjustControlBox();\r\n }\r\n}\r\n","import { IPoint, ShapeOutlineMarkerBase } from '../core';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { RectangularBoxMarkerBaseEditor } from './RectangularBoxMarkerBaseEditor';\r\n\r\n/**\r\n * Editor for shape outline markers.\r\n *\r\n * @summary Shape outline (unfilled shape) marker editor.\r\n * @group Editors\r\n */\r\nexport class ShapeOutlineMarkerEditor<\r\n TMarkerType extends ShapeOutlineMarkerBase = ShapeOutlineMarkerBase,\r\n> extends RectangularBoxMarkerBaseEditor<TMarkerType> {\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this._creationStyle = 'draw';\r\n }\r\n\r\n public override pointerDown(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: PointerEvent,\r\n ): void {\r\n super.pointerDown(point, target, ev);\r\n if (this.state === 'new') {\r\n this.marker.createVisual();\r\n\r\n this.marker.moveVisual(point);\r\n\r\n this._state = 'creating';\r\n }\r\n }\r\n\r\n protected resize(point: IPoint, preserveAspectRatio = false): void {\r\n super.resize(point, preserveAspectRatio);\r\n this.setSize();\r\n }\r\n\r\n public override pointerUp(point: IPoint, ev?: PointerEvent): void {\r\n super.pointerUp(point, ev);\r\n this.setSize();\r\n }\r\n}\r\n","/**\r\n * Manages undo and redo stacks.\r\n */\r\nexport class UndoRedoManager<T> {\r\n private undoStack: T[] = [];\r\n private redoStack: T[] = [];\r\n\r\n private lastRedoStep?: T;\r\n\r\n /**\r\n * Returns true if there are items in the undo stack.\r\n */\r\n public get isUndoPossible(): boolean {\r\n return this.undoStack.length > 0;\r\n }\r\n\r\n /**\r\n * Returns true if there are items in the redo stack.\r\n */\r\n public get isRedoPossible(): boolean {\r\n return this.redoStack.length > 0;\r\n }\r\n\r\n /**\r\n * Returns the number of items in the undo stack\r\n */\r\n public get undoStepCount(): number {\r\n return this.undoStack.length;\r\n }\r\n\r\n /**\r\n * Returns the number of items in the redo stack\r\n */\r\n public get redoStepCount(): number {\r\n return this.redoStack.length;\r\n }\r\n\r\n /**\r\n * Adds a step to the undo stack.\r\n * @param stepData data representing a state.\r\n */\r\n public addUndoStep(stepData: T): boolean {\r\n if (\r\n this.undoStack.length === 0 ||\r\n JSON.stringify(this.undoStack[this.undoStack.length - 1]) !==\r\n JSON.stringify(stepData)\r\n ) {\r\n this.undoStack.push(JSON.parse(JSON.stringify(stepData)));\r\n if (JSON.stringify(this.lastRedoStep) !== JSON.stringify(stepData)) {\r\n this.redoStack.splice(0, this.redoStack.length);\r\n }\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Replaces the last undo step with step data provided\r\n * @param stepData data representing a state.\r\n */\r\n public replaceLastUndoStep(stepData: T): void {\r\n if (this.undoStack.length > 0) {\r\n this.undoStack[this.undoStack.length - 1] = JSON.parse(\r\n JSON.stringify(stepData),\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Returns the last step in the undo log\r\n */\r\n public getLastUndoStep(): T | undefined {\r\n if (this.undoStack.length > 0) {\r\n return this.undoStack[this.undoStack.length - 1];\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Returns data for the previous step in the undo stack and adds last step to the redo stack.\r\n * @returns\r\n */\r\n public undo(): T | undefined {\r\n if (this.undoStack.length > 1) {\r\n const lastStep = this.undoStack.pop();\r\n if (lastStep !== undefined) {\r\n this.redoStack.push(lastStep);\r\n }\r\n return this.undoStack.length > 0\r\n ? this.undoStack[this.undoStack.length - 1]\r\n : undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Returns most recent item in the redo stack.\r\n * @returns\r\n */\r\n public redo(): T | undefined {\r\n this.lastRedoStep = this.redoStack.pop();\r\n if (this.lastRedoStep !== undefined) {\r\n this.undoStack.push(this.lastRedoStep);\r\n }\r\n return this.lastRedoStep;\r\n }\r\n}\r\n","import { FreehandMarker, IPoint, SvgHelper } from '../core';\r\nimport { MarkerBaseEditor } from './MarkerBaseEditor';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\n\r\n/**\r\n * Editor for freehand markers.\r\n *\r\n * @summary Freehand marker editor.\r\n * @group Editors\r\n */\r\nexport class FreehandMarkerEditor<\r\n TMarkerType extends FreehandMarker = FreehandMarker,\r\n> extends MarkerBaseEditor<TMarkerType> {\r\n /**\r\n * Pointer X coordinate at the start of move or resize.\r\n */\r\n protected manipulationStartX = 0;\r\n /**\r\n * Pointer Y coordinate at the start of move or resize.\r\n */\r\n protected manipulationStartY = 0;\r\n\r\n /**\r\n * Container for control elements.\r\n */\r\n protected controlBox: SVGGElement = SvgHelper.createGroup();\r\n private controlRect?: SVGRectElement;\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this._continuousCreation = true;\r\n\r\n this.ownsTarget = this.ownsTarget.bind(this);\r\n\r\n this.setupControlBox = this.setupControlBox.bind(this);\r\n this.adjustControlBox = this.adjustControlBox.bind(this);\r\n\r\n this.manipulate = this.manipulate.bind(this);\r\n this.pointerDown = this.pointerDown.bind(this);\r\n this.pointerUp = this.pointerUp.bind(this);\r\n\r\n this.setupControlBox();\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (\r\n super.ownsTarget(el) ||\r\n this.marker.ownsTarget(el) ||\r\n el === this.controlRect\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public override pointerDown(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: PointerEvent,\r\n ): void {\r\n super.pointerDown(point, target, ev);\r\n\r\n this.manipulationStartX = point.x;\r\n this.manipulationStartY = point.y;\r\n\r\n if (this.state === 'new') {\r\n this.startCreation(point);\r\n } else if (this.state !== 'move') {\r\n this.select();\r\n this._state = 'move';\r\n }\r\n }\r\n\r\n private startCreation(point: IPoint) {\r\n this.marker.stage = 'creating';\r\n this.marker.points.push(point);\r\n this.marker.createVisual();\r\n this.marker.adjustVisual();\r\n this._state = 'creating';\r\n }\r\n\r\n private addNewPointWhileCreating(point: IPoint) {\r\n this.marker.points.push(point);\r\n this.marker.adjustVisual();\r\n }\r\n\r\n private finishCreation() {\r\n this.marker.stage = 'normal';\r\n this.marker.adjustVisual();\r\n this._state = 'select';\r\n if (this.onMarkerCreated) {\r\n this.onMarkerCreated(this);\r\n }\r\n }\r\n\r\n public override pointerUp(point: IPoint, ev?: PointerEvent): void {\r\n super.pointerUp(point, ev);\r\n this.manipulate(point, ev);\r\n if (this._state === 'creating') {\r\n this.finishCreation();\r\n }\r\n this.state = 'select';\r\n this.stateChanged();\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public override manipulate(point: IPoint, ev?: PointerEvent): void {\r\n if (this.state === 'creating') {\r\n this.addNewPointWhileCreating(point);\r\n } else if (this.state === 'move') {\r\n this.marker.points.forEach((p) => {\r\n p.x += point.x - this.manipulationStartX;\r\n p.y += point.y - this.manipulationStartY;\r\n });\r\n this.manipulationStartX = point.x;\r\n this.manipulationStartY = point.y;\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n }\r\n }\r\n\r\n /**\r\n * Creates control box for manipulation controls.\r\n */\r\n protected setupControlBox(): void {\r\n this.controlBox = SvgHelper.createGroup();\r\n this.container.appendChild(this.controlBox);\r\n\r\n this.controlRect = SvgHelper.createRect(0, 0, [\r\n ['stroke', 'black'],\r\n ['stroke-width', '1'],\r\n ['stroke-opacity', '0.5'],\r\n ['stroke-dasharray', '3, 2'],\r\n ['fill', 'transparent'],\r\n ]);\r\n\r\n this.controlBox.appendChild(this.controlRect);\r\n\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n protected adjustControlBox() {\r\n const left = Math.min(...this.marker.points.map((p) => p.x));\r\n const top = Math.min(...this.marker.points.map((p) => p.y));\r\n const right = Math.max(...this.marker.points.map((p) => p.x));\r\n const bottom = Math.max(...this.marker.points.map((p) => p.y));\r\n\r\n if (this.controlRect) {\r\n SvgHelper.setAttributes(this.controlRect, [\r\n ['x', (left - this.strokeWidth).toString()],\r\n ['y', (top - this.strokeWidth).toString()],\r\n ['width', (right - left + this.strokeWidth * 2).toString()],\r\n ['height', (bottom - top + this.strokeWidth * 2).toString()],\r\n ]);\r\n }\r\n }\r\n\r\n public select(): void {\r\n super.select();\r\n this.adjustControlBox();\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n public deselect(): void {\r\n super.deselect();\r\n this.controlBox.style.display = 'none';\r\n }\r\n}\r\n","/**\r\n * Text changed event handler type.\r\n */\r\nexport type TextChangedHandler = (text: string) => void;\r\n\r\n/**\r\n * Blur event handler type.\r\n */\r\nexport type BlurHandler = () => void;\r\n\r\n/**\r\n * Represents a text block editor element.\r\n */\r\nexport class TextBlockEditor {\r\n private textEditor: HTMLDivElement;\r\n private isInFocus = false;\r\n\r\n private _width = 0;\r\n /**\r\n * Returns editor width in pixels.\r\n */\r\n public get width() {\r\n return this._width;\r\n }\r\n /**\r\n * Sets editor width in pixels.\r\n */\r\n public set width(value) {\r\n this._width = value;\r\n this.textEditor.style.width = `${this.width}px`;\r\n }\r\n\r\n private _height = 0;\r\n /**\r\n * Returns editor height in pixels.\r\n */\r\n public get height() {\r\n return this._height;\r\n }\r\n /**\r\n * Sets editor height in pixels.\r\n */\r\n public set height(value) {\r\n this._height = value;\r\n this.textEditor.style.height = `${this.height}px`;\r\n }\r\n\r\n private _left = 0;\r\n /**\r\n * Returns the horizontal (X) location of the editor's left corner (in pixels).\r\n */\r\n public get left() {\r\n return this._left;\r\n }\r\n /**\r\n * Sets the horizontal (X) location of the editor's left corner (in pixels).\r\n */\r\n public set left(value) {\r\n this._left = value;\r\n this.textEditor.style.left = `${this.left}px`;\r\n }\r\n\r\n private _top = 0;\r\n /**\r\n * Returns the vertical (Y) location of the editor's top left corner (in pixels).\r\n */\r\n public get top() {\r\n return this._top;\r\n }\r\n /**\r\n * Sets the vertical (Y) location of the editor's top left corner (in pixels).\r\n */\r\n public set top(value) {\r\n this._top = value;\r\n this.textEditor.style.top = `${this.top}px`;\r\n }\r\n\r\n private _text = '';\r\n /**\r\n * Returns the text block text.\r\n */\r\n public get text() {\r\n return this._text;\r\n }\r\n /**\r\n * Sets the text block text.\r\n */\r\n public set text(value) {\r\n this._text = value;\r\n }\r\n\r\n private _fontFamily = 'sans-serif';\r\n /**\r\n * Returns text block's font family.\r\n */\r\n public get fontFamily() {\r\n return this._fontFamily;\r\n }\r\n /**\r\n * Sets the text block's font family.\r\n */\r\n public set fontFamily(value) {\r\n this._fontFamily = value;\r\n this.textEditor.style.fontFamily = this._fontFamily;\r\n }\r\n\r\n private _fontSize = '1rem';\r\n /**\r\n * Returns text block's font size.\r\n */\r\n public get fontSize() {\r\n return this._fontSize;\r\n }\r\n /**\r\n * Sets text block's font size.\r\n */\r\n public set fontSize(value) {\r\n this._fontSize = value;\r\n this.textEditor.style.fontSize = this._fontSize;\r\n }\r\n\r\n private _textColor = '#000';\r\n /**\r\n * Returns text block's font color.\r\n */\r\n public get textColor() {\r\n return this._textColor;\r\n }\r\n /**\r\n * Returns text block's font color.\r\n */\r\n public set textColor(value) {\r\n this._textColor = value;\r\n this.textEditor.style.color = this.textColor;\r\n }\r\n\r\n private _bgColor = 'transparent';\r\n /**\r\n * Returns text block's background color.\r\n */\r\n public get bgColor() {\r\n return this._bgColor;\r\n }\r\n /**\r\n * Sets text block's background color.\r\n */\r\n public set bgColor(value) {\r\n this._bgColor = value;\r\n this.textEditor.style.backgroundColor = this.bgColor;\r\n }\r\n\r\n /**\r\n * Text changed event handler.\r\n */\r\n public onTextChanged?: TextChangedHandler;\r\n\r\n /**\r\n * Blur event handler.\r\n */\r\n public onBlur?: BlurHandler;\r\n\r\n /**\r\n * Creates a new text block editor instance.\r\n */\r\n constructor() {\r\n this.textEditor = document.createElement('div');\r\n\r\n this.getEditorUi = this.getEditorUi.bind(this);\r\n this.focus = this.focus.bind(this);\r\n this.setup = this.setup.bind(this);\r\n }\r\n\r\n private isSetupCompleted = false;\r\n private setup() {\r\n // this.textEditor.style.position = 'absolute';\r\n this.textEditor.style.pointerEvents = 'auto';\r\n this.textEditor.style.display = 'flex';\r\n this.textEditor.style.flexDirection = 'column';\r\n this.textEditor.style.alignItems = 'center';\r\n this.textEditor.style.justifyContent = 'center';\r\n this.textEditor.style.width = `${this._width}px`;\r\n this.textEditor.style.height = `${this._height}px`;\r\n this.textEditor.style.overflow = 'hidden';\r\n this.textEditor.style.textAlign = 'center';\r\n this.textEditor.style.fontFamily = this._fontFamily;\r\n this.textEditor.style.fontSize = this._fontSize;\r\n this.textEditor.style.lineHeight = '1em';\r\n if (this._text !== '') {\r\n this.textEditor.innerText = this._text;\r\n } else {\r\n this.textEditor.innerHTML = ' ';\r\n }\r\n this.textEditor.contentEditable = 'true';\r\n this.textEditor.style.outline = 'none';\r\n this.textEditor.style.color = this._textColor;\r\n this.textEditor.style.whiteSpace = 'pre';\r\n this.textEditor.addEventListener('pointerdown', (ev) => {\r\n ev.stopPropagation();\r\n });\r\n this.textEditor.addEventListener('pointerup', (ev) => {\r\n ev.stopPropagation();\r\n });\r\n this.textEditor.addEventListener('keydown', (ev) => {\r\n if (ev.key === 'Escape') {\r\n ev.preventDefault();\r\n this.textEditor.blur();\r\n }\r\n });\r\n this.textEditor.addEventListener('keyup', (ev) => {\r\n ev.cancelBubble = true;\r\n this._text = this.textEditor.innerText;\r\n if (this.onTextChanged !== undefined) {\r\n this.onTextChanged(this._text);\r\n }\r\n });\r\n this.textEditor.addEventListener('blur', () => {\r\n this._text = this.textEditor.innerText;\r\n if (this.onTextChanged !== undefined) {\r\n this.onTextChanged(this._text);\r\n }\r\n if (this.onBlur !== undefined) {\r\n this.onBlur();\r\n }\r\n });\r\n this.textEditor.addEventListener('paste', (ev) => {\r\n if (ev.clipboardData) {\r\n // paste plain text\r\n const content = ev.clipboardData.getData('text');\r\n const selection = window.getSelection();\r\n if (!selection || !selection.rangeCount) return false;\r\n selection.deleteFromDocument();\r\n selection.getRangeAt(0).insertNode(document.createTextNode(content));\r\n ev.preventDefault();\r\n }\r\n });\r\n\r\n this.isSetupCompleted = true;\r\n }\r\n\r\n /**\r\n * Returns editor's UI,\r\n * @returns UI in a div element.\r\n */\r\n public getEditorUi(): HTMLDivElement {\r\n if (!this.isSetupCompleted) {\r\n this.setup();\r\n }\r\n\r\n return this.textEditor;\r\n }\r\n\r\n /**\r\n * Focuses text editing in the editor.\r\n */\r\n public focus() {\r\n this.textEditor.focus();\r\n\r\n // position cursor at the end of the text\r\n const range = document.createRange();\r\n range.selectNodeContents(this.textEditor);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection?.removeAllRanges();\r\n selection?.addRange(range);\r\n }\r\n /**\r\n * Unfocuses the editor.\r\n */\r\n public blur() {\r\n this.textEditor.blur();\r\n }\r\n}\r\n","import { FontSize, IPoint, SvgHelper, TextMarker } from '../core';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { RectangularBoxMarkerBaseEditor } from './RectangularBoxMarkerBaseEditor';\r\nimport { TextBlockEditor } from './TextBlockEditor';\r\n\r\n/**\r\n * Editor for text markers.\r\n *\r\n * @summary Text marker editor.\r\n * @group Editors\r\n */\r\nexport class TextMarkerEditor<\r\n TMarkerType extends TextMarker = TextMarker,\r\n> extends RectangularBoxMarkerBaseEditor<TMarkerType> {\r\n /**\r\n * Container for text block editor.\r\n */\r\n protected textBlockEditorContainer: SVGForeignObjectElement =\r\n SvgHelper.createForeignObject();\r\n /**\r\n * Text block editor.\r\n */\r\n protected textBlockEditor: TextBlockEditor;\r\n\r\n /**\r\n * Text color.\r\n */\r\n public set color(color: string) {\r\n this.marker.color = color;\r\n this.stateChanged();\r\n }\r\n /**\r\n * Text color.\r\n */\r\n public get color(): string {\r\n return this.marker.color;\r\n }\r\n\r\n /**\r\n * Sets text's font family.\r\n */\r\n public set fontFamily(font: string) {\r\n this.marker.fontFamily = font;\r\n this.stateChanged();\r\n }\r\n /**\r\n * Returns text's font family.\r\n */\r\n public get fontFamily(): string {\r\n return this.marker.fontFamily;\r\n }\r\n\r\n /**\r\n * Sets text's font size.\r\n */\r\n public set fontSize(size: FontSize) {\r\n this.marker.fontSize = size;\r\n this.stateChanged();\r\n }\r\n /**\r\n * Returns text's font size.\r\n */\r\n public get fontSize(): FontSize {\r\n return this.marker.fontSize;\r\n }\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this.disabledResizeGrips = [\r\n 'topleft',\r\n 'topcenter',\r\n 'topright',\r\n 'bottomleft',\r\n 'bottomcenter',\r\n 'bottomright',\r\n 'leftcenter',\r\n 'rightcenter',\r\n ];\r\n\r\n this._creationStyle = 'drop';\r\n\r\n this.textBlockEditor = new TextBlockEditor();\r\n this.marker.onSizeChanged = this.markerSizeChanged;\r\n\r\n this.showEditor = this.showEditor.bind(this);\r\n this.hideEditor = this.hideEditor.bind(this);\r\n this.pointerDown = this.pointerDown.bind(this);\r\n this.pointerUp = this.pointerUp.bind(this);\r\n this.resize = this.resize.bind(this);\r\n this.markerSizeChanged = this.markerSizeChanged.bind(this);\r\n }\r\n\r\n private _pointerDownTime: number = Number.MAX_VALUE;\r\n private _pointerDownPoint: IPoint = { x: 0, y: 0 };\r\n\r\n public override pointerDown(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: PointerEvent,\r\n ): void {\r\n super.pointerDown(point, target, ev);\r\n\r\n this._pointerDownTime = Date.now();\r\n this._pointerDownPoint = point;\r\n\r\n if (this.state === 'new') {\r\n this.marker.createVisual();\r\n\r\n this.marker.moveVisual(point);\r\n\r\n this._state = 'creating';\r\n }\r\n }\r\n\r\n public override dblClick(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: MouseEvent,\r\n ): void {\r\n super.dblClick(point, target, ev);\r\n if (this.state !== 'edit') {\r\n this.showEditor();\r\n }\r\n }\r\n\r\n protected setSize(): void {\r\n super.setSize();\r\n this.textBlockEditorContainer.style.transform = `translate(${this.marker.left}px, ${this.marker.top}px)`;\r\n this.textBlockEditorContainer.style.width = `${this.marker.width}px`;\r\n this.textBlockEditorContainer.setAttribute('width', `${this.marker.width}`);\r\n this.textBlockEditorContainer.style.height = `${this.marker.height}px`;\r\n this.textBlockEditorContainer.setAttribute(\r\n 'height',\r\n `${this.marker.height}`,\r\n );\r\n this.textBlockEditor.width = this.marker.width;\r\n this.textBlockEditor.height = this.marker.height;\r\n }\r\n\r\n protected resize(point: IPoint, preserveAspectRatio = false): void {\r\n super.resize(point, preserveAspectRatio);\r\n this.setSize();\r\n }\r\n\r\n public override pointerUp(point: IPoint, ev?: PointerEvent): void {\r\n const inState = this.state;\r\n super.pointerUp(point, ev);\r\n this.setSize();\r\n\r\n if (\r\n inState === 'creating' ||\r\n (Date.now() - this._pointerDownTime > 500 &&\r\n Math.abs(this._pointerDownPoint.x - point.x) < 5 &&\r\n Math.abs(this._pointerDownPoint.y - point.y) < 5)\r\n ) {\r\n this.showEditor();\r\n }\r\n\r\n this.adjustControlBox();\r\n }\r\n\r\n private showEditor(): void {\r\n this.textBlockEditor.text = this.marker.text;\r\n this.textBlockEditor.textColor = this.marker.color;\r\n this.textBlockEditor.bgColor = this.marker.fillColor;\r\n this.textBlockEditor.fontFamily = this.marker.fontFamily;\r\n this.textBlockEditor.fontSize = `${this.marker.fontSize.value}${this.marker.fontSize.units}`;\r\n\r\n if (this.textBlockEditor.onTextChanged === undefined) {\r\n this.textBlockEditor.onTextChanged = (text: string) => {\r\n this.marker.text = text;\r\n };\r\n }\r\n if (this.textBlockEditor.onBlur === undefined) {\r\n this.textBlockEditor.onBlur = () => {\r\n this.hideEditor();\r\n this.deselect();\r\n };\r\n }\r\n this.textBlockEditorContainer.appendChild(\r\n this.textBlockEditor.getEditorUi(),\r\n );\r\n this.container.appendChild(this.textBlockEditorContainer);\r\n\r\n this.marker.hideVisual();\r\n this.hideControlBox();\r\n\r\n this.textBlockEditor.focus();\r\n }\r\n\r\n private hideEditor(): void {\r\n this.marker.text = this.textBlockEditor.text;\r\n this.marker.showVisual();\r\n this.showControlBox();\r\n this.state = 'select';\r\n this.container.removeChild(this.textBlockEditorContainer);\r\n }\r\n\r\n private markerSizeChanged = () => {\r\n this.setSize();\r\n };\r\n}\r\n","import { ShapeMarkerBase } from '../core';\r\nimport { ShapeOutlineMarkerEditor } from './ShapeOutlineMarkerEditor';\r\n\r\n/**\r\n * Editor for filled shape markers.\r\n *\r\n * @summary Filled shape marker editor.\r\n * @group Editors\r\n */\r\nexport class ShapeMarkerEditor<\r\n TMarkerType extends ShapeMarkerBase = ShapeMarkerBase,\r\n> extends ShapeOutlineMarkerEditor<TMarkerType> {}\r\n","import { ArrowMarker, ArrowType } from '../core';\r\nimport { LinearMarkerEditor } from './LinearMarkerEditor';\r\n\r\n/**\r\n * Editor for arrow markers.\r\n *\r\n * @summary Arrow marker editor.\r\n * @group Editors\r\n */\r\nexport class ArrowMarkerEditor<\r\n TMarkerType extends ArrowMarker = ArrowMarker,\r\n> extends LinearMarkerEditor<TMarkerType> {\r\n /**\r\n * Sets the arrow type.\r\n */\r\n public set arrowType(value: ArrowType) {\r\n this.marker.arrowType = value;\r\n }\r\n\r\n /**\r\n * Returns the arrow type.\r\n */\r\n public get arrowType(): ArrowType {\r\n return this.marker.arrowType;\r\n }\r\n}\r\n","import { CalloutMarker, IPoint, SvgHelper } from '../core';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { ResizeGrip } from './ResizeGrip';\r\nimport { TextMarkerEditor } from './TextMarkerEditor';\r\n\r\n/**\r\n * Editor for callout markers.\r\n *\r\n * @summary Callout marker editor.\r\n * @group Editors\r\n */\r\nexport class CalloutMarkerEditor<\r\n TMarkerType extends CalloutMarker = CalloutMarker,\r\n> extends TextMarkerEditor<TMarkerType> {\r\n private tipGrip?: ResizeGrip;\r\n\r\n private manipulationStartTipPositionX = 0;\r\n private manipulationStartTipPositionY = 0;\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n }\r\n\r\n protected addControlGrips(): void {\r\n this.tipGrip = this.createTipGrip();\r\n\r\n super.addControlGrips();\r\n }\r\n\r\n private createTipGrip(): ResizeGrip {\r\n const grip = new ResizeGrip();\r\n grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n this.manipulationBox.appendChild(grip.visual);\r\n\r\n return grip;\r\n }\r\n\r\n protected positionGrips() {\r\n super.positionGrips();\r\n\r\n if (this.tipGrip) {\r\n const tipGripSize = this.tipGrip.gripSize ?? 0;\r\n this.positionGrip(\r\n this.tipGrip.visual,\r\n this.marker.tipPosition.x - tipGripSize / 2,\r\n this.marker.tipPosition.y - tipGripSize / 2,\r\n );\r\n }\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this.tipGrip?.ownsTarget(el)) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public override pointerDown(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: PointerEvent,\r\n ): void {\r\n super.pointerDown(point, target, ev);\r\n\r\n this.manipulationStartTipPositionX = this.marker.tipPosition.x;\r\n this.manipulationStartTipPositionY = this.marker.tipPosition.y;\r\n\r\n if (\r\n this.tipGrip !== undefined &&\r\n target !== undefined &&\r\n this.tipGrip.ownsTarget(target)\r\n ) {\r\n this.activeGrip = this.tipGrip;\r\n this._state = 'resize';\r\n }\r\n }\r\n\r\n protected resize(point: IPoint, preserveAspectRatio = false): void {\r\n const newX =\r\n this.manipulationStartTipPositionX + point.x - this.manipulationStartX;\r\n const newY =\r\n this.manipulationStartTipPositionY + point.y - this.manipulationStartY;\r\n\r\n if (this.activeGrip === this.tipGrip) {\r\n this.marker.tipPosition = { x: newX, y: newY };\r\n this.adjustControlBox();\r\n } else {\r\n super.resize(point, preserveAspectRatio);\r\n }\r\n }\r\n}\r\n","import { ImageMarkerBase, IPoint } from '../core';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { RectangularBoxMarkerBaseEditor } from './RectangularBoxMarkerBaseEditor';\r\n\r\n/**\r\n * Editor for image markers.\r\n *\r\n * @summary Image marker editor.\r\n * @group Editors\r\n */\r\nexport class ImageMarkerEditor<\r\n TMarkerType extends ImageMarkerBase = ImageMarkerBase,\r\n> extends RectangularBoxMarkerBaseEditor<TMarkerType> {\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this._creationStyle = 'drop';\r\n\r\n this.disabledResizeGrips = [\r\n 'topcenter',\r\n 'bottomcenter',\r\n 'leftcenter',\r\n 'rightcenter',\r\n ];\r\n\r\n this.pointerDown = this.pointerDown.bind(this);\r\n this.pointerUp = this.pointerUp.bind(this);\r\n this.resize = this.resize.bind(this);\r\n }\r\n\r\n public override pointerDown(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: PointerEvent,\r\n ): void {\r\n super.pointerDown(point, target, ev);\r\n\r\n if (this.state === 'new') {\r\n this.marker.createVisual();\r\n\r\n this.marker.moveVisual(point);\r\n\r\n this._state = 'creating';\r\n }\r\n }\r\n\r\n public override pointerUp(point: IPoint, ev?: PointerEvent): void {\r\n super.pointerUp(point, ev);\r\n this.setSize();\r\n this.adjustControlBox();\r\n }\r\n}\r\n","import { CaptionFrameMarker } from '../core';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { TextMarkerEditor } from './TextMarkerEditor';\r\n\r\n/**\r\n * Editor for caption frame markers.\r\n *\r\n * @summary Caption frame marker editor.\r\n * @group Editors\r\n */\r\nexport class CaptionFrameMarkerEditor<\r\n TMarkerType extends CaptionFrameMarker = CaptionFrameMarker,\r\n> extends TextMarkerEditor<TMarkerType> {\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this.disabledResizeGrips = [];\r\n this._creationStyle = 'draw';\r\n }\r\n\r\n protected setSize(): void {\r\n super.setSize();\r\n this.textBlockEditorContainer.style.transform = `translate(${\r\n this.marker.left\r\n }px, ${this.marker.top + this.marker.strokeWidth / 2}px)`;\r\n if (this.marker.textBlock.textSize) {\r\n const height =\r\n this.marker.textBlock.textSize.height + this.marker.padding * 2;\r\n this.textBlockEditorContainer.style.width = `${this.marker.width}px`;\r\n this.textBlockEditorContainer.style.height = `${height}px`;\r\n this.textBlockEditor.width = this.marker.width;\r\n this.textBlockEditor.height = height;\r\n }\r\n }\r\n}\r\n","import { CurveMarker, IPoint, SvgHelper } from '../core';\r\nimport { LinearMarkerEditor } from './LinearMarkerEditor';\r\nimport { ResizeGrip } from './ResizeGrip';\r\n\r\nexport class CurveMarkerEditor<\r\n TMarkerType extends CurveMarker = CurveMarker,\r\n> extends LinearMarkerEditor<TMarkerType> {\r\n /**\r\n * Curve manipulation grip.\r\n */\r\n protected curveGrip?: ResizeGrip;\r\n\r\n private manipulationStartCurveX = 0;\r\n private manipulationStartCurveY = 0;\r\n\r\n private curveControlLine1?: SVGLineElement;\r\n private curveControlLine2?: SVGLineElement;\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this.curveGrip?.ownsTarget(el)) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public override pointerDown(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: PointerEvent,\r\n ): void {\r\n if (this.state === 'new') {\r\n this.marker.curveX = point.x;\r\n this.marker.curveY = point.y;\r\n }\r\n\r\n this.manipulationStartCurveX = this.marker.curveX;\r\n this.manipulationStartCurveY = this.marker.curveY;\r\n\r\n super.pointerDown(point, target, ev);\r\n\r\n if (this.state !== 'new' && this.state !== 'creating') {\r\n if (target && this.curveGrip?.ownsTarget(target)) {\r\n this.activeGrip = this.curveGrip;\r\n }\r\n\r\n if (this.activeGrip) {\r\n this._state = 'resize';\r\n } else {\r\n this._state = 'move';\r\n }\r\n }\r\n }\r\n\r\n protected resize(point: IPoint): void {\r\n super.resize(point);\r\n\r\n if (this.activeGrip === this.curveGrip) {\r\n this.marker.curveX = point.x;\r\n this.marker.curveY = point.y;\r\n\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n }\r\n\r\n if (this.state === 'creating') {\r\n this.marker.curveX =\r\n this.marker.x1 + (this.marker.x2 - this.marker.x1) / 2;\r\n this.marker.curveY =\r\n this.marker.y1 + (this.marker.y2 - this.marker.y1) / 2;\r\n }\r\n }\r\n\r\n public override manipulate(point: IPoint, ev?: PointerEvent): void {\r\n if (this.state === 'move') {\r\n this.marker.curveX =\r\n this.manipulationStartCurveX + point.x - this.manipulationStartX;\r\n this.marker.curveY =\r\n this.manipulationStartCurveY + point.y - this.manipulationStartY;\r\n }\r\n super.manipulate(point, ev);\r\n }\r\n\r\n protected setupControlBox(): void {\r\n super.setupControlBox();\r\n this.curveControlLine1 = SvgHelper.createLine(\r\n this.marker.x1,\r\n this.marker.y1,\r\n this.marker.curveX,\r\n this.marker.curveY,\r\n [\r\n ['stroke', 'black'],\r\n ['stroke-width', '1'],\r\n ['stroke-opacity', '0.5'],\r\n ['stroke-dasharray', '3, 2'],\r\n ['fill', 'transparent'],\r\n ['pointer-events', 'none'],\r\n ],\r\n );\r\n this.curveControlLine2 = SvgHelper.createLine(\r\n this.marker.x2,\r\n this.marker.y2,\r\n this.marker.curveX,\r\n this.marker.curveY,\r\n [\r\n ['stroke', 'black'],\r\n ['stroke-width', '1'],\r\n ['stroke-opacity', '0.5'],\r\n ['stroke-dasharray', '3, 2'],\r\n ['fill', 'transparent'],\r\n ['pointer-events', 'none'],\r\n ],\r\n );\r\n\r\n this._controlBox.insertBefore(\r\n this.curveControlLine1,\r\n this._controlBox.firstChild,\r\n );\r\n this._controlBox.insertBefore(\r\n this.curveControlLine2,\r\n this._controlBox.firstChild,\r\n );\r\n }\r\n\r\n protected adjustControlBox() {\r\n super.adjustControlBox();\r\n\r\n if (this.curveControlLine1 && this.curveControlLine2) {\r\n this.curveControlLine1.setAttribute('x1', this.marker.x1.toString());\r\n this.curveControlLine1.setAttribute('y1', this.marker.y1.toString());\r\n this.curveControlLine1.setAttribute('x2', this.marker.curveX.toString());\r\n this.curveControlLine1.setAttribute('y2', this.marker.curveY.toString());\r\n\r\n this.curveControlLine2.setAttribute('x1', this.marker.x2.toString());\r\n this.curveControlLine2.setAttribute('y1', this.marker.y2.toString());\r\n this.curveControlLine2.setAttribute('x2', this.marker.curveX.toString());\r\n this.curveControlLine2.setAttribute('y2', this.marker.curveY.toString());\r\n }\r\n }\r\n\r\n protected addControlGrips(): void {\r\n super.addControlGrips();\r\n\r\n this.curveGrip = this.createGrip();\r\n this.positionGrips();\r\n }\r\n\r\n protected positionGrips(): void {\r\n super.positionGrips();\r\n\r\n if (this.curveGrip) {\r\n const gripSize = this.curveGrip.gripSize;\r\n\r\n this.positionGrip(\r\n this.curveGrip.visual,\r\n this.marker.curveX - gripSize / 2,\r\n this.marker.curveY - gripSize / 2,\r\n );\r\n }\r\n }\r\n}\r\n","import {\r\n AnnotationState,\r\n CalloutMarker,\r\n CaptionFrameMarker,\r\n CheckImageMarker,\r\n CoverMarker,\r\n CurveMarker,\r\n CustomImageMarker,\r\n EllipseFrameMarker,\r\n EllipseMarker,\r\n FrameMarker,\r\n FreehandMarker,\r\n HighlighterMarker,\r\n HighlightMarker,\r\n IPoint,\r\n LineMarker,\r\n MarkerBase,\r\n PolygonMarker,\r\n TextMarker,\r\n XImageMarker,\r\n SvgFilters,\r\n} from './core';\r\nimport { SvgHelper } from './core/SvgHelper';\r\nimport { PolygonMarkerEditor } from './editor/PolygonMarkerEditor';\r\nimport { LinearMarkerEditor } from './editor/LinearMarkerEditor';\r\nimport { MarkerBaseEditor } from './editor/MarkerBaseEditor';\r\nimport { ShapeOutlineMarkerEditor } from './editor/ShapeOutlineMarkerEditor';\r\nimport { UndoRedoManager } from './editor/UndoRedoManager';\r\nimport { FreehandMarkerEditor } from './editor/FreehandMarkerEditor';\r\nimport { TextMarkerEditor } from './editor/TextMarkerEditor';\r\nimport { Activator } from './core/Activator';\r\n\r\nimport Logo from './assets/markerjs-logo-m.svg';\r\nimport { ShapeMarkerEditor } from './editor/ShapeMarkerEditor';\r\nimport { ArrowMarker } from './core/ArrowMarker';\r\nimport { ArrowMarkerEditor } from './editor/ArrowMarkerEditor';\r\nimport { MeasurementMarker } from './core/MeasurementMarker';\r\nimport { CalloutMarkerEditor } from './editor/CalloutMarkerEditor';\r\nimport { ImageMarkerEditor } from './editor/ImageMarkerEditor';\r\nimport { CaptionFrameMarkerEditor } from './editor/CaptionFrameMarkerEditor';\r\nimport { CurveMarkerEditor } from './editor/CurveMarkerEditor';\r\n\r\n/**\r\n * Marker area custom event types.\r\n */\r\nexport interface MarkerAreaEventMap {\r\n /**\r\n * Marker area initialized.\r\n */\r\n areainit: CustomEvent<MarkerAreaEventData>;\r\n /**\r\n * Marker area shown.\r\n */\r\n areashow: CustomEvent<MarkerAreaEventData>;\r\n /**\r\n * Marker area state restored.\r\n */\r\n arearestorestate: CustomEvent<MarkerAreaEventData>;\r\n /**\r\n * Marker area focused.\r\n */\r\n areafocus: CustomEvent<MarkerAreaEventData>;\r\n /**\r\n * Marker area lost focus.\r\n */\r\n areablur: CustomEvent<MarkerAreaEventData>;\r\n /**\r\n * Marker area state changed.\r\n */\r\n areastatechange: CustomEvent<MarkerAreaEventData>;\r\n\r\n /**\r\n * Marker selected.\r\n */\r\n markerselect: CustomEvent<MarkerEditorEventData>;\r\n /**\r\n * Marker deselected.\r\n */\r\n markerdeselect: CustomEvent<MarkerEditorEventData>;\r\n /**\r\n * Marker creating.\r\n */\r\n markercreating: CustomEvent<MarkerEditorEventData>;\r\n /**\r\n * Marker created.\r\n */\r\n markercreate: CustomEvent<MarkerEditorEventData>;\r\n /**\r\n * Marker about to be deleted.\r\n */\r\n markerbeforedelete: CustomEvent<MarkerEditorEventData>;\r\n /**\r\n * Marker deleted.\r\n */\r\n markerdelete: CustomEvent<MarkerEditorEventData>;\r\n /**\r\n * Marker changed.\r\n */\r\n markerchange: CustomEvent<MarkerEditorEventData>;\r\n}\r\n\r\n/**\r\n * Marker area custom event data.\r\n */\r\nexport interface MarkerAreaEventData {\r\n /**\r\n * {@link MarkerArea} instance.\r\n */\r\n markerArea: MarkerArea;\r\n}\r\n\r\n/**\r\n * Marker editor custom event data.\r\n */\r\nexport interface MarkerEditorEventData extends MarkerAreaEventData {\r\n markerEditor: MarkerBaseEditor;\r\n}\r\n\r\n/**\r\n * @ignore\r\n */\r\nexport type MarkerAreaMode = 'select' | 'create' | 'delete';\r\n\r\n/**\r\n * Marker area web component is the main annotation editor component.\r\n *\r\n * @summary\r\n * The main annotation editor component.\r\n *\r\n * @group Components\r\n *\r\n * @example\r\n *\r\n * Import `MarkerArea` from `@markerjs/markerjs3`:\r\n *\r\n * ```js\r\n * import { MarkerArea } from '@markerjs/markerjs3';\r\n * ```\r\n *\r\n * In the code below we assume that you have an `HTMLImageElement` as `targetImage`. It can be a reference to an image you already have on the page or you can simply create it with something like this:\r\n *\r\n * ```js\r\n * const targetImg = document.createElement('img');\r\n * targetImg.src = './sample.jpg';\r\n * ```\r\n *\r\n * Now you just need to create an instance of `MarkerArea`, set its `targetImage` property and add it to the page:\r\n *\r\n * ```js\r\n * const markerArea = new MarkerArea();\r\n * markerArea.targetImage = targetImg;\r\n * editorContainerDiv.appendChild(markerArea);\r\n * ```\r\n *\r\n * To initiate creation of a marker you just call `createMarker()` and pass it the name (or type) of the marker you want to create. So, if you have a button with id `addFrameButton` you can make it create a new `FrameMarker` with something like this:\r\n *\r\n * ```js\r\n * document.querySelector(\"#addButton\")!.addEventListener(\"click\", () => {\r\n * markerArea.createMarker(\"FrameMarker\");\r\n * });\r\n * ```\r\n *\r\n * And whenever you want to save state (current annotation) you just call `getState()`:\r\n *\r\n * ```js\r\n * document.querySelector(\"#saveStateButton\")!.addEventListener(\"click\", () => {\r\n * const state = markerArea.getState();\r\n * console.log(state);\r\n * });\r\n * ```\r\n */\r\nexport class MarkerArea extends HTMLElement {\r\n private _contentContainer?: HTMLDivElement;\r\n private _canvasContainer?: HTMLDivElement;\r\n\r\n private _overlayContainer!: HTMLDivElement;\r\n private _overlayContentContainer!: HTMLDivElement;\r\n\r\n private _mainCanvas?: SVGSVGElement;\r\n private _groupLayer?: SVGGElement;\r\n\r\n private _editingTarget?: HTMLImageElement;\r\n\r\n private width = 0;\r\n private height = 0;\r\n\r\n private _targetWidth = -1;\r\n /**\r\n * Returns the target image width.\r\n */\r\n public get targetWidth() {\r\n return this._targetWidth;\r\n }\r\n /**\r\n * Sets the target image width.\r\n */\r\n public set targetWidth(value) {\r\n this._targetWidth = value;\r\n this.setMainCanvasSize();\r\n }\r\n private _targetHeight = -1;\r\n /**\r\n * Returns the target image height.\r\n */\r\n public get targetHeight() {\r\n return this._targetHeight;\r\n }\r\n /**\r\n * Sets the target image height.\r\n */\r\n public set targetHeight(value) {\r\n this._targetHeight = value;\r\n this.setMainCanvasSize();\r\n }\r\n\r\n private mode: MarkerAreaMode = 'select';\r\n\r\n private _logoUI?: HTMLElement;\r\n\r\n private _isInitialized = false;\r\n\r\n private _currentMarkerEditor?: MarkerBaseEditor;\r\n /**\r\n * Returns the currently active marker editor.\r\n */\r\n public get currentMarkerEditor(): MarkerBaseEditor | undefined {\r\n return this._currentMarkerEditor;\r\n }\r\n private _selectedMarkerEditors: MarkerBaseEditor[] = [];\r\n /**\r\n * Returns the currently selected marker editors.\r\n */\r\n public get selectedMarkerEditors(): MarkerBaseEditor[] {\r\n return this._selectedMarkerEditors;\r\n }\r\n\r\n private _newMarkerOutline: SVGPathElement = SvgHelper.createPath('', [\r\n ['stroke', '#333'],\r\n ['stroke-width', '0.5'],\r\n ['stroke-dasharray', '2 5'],\r\n ['fill', 'rgba(200,200,200,0.5)'],\r\n ['pointer-events', 'none'],\r\n ]);\r\n\r\n private _targetImageLoaded = false;\r\n private _targetImage: HTMLImageElement | undefined;\r\n /**\r\n * Returns the target image.\r\n */\r\n public get targetImage(): HTMLImageElement | undefined {\r\n return this._targetImage;\r\n }\r\n /**\r\n * Sets the target image.\r\n */\r\n public set targetImage(value: HTMLImageElement | undefined) {\r\n this._targetImage = value;\r\n this._targetImageLoaded = false;\r\n if (value !== undefined) {\r\n this.addTargetImage();\r\n }\r\n }\r\n\r\n /**\r\n * The collection of available marker editor types.\r\n */\r\n public markerEditors: Map<\r\n typeof MarkerBase,\r\n typeof MarkerBaseEditor<MarkerBase>\r\n > = new Map();\r\n\r\n /**\r\n * The collection of marker editors in the annotation.\r\n */\r\n public editors: MarkerBaseEditor[] = [];\r\n\r\n private _zoomLevel = 1;\r\n /**\r\n * Returns the current zoom level.\r\n */\r\n public get zoomLevel(): number {\r\n return this._zoomLevel;\r\n }\r\n /**\r\n * Sets the current zoom level.\r\n */\r\n public set zoomLevel(value: number) {\r\n this._zoomLevel = value;\r\n if (\r\n this._canvasContainer &&\r\n this._contentContainer &&\r\n this._mainCanvas &&\r\n this._overlayContainer\r\n ) {\r\n // this.setMainCanvasSize();\r\n this._mainCanvas.style.transform = `scale(${this._zoomLevel})`;\r\n this.setEditingTargetSize();\r\n\r\n const scrollMultiplier = Math.max(this._zoomLevel, 1);\r\n this._canvasContainer.scrollTo({\r\n left:\r\n (this._mainCanvas.clientWidth * scrollMultiplier -\r\n this._canvasContainer.clientWidth) /\r\n 2,\r\n top:\r\n (this._mainCanvas.clientHeight * scrollMultiplier -\r\n this._canvasContainer.clientHeight) /\r\n 2,\r\n });\r\n\r\n this._overlayContainer.style.transform = `scale(${this._zoomLevel})`;\r\n }\r\n }\r\n\r\n private prevPanPoint: IPoint = { x: 0, y: 0 };\r\n private panTo(point: IPoint) {\r\n this._canvasContainer?.scrollBy({\r\n left: this.prevPanPoint.x - point.x,\r\n top: this.prevPanPoint.y - point.y,\r\n });\r\n this.prevPanPoint = point;\r\n }\r\n\r\n private undoRedoManager = new UndoRedoManager<AnnotationState>();\r\n\r\n private _defaultFilter?: string;\r\n /**\r\n * Returns the default SVG filter for the created markers.\r\n *\r\n * @since 3.2.0\r\n */\r\n public get defaultFilter(): string | undefined {\r\n return this._defaultFilter;\r\n }\r\n /**\r\n * Sets the default SVG filter for the created markers.\r\n *\r\n * @remarks\r\n * The filter should be a valid SVG filter string.\r\n *\r\n * In Chromium-based browsers and Firefox, you can use CSS filter strings\r\n * e.g. \"drop-shadow(2px 2px 2px black)\". Unfortunately, at the time of\r\n * the implementation this doesn't work in Safari (meaning any browser on iOS as well).\r\n *\r\n * For cross-browser compatibility, version 3.3 introduces a set of default filters.\r\n * These are dropShadow, outline, and glow. You can use them by setting the defaultFilter\r\n * to \"url(#dropShadow)\", \"url(#outline)\", or \"url(#glow)\" respectively.\r\n *\r\n * @since 3.2.0\r\n */\r\n public set defaultFilter(value: string | undefined) {\r\n this._defaultFilter = value;\r\n }\r\n\r\n private _defsElement?: SVGDefsElement;\r\n private _defs: (string | Node)[] = [];\r\n\r\n constructor() {\r\n super();\r\n\r\n this.markerEditors.set(FrameMarker, ShapeOutlineMarkerEditor<FrameMarker>);\r\n this.markerEditors.set(\r\n EllipseFrameMarker,\r\n ShapeOutlineMarkerEditor<FrameMarker>,\r\n );\r\n this.markerEditors.set(LineMarker, LinearMarkerEditor<LineMarker>);\r\n this.markerEditors.set(PolygonMarker, PolygonMarkerEditor<PolygonMarker>);\r\n this.markerEditors.set(\r\n FreehandMarker,\r\n FreehandMarkerEditor<FreehandMarker>,\r\n );\r\n this.markerEditors.set(TextMarker, TextMarkerEditor<TextMarker>);\r\n this.markerEditors.set(CoverMarker, ShapeMarkerEditor<CoverMarker>);\r\n this.markerEditors.set(HighlightMarker, ShapeMarkerEditor<HighlightMarker>);\r\n this.markerEditors.set(EllipseMarker, ShapeMarkerEditor<EllipseMarker>);\r\n this.markerEditors.set(ArrowMarker, ArrowMarkerEditor<ArrowMarker>);\r\n this.markerEditors.set(\r\n MeasurementMarker,\r\n LinearMarkerEditor<MeasurementMarker>,\r\n );\r\n this.markerEditors.set(CalloutMarker, CalloutMarkerEditor<CalloutMarker>);\r\n this.markerEditors.set(\r\n CustomImageMarker,\r\n ImageMarkerEditor<CustomImageMarker>,\r\n );\r\n this.markerEditors.set(\r\n CheckImageMarker,\r\n ImageMarkerEditor<CheckImageMarker>,\r\n );\r\n this.markerEditors.set(XImageMarker, ImageMarkerEditor<CheckImageMarker>);\r\n this.markerEditors.set(\r\n CaptionFrameMarker,\r\n CaptionFrameMarkerEditor<CaptionFrameMarker>,\r\n );\r\n this.markerEditors.set(CurveMarker, CurveMarkerEditor<CurveMarker>);\r\n this.markerEditors.set(\r\n HighlighterMarker,\r\n FreehandMarkerEditor<HighlighterMarker>,\r\n );\r\n\r\n this.connectedCallback = this.connectedCallback.bind(this);\r\n this.disconnectedCallback = this.disconnectedCallback.bind(this);\r\n\r\n this.createLayout = this.createLayout.bind(this);\r\n this.addMainCanvas = this.addMainCanvas.bind(this);\r\n this.setMainCanvasSize = this.setMainCanvasSize.bind(this);\r\n this.setEditingTargetSize = this.setEditingTargetSize.bind(this);\r\n this.initOverlay = this.initOverlay.bind(this);\r\n this.addTargetImage = this.addTargetImage.bind(this);\r\n\r\n this.attachEvents = this.attachEvents.bind(this);\r\n this.attachWindowEvents = this.attachWindowEvents.bind(this);\r\n this.detachEvents = this.detachEvents.bind(this);\r\n this.detachWindowEvents = this.detachWindowEvents.bind(this);\r\n\r\n this.onCanvasPointerDown = this.onCanvasPointerDown.bind(this);\r\n this.onCanvasDblClick = this.onCanvasDblClick.bind(this);\r\n this.onKeyUp = this.onKeyUp.bind(this);\r\n this.onPointerMove = this.onPointerMove.bind(this);\r\n this.onPointerOut = this.onPointerOut.bind(this);\r\n this.onPointerUp = this.onPointerUp.bind(this);\r\n\r\n this.createMarker = this.createMarker.bind(this);\r\n this.addNewMarker = this.addNewMarker.bind(this);\r\n this.markerCreated = this.markerCreated.bind(this);\r\n this.markerStateChanged = this.markerStateChanged.bind(this);\r\n this.deleteMarker = this.deleteMarker.bind(this);\r\n this.deleteSelectedMarkers = this.deleteSelectedMarkers.bind(this);\r\n\r\n this.switchToSelectMode = this.switchToSelectMode.bind(this);\r\n\r\n this.showOutline = this.showOutline.bind(this);\r\n this.hideOutline = this.hideOutline.bind(this);\r\n\r\n this.getState = this.getState.bind(this);\r\n this.restoreState = this.restoreState.bind(this);\r\n\r\n this.undo = this.undo.bind(this);\r\n this.addUndoStep = this.addUndoStep.bind(this);\r\n this.undoStep = this.undoStep.bind(this);\r\n this.redo = this.redo.bind(this);\r\n this.redoStep = this.redoStep.bind(this);\r\n\r\n this.toggleLogo = this.toggleLogo.bind(this);\r\n this.addLogo = this.addLogo.bind(this);\r\n this.removeLogo = this.removeLogo.bind(this);\r\n\r\n this.adjustMarqueeSelectOutline =\r\n this.adjustMarqueeSelectOutline.bind(this);\r\n this.hideMarqueeSelectOutline = this.hideMarqueeSelectOutline.bind(this);\r\n\r\n this.addDefs = this.addDefs.bind(this);\r\n this.addDefaultFilterDefs = this.addDefaultFilterDefs.bind(this);\r\n\r\n this.attachShadow({ mode: 'open' });\r\n }\r\n\r\n private connectedCallback() {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerAreaEventData>('areainit', {\r\n detail: { markerArea: this },\r\n }),\r\n );\r\n Activator.addKeyAddListener(this.toggleLogo);\r\n this.createLayout();\r\n this.addMainCanvas();\r\n this.initOverlay();\r\n this.attachEvents();\r\n this._isInitialized = true;\r\n if (this.targetImage !== undefined) {\r\n this.addTargetImage();\r\n }\r\n this.setMainCanvasSize();\r\n this.addDefaultFilterDefs();\r\n this.toggleLogo();\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerAreaEventData>('areashow', {\r\n detail: { markerArea: this },\r\n }),\r\n );\r\n }\r\n\r\n private disconnectedCallback() {\r\n this.detachEvents();\r\n }\r\n\r\n private createLayout() {\r\n this.style.display = 'flex';\r\n this.style.width = this.style.width !== '' ? this.style.width : '100%';\r\n this.style.height = this.style.height !== '' ? this.style.height : '100%';\r\n this.style.position = 'relative';\r\n\r\n this._contentContainer = document.createElement('div');\r\n this._contentContainer.style.display = 'flex';\r\n this._contentContainer.style.position = 'relative';\r\n this._contentContainer.style.flexGrow = '2';\r\n this._contentContainer.style.flexShrink = '1';\r\n this._contentContainer.style.overflow = 'hidden';\r\n\r\n this._canvasContainer = document.createElement('div');\r\n this._canvasContainer.style.touchAction = 'pinch-zoom';\r\n this._canvasContainer.className = 'canvas-container';\r\n this._canvasContainer.style.display = 'grid';\r\n this._canvasContainer.style.gridTemplateColumns = '1fr';\r\n this._canvasContainer.style.flexGrow = '2';\r\n this._canvasContainer.style.flexShrink = '2';\r\n this._canvasContainer.style.justifyItems = 'center';\r\n this._canvasContainer.style.alignItems = 'center';\r\n this._canvasContainer.style.overflow = 'auto';\r\n this._canvasContainer.style.userSelect = 'none';\r\n\r\n this._contentContainer.appendChild(this._canvasContainer);\r\n\r\n this.shadowRoot?.appendChild(this._contentContainer);\r\n }\r\n\r\n private addMainCanvas() {\r\n this.width = this._contentContainer?.clientWidth || 0;\r\n this.height = this._contentContainer?.clientHeight || 0;\r\n\r\n this._mainCanvas = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'svg',\r\n );\r\n this._mainCanvas.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\r\n this.setMainCanvasSize();\r\n this._mainCanvas.style.gridColumnStart = '1';\r\n this._mainCanvas.style.gridRowStart = '1';\r\n this._mainCanvas.style.pointerEvents = 'auto';\r\n // this._mainCanvas.style.backgroundColor = 'pink'; // @todo\r\n // this._mainCanvas.style.opacity = '0.3'; // @todo\r\n this._mainCanvas.style.margin = '10px';\r\n this._mainCanvas.style.transform = `scale(${this._zoomLevel})`;\r\n\r\n this.addDefsToMainCanvas();\r\n\r\n this._groupLayer = SvgHelper.createGroup();\r\n\r\n this._mainCanvas.appendChild(this._groupLayer);\r\n\r\n this._canvasContainer?.appendChild(this._mainCanvas);\r\n }\r\n\r\n private addDefsToMainCanvas() {\r\n this._defsElement = SvgHelper.createDefs();\r\n this._mainCanvas?.appendChild(this._defsElement);\r\n this._defsElement.append(...this._defs);\r\n }\r\n\r\n private setMainCanvasSize() {\r\n if (\r\n this._mainCanvas !== undefined &&\r\n this._targetHeight > 0 &&\r\n this._targetWidth > 0\r\n ) {\r\n this._mainCanvas.style.width = `${this._targetWidth * this.zoomLevel}px`;\r\n this._mainCanvas.style.height = `${\r\n this._targetHeight * this.zoomLevel\r\n }px`;\r\n this._mainCanvas.setAttribute(\r\n 'width',\r\n `${this._targetWidth * this.zoomLevel}`,\r\n );\r\n this._mainCanvas.setAttribute(\r\n 'height',\r\n `${this._targetHeight * this.zoomLevel}`,\r\n );\r\n this._mainCanvas.setAttribute(\r\n 'viewBox',\r\n '0 0 ' +\r\n this._targetWidth.toString() +\r\n ' ' +\r\n this._targetHeight.toString(),\r\n );\r\n this.setEditingTargetSize();\r\n }\r\n }\r\n\r\n private setEditingTargetSize() {\r\n if (this._editingTarget !== undefined) {\r\n this._editingTarget.width = this._targetWidth * this.zoomLevel;\r\n this._editingTarget.height = this._targetHeight * this.zoomLevel;\r\n this._editingTarget.style.width = `${\r\n this._targetWidth * this.zoomLevel\r\n }px`;\r\n this._editingTarget.style.height = `${\r\n this._targetHeight * this.zoomLevel\r\n }px`;\r\n }\r\n }\r\n\r\n private initOverlay(): void {\r\n this._overlayContainer = document.createElement('div');\r\n this._overlayContainer.style.pointerEvents = 'none';\r\n this._overlayContainer.style.display = 'flex';\r\n this._overlayContainer.style.alignItems = 'center';\r\n this._overlayContainer.style.justifyContent = 'center';\r\n this._overlayContainer.style.gridRowStart = '1';\r\n this._overlayContainer.style.gridColumnStart = '1';\r\n\r\n this._canvasContainer?.appendChild(this._overlayContainer);\r\n\r\n this._overlayContentContainer = document.createElement('div');\r\n this._overlayContentContainer.style.position = 'relative';\r\n // @todo\r\n // this._overlayContentContainer.style.width = `${this.documentWidth}px`;\r\n // this._overlayContentContainer.style.height = `${this.documentHeight}px`;\r\n this._overlayContentContainer.style.display = 'flex';\r\n this._overlayContainer.appendChild(this._overlayContentContainer);\r\n }\r\n\r\n private addTargetImage() {\r\n if (\r\n this._isInitialized &&\r\n this._editingTarget === undefined &&\r\n this.targetImage !== undefined &&\r\n this._canvasContainer !== undefined &&\r\n this._mainCanvas !== undefined\r\n ) {\r\n this._editingTarget = document.createElement('img');\r\n\r\n this._targetWidth =\r\n this._targetWidth > 0\r\n ? this._targetWidth\r\n : this.targetImage.clientWidth;\r\n this._targetHeight =\r\n this._targetHeight > 0\r\n ? this._targetHeight\r\n : this.targetImage.clientHeight;\r\n\r\n this._editingTarget.addEventListener('load', (ev) => {\r\n if (this._editingTarget !== undefined) {\r\n if (this._targetHeight <= 0 || this._targetWidth <= 0) {\r\n const img = <HTMLImageElement>ev.target;\r\n\r\n const aspectRatio = img.naturalWidth / img.naturalHeight;\r\n const calculatedWidth =\r\n this._targetWidth > 0\r\n ? this._targetWidth\r\n : this._targetHeight > 0\r\n ? this._targetHeight * aspectRatio\r\n : img.clientWidth > 0\r\n ? img.clientWidth\r\n : img.naturalWidth;\r\n const calculatedHeight =\r\n this._targetHeight > 0\r\n ? this._targetHeight\r\n : this._targetWidth > 0\r\n ? this._targetWidth / aspectRatio\r\n : img.clientHeight > 0\r\n ? img.clientHeight\r\n : img.naturalHeight;\r\n\r\n this._targetWidth = calculatedWidth;\r\n this._targetHeight = calculatedHeight;\r\n }\r\n this._editingTarget.width = this._targetWidth;\r\n this._editingTarget.height = this._targetHeight;\r\n this._editingTarget.style.width = `${this._targetWidth}px`;\r\n this._editingTarget.style.height = `${this._targetHeight}px`;\r\n this._editingTarget.style.gridColumnStart = '1';\r\n this._editingTarget.style.gridRowStart = '1';\r\n\r\n this.setMainCanvasSize();\r\n\r\n this._targetImageLoaded = true;\r\n if (this._stateToRestore !== undefined) {\r\n this.restoreState(this._stateToRestore);\r\n }\r\n }\r\n\r\n // reset zoom to scroll to center if needed\r\n this.zoomLevel = this._zoomLevel;\r\n });\r\n this._editingTarget.src = this.targetImage.src;\r\n\r\n this._canvasContainer.insertBefore(this._editingTarget, this._mainCanvas);\r\n }\r\n }\r\n\r\n private addDefaultFilterDefs() {\r\n this.addDefs(...SvgFilters.getDefaultFilterSet());\r\n }\r\n\r\n /**\r\n * Registers a marker type and its editor to be available in the marker area.\r\n * @param markerType\r\n * @param editorType\r\n */\r\n public registerMarkerType(\r\n markerType: typeof MarkerBase,\r\n editorType: typeof MarkerBaseEditor<MarkerBase>,\r\n ) {\r\n this.markerEditors.set(markerType, editorType);\r\n }\r\n\r\n /**\r\n * Creates a new marker of the specified type.\r\n * @param markerType\r\n * @returns\r\n */\r\n public createMarker(markerType: typeof MarkerBase | string) {\r\n let mType: typeof MarkerBase = FrameMarker;\r\n if (typeof markerType === 'string') {\r\n mType = this.getMarkerTypeByName(markerType) || FrameMarker;\r\n } else {\r\n mType = markerType;\r\n }\r\n const markerEditor = this.markerEditors.get(mType);\r\n if (markerEditor && this._mainCanvas) {\r\n this.setCurrentEditor();\r\n this.deselectEditor();\r\n this.addUndoStep();\r\n this._currentMarkerEditor = this.addNewMarker(markerEditor, mType);\r\n this._currentMarkerEditor.onMarkerCreated = this.markerCreated;\r\n this._currentMarkerEditor.onStateChanged = this.markerStateChanged;\r\n\r\n switch (this._currentMarkerEditor.creationStyle) {\r\n case 'drop':\r\n this._mainCanvas.style.cursor = 'move';\r\n break;\r\n case 'draw':\r\n default:\r\n this._mainCanvas.style.cursor = 'crosshair';\r\n break;\r\n }\r\n\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markercreating', {\r\n detail: {\r\n markerArea: this,\r\n markerEditor: this._currentMarkerEditor,\r\n },\r\n }),\r\n );\r\n }\r\n\r\n return this._currentMarkerEditor;\r\n }\r\n\r\n private addNewMarker(\r\n markerEditorType: typeof MarkerBaseEditor<MarkerBase>,\r\n markerType: typeof MarkerBase,\r\n ): MarkerBaseEditor {\r\n if (this._mainCanvas === undefined) {\r\n throw new Error('Main canvas is not initialized.');\r\n }\r\n\r\n const g = SvgHelper.createGroup();\r\n if (this.defaultFilter && markerType.applyDefaultFilter) {\r\n g.setAttribute('filter', this.defaultFilter);\r\n }\r\n this._mainCanvas.appendChild(g);\r\n\r\n return new markerEditorType({\r\n container: g,\r\n overlayContainer: this._overlayContentContainer,\r\n markerType: markerType,\r\n });\r\n }\r\n\r\n private markerCreated(editor: MarkerBaseEditor<MarkerBase>) {\r\n if (this._mainCanvas) {\r\n this.mode = 'select';\r\n this._mainCanvas.style.cursor = 'default';\r\n this.editors.push(editor);\r\n this.setCurrentEditor(editor);\r\n if (editor.continuousCreation) {\r\n const newMarkerEditor = this.createMarker(editor.marker.typeName);\r\n if (\r\n editor.is(FreehandMarkerEditor) &&\r\n newMarkerEditor?.is(FreehandMarkerEditor)\r\n ) {\r\n newMarkerEditor.strokeColor = editor.strokeColor;\r\n newMarkerEditor.strokeWidth = editor.strokeWidth;\r\n newMarkerEditor.strokeDasharray = editor.strokeDasharray;\r\n }\r\n }\r\n this.addUndoStep();\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markercreate', {\r\n detail: { markerArea: this, markerEditor: editor },\r\n }),\r\n );\r\n }\r\n }\r\n\r\n private markerStateChanged(markerEditor: MarkerBaseEditor): void {\r\n this.addUndoStep();\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markerchange', {\r\n detail: { markerArea: this, markerEditor: markerEditor },\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Deletes a marker represented by the specified editor.\r\n * @param markerEditor\r\n */\r\n public deleteMarker(markerEditor: MarkerBaseEditor): void {\r\n if (this.editors.indexOf(markerEditor) >= 0) {\r\n this.addUndoStep();\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markerbeforedelete', {\r\n detail: { markerArea: this, markerEditor: markerEditor },\r\n }),\r\n );\r\n this._mainCanvas?.removeChild(markerEditor.container);\r\n markerEditor.dispose();\r\n this.editors.splice(this.editors.indexOf(markerEditor), 1);\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markerdelete', {\r\n detail: { markerArea: this, markerEditor: markerEditor },\r\n }),\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Deselects all markers.\r\n */\r\n public deleteSelectedMarkers() {\r\n this._selectedMarkerEditors.forEach((m) => this.deleteMarker(m));\r\n this._selectedMarkerEditors.splice(0);\r\n this.hideMarqueeSelectOutline();\r\n }\r\n\r\n /**\r\n * Sets the current editor and selects it.\r\n *\r\n * If `editor` is not supplied the current editor is unselected.\r\n *\r\n * @param editor\r\n */\r\n public setCurrentEditor(editor?: MarkerBaseEditor): void {\r\n if (this._currentMarkerEditor !== editor) {\r\n // no need to deselect if not changed\r\n if (this._currentMarkerEditor !== undefined) {\r\n this.deselectEditor(this._currentMarkerEditor);\r\n }\r\n }\r\n this._currentMarkerEditor = editor;\r\n if (\r\n this._currentMarkerEditor !== undefined &&\r\n !this._currentMarkerEditor.isSelected\r\n ) {\r\n if (this._currentMarkerEditor.state !== 'new') {\r\n this.selectEditor(this._currentMarkerEditor);\r\n this._currentMarkerEditor.select(false);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Selects the specified editor without setting it as the current editor.\r\n * @param editor\r\n */\r\n public selectEditor(editor: MarkerBaseEditor): void {\r\n if (this._selectedMarkerEditors.indexOf(editor) < 0) {\r\n if (this._selectedMarkerEditors.length > 0) {\r\n this._selectedMarkerEditors[0].select(true);\r\n }\r\n this._selectedMarkerEditors.push(editor);\r\n editor.select(true);\r\n\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markerselect', {\r\n detail: { markerArea: this, markerEditor: editor },\r\n }),\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Deselects the specified editor (or all editors if not specified).\r\n * @param editor\r\n */\r\n public deselectEditor(editor?: MarkerBaseEditor): void {\r\n const selectedCountOnEntry = this._selectedMarkerEditors.length;\r\n\r\n if (selectedCountOnEntry > 0) {\r\n const eventEditor =\r\n editor ??\r\n this._selectedMarkerEditors[this._selectedMarkerEditors.length - 1];\r\n\r\n if (editor === undefined) {\r\n this._selectedMarkerEditors.forEach((m) => m.deselect());\r\n this._selectedMarkerEditors.splice(0);\r\n } else {\r\n const index = this._selectedMarkerEditors.indexOf(editor);\r\n if (index >= 0) {\r\n this._selectedMarkerEditors.splice(index, 1);\r\n editor.deselect();\r\n }\r\n }\r\n\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markerdeselect', {\r\n detail: { markerArea: this, markerEditor: eventEditor },\r\n }),\r\n );\r\n }\r\n }\r\n\r\n private touchPoints = 0;\r\n private leadPointerId?: number;\r\n private isDragging = false;\r\n private isSelecting = false;\r\n private isPanning = false;\r\n\r\n private _marqueeSelectOutline: SVGRectElement = SvgHelper.createRect(0, 0, [\r\n ['stroke', 'rgb(35, 35, 255)'],\r\n ['stroke-width', '1'],\r\n ['fill', 'rgba(129, 129, 255, 0.3)'],\r\n ['pointer-events', 'none'],\r\n ['cursor', 'move'],\r\n ]);\r\n private _marqueeSelectRect = new DOMRect(0, 0, 0, 0);\r\n\r\n private _manipulationStartX = 0;\r\n private _manipulationStartY = 0;\r\n\r\n private onCanvasPointerDown(ev: PointerEvent) {\r\n // @todo ?\r\n // if (!this._isFocused) {\r\n // this.focus();\r\n // }\r\n\r\n this._manipulationStartX = ev.clientX;\r\n this._manipulationStartY = ev.clientY;\r\n\r\n this.touchPoints++;\r\n if (this.touchPoints === 1) {\r\n this.leadPointerId = ev.pointerId;\r\n }\r\n\r\n if (\r\n (ev.pointerType === 'touch' && this.touchPoints === 1) ||\r\n (ev.pointerType !== 'touch' && ev.button === 0 && !ev.altKey)\r\n ) {\r\n if (\r\n this._currentMarkerEditor !== undefined &&\r\n (this._currentMarkerEditor.state === 'new' ||\r\n this._currentMarkerEditor.state === 'creating')\r\n ) {\r\n this.isDragging = true;\r\n this._currentMarkerEditor.pointerDown(\r\n SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n ev.clientX,\r\n ev.clientY,\r\n this.zoomLevel,\r\n ),\r\n ev.target ?? undefined,\r\n ev,\r\n );\r\n } else if (this.mode === 'select') {\r\n const localPoint = SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n ev.clientX,\r\n ev.clientY,\r\n this.zoomLevel,\r\n );\r\n const hitMarker = this.editors.find((m) => m.ownsTarget(ev.target));\r\n if (hitMarker !== undefined) {\r\n this.isDragging = true;\r\n if (ev.shiftKey) {\r\n this.selectEditor(hitMarker);\r\n this.initializeMarqueeSelection(localPoint);\r\n } else if (!hitMarker.isSelected) {\r\n this.deselectEditor();\r\n this.setCurrentEditor(hitMarker);\r\n }\r\n this._selectedMarkerEditors.forEach((m) =>\r\n m.pointerDown(localPoint, ev.target ?? undefined, ev),\r\n );\r\n } else if (\r\n ev.target === this._marqueeSelectOutline &&\r\n this._selectedMarkerEditors.length > 1\r\n ) {\r\n this.isDragging = true;\r\n this._selectedMarkerEditors.forEach((m) =>\r\n m.pointerDown(localPoint, ev.target ?? undefined, ev),\r\n );\r\n } else {\r\n this.setCurrentEditor();\r\n this.deselectEditor();\r\n this.isSelecting = true;\r\n this.isDragging = true;\r\n\r\n // marquee select\r\n this.initializeMarqueeSelection(localPoint);\r\n\r\n this.prevPanPoint = { x: ev.clientX, y: ev.clientY };\r\n }\r\n }\r\n } else if (\r\n (ev.pointerType !== 'touch' &&\r\n ((ev.button === 0 && ev.altKey) || ev.button === 1)) || // left button + alt or middle button\r\n (ev.pointerType === 'touch' &&\r\n this.touchPoints === 2 &&\r\n ev.pointerId === this.leadPointerId)\r\n ) {\r\n this.isDragging = true;\r\n this.isPanning = true;\r\n this.prevPanPoint = { x: ev.clientX, y: ev.clientY };\r\n\r\n if (this._mainCanvas) {\r\n this._mainCanvas.style.cursor = 'grabbing';\r\n }\r\n }\r\n }\r\n\r\n private initializeMarqueeSelection(localPoint: IPoint) {\r\n this._marqueeSelectRect.x = localPoint.x;\r\n this._marqueeSelectRect.y = localPoint.y;\r\n this._marqueeSelectRect.width = 0;\r\n this._marqueeSelectRect.height = 0;\r\n SvgHelper.setAttributes(this._marqueeSelectOutline, [\r\n ['x', localPoint.x.toString()],\r\n ['y', localPoint.y.toString()],\r\n ['width', '0'],\r\n ['height', '0'],\r\n ]);\r\n if (\r\n this._groupLayer &&\r\n !this._groupLayer.contains(this._marqueeSelectOutline)\r\n ) {\r\n this._groupLayer.appendChild(this._marqueeSelectOutline);\r\n }\r\n }\r\n\r\n private onCanvasDblClick(ev: MouseEvent) {\r\n // @todo ?\r\n // if (!this._isFocused) {\r\n // this.focus();\r\n // }\r\n\r\n if (this.mode === 'select') {\r\n const hitMarker = this.editors.find((m) => m.ownsTarget(ev.target));\r\n if (hitMarker !== undefined && hitMarker !== this._currentMarkerEditor) {\r\n this.setCurrentEditor(hitMarker);\r\n }\r\n if (this._currentMarkerEditor !== undefined) {\r\n this._currentMarkerEditor.dblClick(\r\n SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n ev.clientX,\r\n ev.clientY,\r\n this.zoomLevel,\r\n ),\r\n ev.target ?? undefined,\r\n ev,\r\n );\r\n } else {\r\n this.setCurrentEditor();\r\n }\r\n }\r\n }\r\n\r\n private onPointerMove(ev: PointerEvent) {\r\n if (\r\n (ev.pointerType === 'touch' && this.touchPoints === 1) ||\r\n (ev.pointerType !== 'touch' && this.isDragging && !ev.altKey)\r\n ) {\r\n const localPoint = SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n ev.clientX,\r\n ev.clientY,\r\n this.zoomLevel,\r\n );\r\n\r\n if (\r\n this._currentMarkerEditor !== undefined ||\r\n this._selectedMarkerEditors.length > 0\r\n ) {\r\n // don't swallow the event when editing text markers\r\n if (\r\n this._currentMarkerEditor === undefined ||\r\n this._currentMarkerEditor.state !== 'edit'\r\n ) {\r\n ev.preventDefault();\r\n }\r\n\r\n if (\r\n this._currentMarkerEditor !== undefined ||\r\n this._selectedMarkerEditors.length > 0\r\n ) {\r\n this.showOutline(localPoint);\r\n\r\n if (this._selectedMarkerEditors.length > 0) {\r\n this._selectedMarkerEditors.forEach((m) =>\r\n m.manipulate(localPoint, ev),\r\n );\r\n } else {\r\n this._currentMarkerEditor?.manipulate(localPoint, ev);\r\n }\r\n } else if (this.zoomLevel > 1) {\r\n this.panTo({ x: ev.clientX, y: ev.clientY });\r\n }\r\n\r\n this.adjustMarqueeSelectOutline();\r\n } else if (this.isSelecting) {\r\n // adjust marquee\r\n const localManipulationStart = SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n this._manipulationStartX,\r\n this._manipulationStartY,\r\n this.zoomLevel,\r\n );\r\n\r\n this._marqueeSelectRect.x = Math.min(\r\n localPoint.x,\r\n localManipulationStart.x,\r\n );\r\n this._marqueeSelectRect.y = Math.min(\r\n localPoint.y,\r\n localManipulationStart.y,\r\n );\r\n this._marqueeSelectRect.width =\r\n Math.abs(ev.clientX - this._manipulationStartX) / this.zoomLevel;\r\n this._marqueeSelectRect.height =\r\n Math.abs(ev.clientY - this._manipulationStartY) / this.zoomLevel;\r\n\r\n SvgHelper.setAttributes(this._marqueeSelectOutline, [\r\n ['x', `${this._marqueeSelectRect.x}`],\r\n ['y', `${this._marqueeSelectRect.y}`],\r\n ['width', `${this._marqueeSelectRect.width}`],\r\n ['height', `${this._marqueeSelectRect.height}`],\r\n ]);\r\n }\r\n } else if (\r\n (ev.pointerType !== 'touch' && this.isPanning) ||\r\n (ev.pointerType === 'touch' &&\r\n this.touchPoints === 2 &&\r\n ev.pointerId === this.leadPointerId)\r\n ) {\r\n this.panTo({ x: ev.clientX, y: ev.clientY });\r\n }\r\n }\r\n\r\n private showOutline(localPoint: IPoint) {\r\n if (\r\n this._currentMarkerEditor &&\r\n this._currentMarkerEditor.creationStyle === 'drop' &&\r\n this._currentMarkerEditor.state === 'new'\r\n ) {\r\n if (\r\n this._mainCanvas !== undefined &&\r\n !this._mainCanvas.contains(this._newMarkerOutline)\r\n ) {\r\n this._mainCanvas.appendChild(this._newMarkerOutline);\r\n }\r\n const size = this._currentMarkerEditor.marker.defaultSize;\r\n SvgHelper.setAttributes(this._newMarkerOutline, [\r\n ['d', this._currentMarkerEditor.marker.getOutline()],\r\n ]);\r\n this._newMarkerOutline.style.transform = `translate(${\r\n localPoint.x - size.width / 2\r\n }px, ${localPoint.y - size.height / 2}px)`;\r\n }\r\n }\r\n\r\n private hideOutline() {\r\n if (this._mainCanvas?.contains(this._newMarkerOutline)) {\r\n this._mainCanvas.removeChild(this._newMarkerOutline);\r\n }\r\n }\r\n\r\n private onPointerUp(ev: PointerEvent) {\r\n if (this.touchPoints > 0) {\r\n this.touchPoints--;\r\n if (this.touchPoints === 0) {\r\n this.leadPointerId = undefined;\r\n }\r\n }\r\n if (this.touchPoints === 0) {\r\n if (\r\n this.isDragging &&\r\n (this._currentMarkerEditor !== undefined ||\r\n this._selectedMarkerEditors.length > 0)\r\n ) {\r\n const localPoint = SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n ev.clientX,\r\n ev.clientY,\r\n this.zoomLevel,\r\n );\r\n\r\n if (this._selectedMarkerEditors.length > 1) {\r\n this._selectedMarkerEditors.forEach((m) =>\r\n m.pointerUp(localPoint, ev),\r\n );\r\n this.adjustMarqueeSelectOutline();\r\n } else {\r\n this._currentMarkerEditor?.pointerUp(localPoint, ev);\r\n }\r\n\r\n this.hideOutline();\r\n\r\n this.addUndoStep();\r\n } else if (this.isSelecting) {\r\n // finish marquee selection\r\n this.finishMarqueeSelection();\r\n if (this._selectedMarkerEditors.length < 2) {\r\n this.hideMarqueeSelectOutline();\r\n if (this._selectedMarkerEditors.length === 1) {\r\n // revert to single selection\r\n const onlySelected = this._selectedMarkerEditors[0];\r\n this.deselectEditor();\r\n this.setCurrentEditor(onlySelected);\r\n }\r\n }\r\n }\r\n }\r\n this.isDragging = false;\r\n this.isSelecting = false;\r\n this.isPanning = false;\r\n if (this._mainCanvas) {\r\n this._mainCanvas.style.cursor = 'default';\r\n }\r\n }\r\n\r\n private finishMarqueeSelection() {\r\n this.deselectEditor();\r\n\r\n this.editors.forEach((m) => {\r\n const markerRect = m.marker.getBBox();\r\n if (\r\n markerRect.x <\r\n this._marqueeSelectRect.x + this._marqueeSelectRect.width &&\r\n markerRect.x + markerRect.width > this._marqueeSelectRect.x &&\r\n markerRect.y <\r\n this._marqueeSelectRect.y + this._marqueeSelectRect.height &&\r\n markerRect.y + markerRect.height > this._marqueeSelectRect.y\r\n ) {\r\n this.selectEditor(m);\r\n }\r\n });\r\n\r\n this.adjustMarqueeSelectOutline();\r\n }\r\n\r\n private adjustMarqueeSelectOutline() {\r\n let x = Number.MAX_VALUE;\r\n let y = Number.MAX_VALUE;\r\n let width = 0;\r\n let height = 0;\r\n\r\n this._selectedMarkerEditors.forEach((m) => {\r\n const markerRect = m.marker.getBBox();\r\n\r\n x = Math.min(x, markerRect.x);\r\n y = Math.min(y, markerRect.y);\r\n width = Math.max(width, markerRect.x + markerRect.width);\r\n height = Math.max(height, markerRect.y + markerRect.height);\r\n });\r\n\r\n if (this._selectedMarkerEditors.length > 1) {\r\n this._marqueeSelectRect.x = x;\r\n this._marqueeSelectRect.y = y;\r\n this._marqueeSelectRect.width = width - x;\r\n this._marqueeSelectRect.height = height - y;\r\n\r\n SvgHelper.setAttributes(this._marqueeSelectOutline, [\r\n ['x', `${this._marqueeSelectRect.x}`],\r\n ['y', `${this._marqueeSelectRect.y}`],\r\n ['width', `${this._marqueeSelectRect.width}`],\r\n ['height', `${this._marqueeSelectRect.height}`],\r\n ['pointer-events', ''],\r\n ]);\r\n } else {\r\n this.hideMarqueeSelectOutline();\r\n }\r\n }\r\n\r\n private hideMarqueeSelectOutline() {\r\n if (\r\n this._groupLayer &&\r\n this._groupLayer.contains(this._marqueeSelectOutline)\r\n ) {\r\n this._groupLayer.removeChild(this._marqueeSelectOutline);\r\n }\r\n }\r\n\r\n private onPointerOut(/*ev: PointerEvent*/) {\r\n if (this.touchPoints > 0) {\r\n this.touchPoints--;\r\n }\r\n this.hideOutline();\r\n }\r\n\r\n private onKeyUp(ev: KeyboardEvent) {\r\n if (\r\n this._currentMarkerEditor !== undefined &&\r\n (ev.key === 'Delete' || ev.key === 'Backspace')\r\n ) {\r\n // @todo\r\n // this.deleteSelectedMarker();\r\n }\r\n }\r\n\r\n private attachEvents() {\r\n // needed to distinguish when the element is in focus (active)\r\n if (!this.hasAttribute('tabindex')) {\r\n this.setAttribute('tabindex', '0');\r\n }\r\n\r\n // @todo\r\n // this.setupResizeObserver();\r\n this._mainCanvas?.addEventListener('pointerdown', this.onCanvasPointerDown);\r\n // workaround to prevent a bug with Apple Pencil\r\n // https://bugs.webkit.org/show_bug.cgi?id=217430\r\n this._mainCanvas?.addEventListener('touchmove', (ev) =>\r\n ev.preventDefault(),\r\n );\r\n this._mainCanvas?.addEventListener('dblclick', this.onCanvasDblClick);\r\n\r\n this._marqueeSelectOutline.addEventListener('dblclick', (ev) => {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.deselectEditor();\r\n this.hideMarqueeSelectOutline();\r\n });\r\n\r\n // @todo - using these in Diagrams but not in mjs2 - why?\r\n // this._mainCanvas?.addEventListener('pointermove', this.onCanvasPointerMove);\r\n // this._mainCanvas?.addEventListener('pointerup', this.onCanvasPointerUp);\r\n // this._mainCanvas?.addEventListener('pointerout', this.onCanvasPointerOut);\r\n this.attachWindowEvents();\r\n }\r\n\r\n private attachWindowEvents() {\r\n window.addEventListener('pointermove', this.onPointerMove);\r\n window.addEventListener('pointerup', this.onPointerUp);\r\n window.addEventListener('pointerleave', this.onPointerUp);\r\n window.addEventListener('pointercancel', this.onPointerOut);\r\n window.addEventListener('pointerout', this.onPointerOut);\r\n window.addEventListener('keyup', this.onKeyUp);\r\n }\r\n\r\n private detachEvents() {\r\n // @todo\r\n // if (this._resizeObserver && this._container) {\r\n // this._resizeObserver.unobserve(this._container);\r\n // }\r\n\r\n // this._mainCanvas?.removeEventListener(\r\n // 'pointerdown',\r\n // this.onCanvasPointerDown\r\n // );\r\n // this._mainCanvas?.removeEventListener(\r\n // 'pointerdown',\r\n // this.onCanvasPointerUp\r\n // );\r\n // this._mainCanvas?.removeEventListener('dblclick', this.onDblClick);\r\n this.detachWindowEvents();\r\n }\r\n\r\n private detachWindowEvents() {\r\n // @todo\r\n // window.removeEventListener('pointermove', this.onPointerMove);\r\n // window.removeEventListener('pointerup', this.onPointerUp);\r\n // window.removeEventListener('pointercancel', this.onPointerOut);\r\n // window.removeEventListener('pointerout', this.onPointerOut);\r\n // window.removeEventListener('pointerleave', this.onPointerUp);\r\n // window.removeEventListener('keyup', this.onKeyUp);\r\n }\r\n\r\n private getMarkerTypeByName(typeName: string): typeof MarkerBase | undefined {\r\n let result: typeof MarkerBase | undefined;\r\n this.markerEditors.forEach((value, key) => {\r\n if (key.typeName === typeName) {\r\n result = key;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Switches the marker area to select mode and deselects all the selected markers.\r\n */\r\n public switchToSelectMode() {\r\n this.setCurrentEditor();\r\n if (this._mainCanvas) {\r\n this._mainCanvas.style.cursor = 'default';\r\n }\r\n }\r\n\r\n /**\r\n * Returns the annotation state.\r\n * @returns\r\n */\r\n public getState(): AnnotationState {\r\n const result: AnnotationState = {\r\n version: 3,\r\n width: this.targetWidth,\r\n height: this.targetHeight,\r\n defaultFilter: this.defaultFilter,\r\n\r\n markers: this.editors.map((editor) => {\r\n return editor.getState();\r\n }),\r\n };\r\n\r\n return JSON.parse(JSON.stringify(result));\r\n }\r\n\r\n private _stateToRestore: AnnotationState | undefined;\r\n /**\r\n * Restores the annotation from the previously saved state.\r\n * @param state\r\n * @param addUndoStep if true (default) or omitted, an undo step is added after restoring the state\r\n */\r\n public restoreState(state: AnnotationState, addUndoStep = true): void {\r\n // can't restore if image is not loaded yet\r\n if (!this._targetImageLoaded) {\r\n this._stateToRestore = state;\r\n return;\r\n }\r\n this._stateToRestore = undefined;\r\n\r\n const stateCopy: AnnotationState = JSON.parse(JSON.stringify(state));\r\n this.editors.splice(0);\r\n\r\n if (this._mainCanvas && this._groupLayer) {\r\n while (this._mainCanvas.lastChild) {\r\n this._mainCanvas.removeChild(this._mainCanvas.lastChild);\r\n }\r\n // re-add defs\r\n this.addDefsToMainCanvas();\r\n // re-add group layer\r\n this._mainCanvas.appendChild(this._groupLayer);\r\n }\r\n\r\n if (this.defaultFilter === undefined && stateCopy.defaultFilter) {\r\n this.defaultFilter = stateCopy.defaultFilter;\r\n }\r\n\r\n stateCopy.markers.forEach((markerState) => {\r\n const markerType = this.getMarkerTypeByName(markerState.typeName);\r\n if (markerType !== undefined) {\r\n const editorType = this.markerEditors.get(markerType);\r\n if (editorType !== undefined) {\r\n const markerEditor = this.addNewMarker(editorType, markerType);\r\n markerEditor.restoreState(markerState);\r\n this.editors.push(markerEditor);\r\n }\r\n }\r\n });\r\n\r\n if (\r\n stateCopy.width &&\r\n stateCopy.height &&\r\n (stateCopy.width !== this.targetWidth ||\r\n stateCopy.height !== this.targetHeight)\r\n ) {\r\n this.scaleMarkers(\r\n this.targetWidth / stateCopy.width,\r\n this.targetHeight / stateCopy.height,\r\n );\r\n }\r\n\r\n if (addUndoStep) {\r\n this.addUndoStep();\r\n }\r\n\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerAreaEventData>('arearestorestate', {\r\n detail: { markerArea: this },\r\n }),\r\n );\r\n }\r\n\r\n private scaleMarkers(scaleX: number, scaleY: number) {\r\n let preScaleSelectedMarker: MarkerBaseEditor | undefined;\r\n // @todo\r\n // if (!(this._currentMarker && this._currentMarker instanceof TextMarker)) {\r\n // can't unselect text marker as it would hide keyboard on mobile\r\n // eslint-disable-next-line prefer-const\r\n preScaleSelectedMarker = this._currentMarkerEditor;\r\n this.setCurrentEditor();\r\n // } else {\r\n // this._currentMarker.scale(scaleX, scaleY);\r\n // }\r\n this.editors.forEach((editor) => {\r\n if (editor !== this._currentMarkerEditor) {\r\n editor.scale(scaleX, scaleY);\r\n }\r\n });\r\n if (preScaleSelectedMarker !== undefined) {\r\n this.setCurrentEditor(preScaleSelectedMarker);\r\n }\r\n }\r\n\r\n /**\r\n * NOTE:\r\n *\r\n * before removing or modifying this method please consider supporting marker.js\r\n * by visiting https://markerjs.com/ for details\r\n *\r\n * thank you!\r\n */\r\n private toggleLogo() {\r\n if (!Activator.isLicensed('MJS3E') && !Activator.isLicensed('MJS3')) {\r\n // NOTE:\r\n // before removing this call please consider supporting marker.js\r\n // by visiting https://markerjs.com/ for details\r\n // thank you!\r\n this.addLogo();\r\n } else {\r\n this.removeLogo();\r\n }\r\n }\r\n\r\n private addLogo() {\r\n if (this._logoUI !== undefined) {\r\n this._contentContainer?.removeChild(this._logoUI);\r\n }\r\n this._logoUI = document.createElement('div');\r\n this._logoUI.style.display = 'inline-block';\r\n this._logoUI.style.margin = '0px';\r\n this._logoUI.style.padding = '0px';\r\n this._logoUI.style.fill = '#333333';\r\n this._logoUI.style.opacity = '0.5';\r\n const logoUI = this._logoUI;\r\n this._logoUI.addEventListener('mouseenter', () => {\r\n logoUI.style.opacity = '1';\r\n });\r\n this._logoUI.addEventListener('mouseleave', () => {\r\n logoUI.style.opacity = '0.5';\r\n });\r\n\r\n const link = document.createElement('a');\r\n link.href = 'https://markerjs.com/';\r\n link.target = '_blank';\r\n link.innerHTML = Logo;\r\n link.title = 'Powered by marker.js';\r\n\r\n link.style.display = 'grid';\r\n link.style.alignItems = 'center';\r\n link.style.justifyItems = 'center';\r\n link.style.padding = '3px';\r\n link.style.width = '20px';\r\n link.style.height = '20px';\r\n link.style.cursor = 'pointer';\r\n\r\n this._logoUI.appendChild(link);\r\n\r\n this._contentContainer?.appendChild(this._logoUI);\r\n\r\n this._logoUI.style.position = 'absolute';\r\n this._logoUI.style.pointerEvents = 'all';\r\n this.positionLogo();\r\n }\r\n\r\n private removeLogo() {\r\n if (\r\n this._contentContainer &&\r\n this._logoUI !== undefined &&\r\n this._contentContainer.contains(this._logoUI)\r\n ) {\r\n this._contentContainer.removeChild(this._logoUI);\r\n }\r\n }\r\n\r\n private positionLogo() {\r\n if (this._logoUI && this._contentContainer) {\r\n this._logoUI.style.left = `20px`;\r\n this._logoUI.style.bottom = `20px`;\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if undo operation can be performed (undo stack is not empty).\r\n */\r\n public get isUndoPossible(): boolean {\r\n if (this.undoRedoManager && this.undoRedoManager.isUndoPossible) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if redo operation can be performed (redo stack is not empty).\r\n */\r\n public get isRedoPossible(): boolean {\r\n if (this.undoRedoManager && this.undoRedoManager.isRedoPossible) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n private addUndoStep() {\r\n if (\r\n this._currentMarkerEditor === undefined ||\r\n this._currentMarkerEditor.state !== 'edit'\r\n ) {\r\n const currentState = this.getState();\r\n const lastUndoState = this.undoRedoManager.getLastUndoStep();\r\n if (\r\n lastUndoState &&\r\n (lastUndoState.width !== currentState.width ||\r\n lastUndoState.height !== currentState.height)\r\n ) {\r\n // if the size changed just replace the last step with a resized one\r\n this.undoRedoManager.replaceLastUndoStep(currentState);\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerAreaEventData>('areastatechange', {\r\n detail: { markerArea: this },\r\n }),\r\n );\r\n } else {\r\n const stepAdded = this.undoRedoManager.addUndoStep(currentState);\r\n if (stepAdded) {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerAreaEventData>('areastatechange', {\r\n detail: { markerArea: this },\r\n }),\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Undo last action.\r\n */\r\n public undo(): void {\r\n // this.addUndoStep(); // this seems illogical, but it was here for some reason, commenting for now in case regressions occur\r\n this.undoStep();\r\n }\r\n\r\n private undoStep(): void {\r\n const stepData = this.undoRedoManager.undo();\r\n if (stepData !== undefined) {\r\n this.restoreState(stepData, false);\r\n }\r\n }\r\n\r\n /**\r\n * Redo previously undone action.\r\n */\r\n public redo(): void {\r\n this.redoStep();\r\n }\r\n\r\n private redoStep(): void {\r\n const stepData = this.undoRedoManager.redo();\r\n if (stepData !== undefined) {\r\n this.restoreState(stepData, false);\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerAreaEventData>('areastatechange', {\r\n detail: { markerArea: this },\r\n }),\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Adds \"defs\" to main canvas SVG.\r\n * Useful for filters, custom fonts and potentially other scenarios.\r\n *\r\n * @param nodes\r\n * @since 3.3.0\r\n */\r\n public addDefs(...nodes: (string | Node)[]): void {\r\n this._defs.push(...nodes);\r\n\r\n if (this._defsElement) {\r\n this._defsElement.append(...nodes);\r\n }\r\n }\r\n\r\n addEventListener<T extends keyof MarkerAreaEventMap>(\r\n // the event name, a key of MarkerAreaEventMap\r\n type: T,\r\n\r\n // the listener, using a value of MarkerAreaEventMap\r\n listener: (this: MarkerArea, ev: MarkerAreaEventMap[T]) => void,\r\n\r\n // any options\r\n options?: boolean | AddEventListenerOptions,\r\n ): void;\r\n addEventListener<K extends keyof HTMLElementEventMap>(\r\n type: K,\r\n listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => void,\r\n options?: boolean | AddEventListenerOptions | undefined,\r\n ): void;\r\n addEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject,\r\n options?: boolean | AddEventListenerOptions | undefined,\r\n ): void {\r\n super.addEventListener(type, listener, options);\r\n }\r\n\r\n removeEventListener<T extends keyof MarkerAreaEventMap>(\r\n // the event name, a key of MarkerAreaEventMap\r\n type: T,\r\n\r\n // the listener, using a value of MarkerAreaEventMap\r\n listener: (this: MarkerArea, ev: MarkerAreaEventMap[T]) => void,\r\n\r\n // any options\r\n options?: boolean | EventListenerOptions,\r\n ): void;\r\n removeEventListener<K extends keyof HTMLElementEventMap>(\r\n type: K,\r\n listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => void,\r\n options?: boolean | EventListenerOptions | undefined,\r\n ): void;\r\n removeEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject,\r\n options?: boolean | EventListenerOptions | undefined,\r\n ): void {\r\n super.removeEventListener(type, listener, options);\r\n }\r\n}\r\n","/**\r\n * @module Editor\r\n * @category API Reference\r\n */\r\nimport { MarkerArea } from './MarkerArea';\r\n\r\nexport {\r\n MarkerArea,\r\n MarkerAreaEventData,\r\n MarkerEditorEventData,\r\n MarkerAreaMode,\r\n MarkerAreaEventMap,\r\n} from './MarkerArea';\r\nexport {\r\n MarkerBaseEditor,\r\n MarkerEditorState,\r\n MarkerCreationStyle,\r\n} from './editor/MarkerBaseEditor';\r\nexport { MarkerEditorProperties } from './editor/MarkerEditorProperties';\r\nexport { Grip, GripLocation } from './editor/Grip';\r\nexport { ResizeGrip } from './editor/ResizeGrip';\r\nexport { RotateGrip } from './editor/RotateGrip';\r\nexport { ShapeOutlineMarkerEditor } from './editor/ShapeOutlineMarkerEditor';\r\nexport { ShapeMarkerEditor } from './editor/ShapeMarkerEditor';\r\nexport { LinearMarkerEditor } from './editor/LinearMarkerEditor';\r\nexport { PolygonMarkerEditor } from './editor/PolygonMarkerEditor';\r\nexport { FreehandMarkerEditor } from './editor/FreehandMarkerEditor';\r\nexport {\r\n TextBlockEditor,\r\n BlurHandler,\r\n TextChangedHandler,\r\n} from './editor/TextBlockEditor';\r\nexport { TextMarkerEditor } from './editor/TextMarkerEditor';\r\nexport { ArrowMarkerEditor } from './editor/ArrowMarkerEditor';\r\nexport { CalloutMarkerEditor } from './editor/CalloutMarkerEditor';\r\nexport { ImageMarkerEditor } from './editor/ImageMarkerEditor';\r\nexport { CaptionFrameMarkerEditor } from './editor/CaptionFrameMarkerEditor';\r\nexport { CurveMarkerEditor } from './editor/CurveMarkerEditor';\r\n\r\nif (\r\n window &&\r\n window.customElements &&\r\n window.customElements.get('mjs-marker-area') === undefined\r\n) {\r\n window.customElements.define('mjs-marker-area', MarkerArea);\r\n}\r\n","import {\r\n AnnotationState,\r\n CoverMarker,\r\n FrameMarker,\r\n FreehandMarker,\r\n HighlightMarker,\r\n MarkerBase,\r\n PolygonMarker,\r\n SvgHelper,\r\n TextMarker,\r\n LineMarker,\r\n MeasurementMarker,\r\n ArrowMarker,\r\n EllipseFrameMarker,\r\n EllipseMarker,\r\n CustomImageMarker,\r\n CheckImageMarker,\r\n XImageMarker,\r\n CaptionFrameMarker,\r\n CalloutMarker,\r\n CurveMarker,\r\n HighlighterMarker,\r\n SvgFilters,\r\n IPoint,\r\n} from './core';\r\nimport { Activator } from './core/Activator';\r\n\r\nimport Logo from './assets/markerjs-logo-m.svg';\r\n\r\n/**\r\n * Event map for {@link MarkerView}.\r\n */\r\nexport interface MarkerViewEventMap {\r\n /**\r\n * Viewer initialized.\r\n */\r\n viewinit: CustomEvent<MarkerViewEventData>;\r\n\r\n /**\r\n * Viewer shown.\r\n */\r\n viewshow: CustomEvent<MarkerViewEventData>;\r\n\r\n /**\r\n * Viewer state restored.\r\n */\r\n viewrestorestate: CustomEvent<MarkerViewEventData>;\r\n\r\n /**\r\n * Marker clicked.\r\n */\r\n markerclick: CustomEvent<MarkerEventData>;\r\n /**\r\n * Marker mouse over.\r\n */\r\n markerover: CustomEvent<MarkerEventData>;\r\n /**\r\n * Marker pointer down.\r\n */\r\n markerpointerdown: CustomEvent<MarkerEventData>;\r\n /**\r\n * Marker pointer move.\r\n */\r\n markerpointermove: CustomEvent<MarkerEventData>;\r\n /**\r\n * Marker pointer up.\r\n */\r\n markerpointerup: CustomEvent<MarkerEventData>;\r\n /**\r\n * Marker pointer enter.\r\n */\r\n markerpointerenter: CustomEvent<MarkerEventData>;\r\n /**\r\n * Marker pointer leave.\r\n */\r\n markerpointerleave: CustomEvent<MarkerEventData>;\r\n}\r\n\r\n/**\r\n * Event data for {@link MarkerView}.\r\n */\r\nexport interface MarkerViewEventData {\r\n /**\r\n * {@link MarkerView} instance.\r\n */\r\n markerView: MarkerView;\r\n}\r\n\r\n/**\r\n * Marker custom event data.\r\n */\r\nexport interface MarkerEventData extends MarkerViewEventData {\r\n /**\r\n * Marker instance.\r\n */\r\n marker: MarkerBase;\r\n}\r\n\r\n/**\r\n * MarkerView is the main annotation viewer web component.\r\n *\r\n * @summary\r\n * The main annotation viewer web component.\r\n *\r\n * @group Components\r\n *\r\n * @example\r\n * To show dynamic annotation overlays on top of the original image you use `MarkerView`.\r\n * ```js\r\n * import { MarkerView } from '@markerjs/markerjs3';\r\n *\r\n * const markerView = new MarkerView();\r\n * markerView.targetImage = targetImg;\r\n * viewerContainer.appendChild(markerView);\r\n *\r\n * markerView.show(savedState);\r\n * ```\r\n */\r\nexport class MarkerView extends HTMLElement {\r\n private _contentContainer?: HTMLDivElement;\r\n private _canvasContainer?: HTMLDivElement;\r\n\r\n private _mainCanvas?: SVGSVGElement;\r\n private _groupLayer?: SVGGElement;\r\n\r\n private _editingTarget?: HTMLImageElement;\r\n\r\n private width = 0;\r\n private height = 0;\r\n\r\n private _targetWidth = -1;\r\n /**\r\n * Returns the target image width.\r\n */\r\n public get targetWidth() {\r\n return this._targetWidth;\r\n }\r\n /**\r\n * Sets the target image width.\r\n */\r\n public set targetWidth(value) {\r\n this._targetWidth = value;\r\n this.setMainCanvasSize();\r\n }\r\n private _targetHeight = -1;\r\n /**\r\n * Returns the target image height.\r\n */\r\n public get targetHeight() {\r\n return this._targetHeight;\r\n }\r\n /**\r\n * Sets the target image height.\r\n */\r\n public set targetHeight(value) {\r\n this._targetHeight = value;\r\n this.setMainCanvasSize();\r\n }\r\n\r\n private _targetImageLoaded = false;\r\n private _targetImage: HTMLImageElement | undefined;\r\n /**\r\n * Returns the target image.\r\n */\r\n public get targetImage(): HTMLImageElement | undefined {\r\n return this._targetImage;\r\n }\r\n /**\r\n * Sets the target image.\r\n */\r\n public set targetImage(value: HTMLImageElement | undefined) {\r\n this._targetImage = value;\r\n this._targetImageLoaded = false;\r\n if (value !== undefined) {\r\n this.addTargetImage();\r\n }\r\n }\r\n\r\n /**\r\n * Marker types available for the viewer.\r\n */\r\n public markerTypes: Array<typeof MarkerBase> = [];\r\n\r\n /**\r\n * Collection of markers currently displayed on the viewer.\r\n */\r\n public markers: MarkerBase[] = [];\r\n\r\n private _logoUI?: HTMLElement;\r\n\r\n private _zoomLevel = 1;\r\n /**\r\n * Returns the current zoom level.\r\n */\r\n public get zoomLevel(): number {\r\n return this._zoomLevel;\r\n }\r\n /**\r\n * Sets the current zoom level.\r\n */\r\n public set zoomLevel(value: number) {\r\n this._zoomLevel = value;\r\n if (this._canvasContainer && this._contentContainer && this._mainCanvas) {\r\n this._mainCanvas.style.transform = `scale(${this._zoomLevel})`;\r\n this.setEditingTargetSize();\r\n\r\n const scrollMultiplier = Math.max(this._zoomLevel, 1);\r\n this._canvasContainer.scrollTo({\r\n left:\r\n (this._mainCanvas.clientWidth * scrollMultiplier -\r\n this._canvasContainer.clientWidth) /\r\n 2,\r\n top:\r\n (this._mainCanvas.clientHeight * scrollMultiplier -\r\n this._canvasContainer.clientHeight) /\r\n 2,\r\n });\r\n }\r\n }\r\n\r\n private _defaultFilter?: string;\r\n /**\r\n * Returns the default SVG filter for the created markers.\r\n *\r\n * @since 3.2.0\r\n */\r\n public get defaultFilter(): string | undefined {\r\n return this._defaultFilter;\r\n }\r\n /**\r\n * Sets the default SVG filter for the created markers\r\n * (e.g. \"drop-shadow(2px 2px 2px black)\").\r\n *\r\n * @since 3.2.0\r\n */\r\n public set defaultFilter(value: string | undefined) {\r\n this._defaultFilter = value;\r\n }\r\n\r\n private _isInitialized = false;\r\n\r\n private _defsElement?: SVGDefsElement;\r\n private _defs: (string | Node)[] = [];\r\n\r\n private prevPanPoint: IPoint = { x: 0, y: 0 };\r\n\r\n constructor() {\r\n super();\r\n\r\n this.markerTypes = [\r\n FrameMarker,\r\n LineMarker,\r\n ArrowMarker,\r\n MeasurementMarker,\r\n PolygonMarker,\r\n FreehandMarker,\r\n TextMarker,\r\n CoverMarker,\r\n HighlightMarker,\r\n CalloutMarker,\r\n EllipseFrameMarker,\r\n EllipseMarker,\r\n CustomImageMarker,\r\n CheckImageMarker,\r\n XImageMarker,\r\n CaptionFrameMarker,\r\n CurveMarker,\r\n HighlighterMarker,\r\n ];\r\n\r\n this.connectedCallback = this.connectedCallback.bind(this);\r\n this.disconnectedCallback = this.disconnectedCallback.bind(this);\r\n\r\n this.createLayout = this.createLayout.bind(this);\r\n this.addMainCanvas = this.addMainCanvas.bind(this);\r\n this.setMainCanvasSize = this.setMainCanvasSize.bind(this);\r\n this.setEditingTargetSize = this.setEditingTargetSize.bind(this);\r\n this.addTargetImage = this.addTargetImage.bind(this);\r\n\r\n this.attachMarkerEvents = this.attachMarkerEvents.bind(this);\r\n this.attachEvents = this.attachEvents.bind(this);\r\n this.attachWindowEvents = this.attachWindowEvents.bind(this);\r\n this.detachEvents = this.detachEvents.bind(this);\r\n this.detachWindowEvents = this.detachWindowEvents.bind(this);\r\n\r\n this.onCanvasPointerDown = this.onCanvasPointerDown.bind(this);\r\n this.onPointerMove = this.onPointerMove.bind(this);\r\n this.onPointerUp = this.onPointerUp.bind(this);\r\n this.onPointerOut = this.onPointerOut.bind(this);\r\n\r\n this.addNewMarker = this.addNewMarker.bind(this);\r\n\r\n this.show = this.show.bind(this);\r\n this.scaleMarkers = this.scaleMarkers.bind(this);\r\n\r\n this.toggleLogo = this.toggleLogo.bind(this);\r\n this.addLogo = this.addLogo.bind(this);\r\n this.removeLogo = this.removeLogo.bind(this);\r\n\r\n this.addDefs = this.addDefs.bind(this);\r\n this.addDefaultFilterDefs = this.addDefaultFilterDefs.bind(this);\r\n\r\n this.attachShadow({ mode: 'open' });\r\n }\r\n\r\n private connectedCallback() {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerViewEventData>('viewinit', {\r\n detail: { markerView: this },\r\n }),\r\n );\r\n Activator.addKeyAddListener(this.toggleLogo);\r\n this.createLayout();\r\n this.addMainCanvas();\r\n this.attachEvents();\r\n this._isInitialized = true;\r\n if (this.targetImage !== undefined) {\r\n this.addTargetImage();\r\n }\r\n this.setMainCanvasSize();\r\n this.addDefaultFilterDefs();\r\n this.toggleLogo();\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerViewEventData>('viewshow', {\r\n detail: { markerView: this },\r\n }),\r\n );\r\n }\r\n\r\n private disconnectedCallback() {\r\n this.detachEvents();\r\n }\r\n\r\n private createLayout() {\r\n this.style.display = 'flex';\r\n this.style.width = this.style.width !== '' ? this.style.width : '100%';\r\n this.style.height = this.style.height !== '' ? this.style.height : '100%';\r\n this.style.position = 'relative';\r\n\r\n this._contentContainer = document.createElement('div');\r\n this._contentContainer.style.display = 'flex';\r\n this._contentContainer.style.position = 'relative';\r\n this._contentContainer.style.flexGrow = '2';\r\n this._contentContainer.style.flexShrink = '1';\r\n this._contentContainer.style.overflow = 'hidden';\r\n\r\n this._canvasContainer = document.createElement('div');\r\n this._canvasContainer.style.touchAction = 'pinch-zoom';\r\n this._canvasContainer.className = 'canvas-container';\r\n this._canvasContainer.style.display = 'grid';\r\n this._canvasContainer.style.gridTemplateColumns = '1fr';\r\n this._canvasContainer.style.flexGrow = '2';\r\n this._canvasContainer.style.flexShrink = '2';\r\n this._canvasContainer.style.justifyItems = 'center';\r\n this._canvasContainer.style.alignItems = 'center';\r\n this._canvasContainer.style.overflow = 'auto';\r\n this._contentContainer.appendChild(this._canvasContainer);\r\n\r\n this.shadowRoot?.appendChild(this._contentContainer);\r\n }\r\n\r\n private addMainCanvas() {\r\n this.width = this._contentContainer?.clientWidth || 0;\r\n this.height = this._contentContainer?.clientHeight || 0;\r\n\r\n this._mainCanvas = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'svg',\r\n );\r\n this._mainCanvas.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\r\n this.setMainCanvasSize();\r\n this._mainCanvas.style.gridColumnStart = '1';\r\n this._mainCanvas.style.gridRowStart = '1';\r\n this._mainCanvas.style.pointerEvents = 'auto';\r\n // this._mainCanvas.style.backgroundColor = 'pink'; // @todo\r\n // this._mainCanvas.style.opacity = '0.3'; // @todo\r\n this._mainCanvas.style.margin = '10px';\r\n this._mainCanvas.style.transform = `scale(${this._zoomLevel})`;\r\n\r\n this.addDefsToMainCanvas();\r\n\r\n this._groupLayer = SvgHelper.createGroup();\r\n\r\n this._mainCanvas.appendChild(this._groupLayer);\r\n\r\n this._canvasContainer?.appendChild(this._mainCanvas);\r\n }\r\n\r\n private addDefsToMainCanvas() {\r\n this._defsElement = SvgHelper.createDefs();\r\n this._mainCanvas?.appendChild(this._defsElement);\r\n this._defsElement.append(...this._defs);\r\n }\r\n\r\n private setMainCanvasSize() {\r\n if (\r\n this._mainCanvas !== undefined &&\r\n this._targetHeight > 0 &&\r\n this._targetWidth > 0\r\n ) {\r\n this._mainCanvas.style.width = `${this._targetWidth * this.zoomLevel}px`;\r\n this._mainCanvas.style.height = `${\r\n this._targetHeight * this.zoomLevel\r\n }px`;\r\n this._mainCanvas.setAttribute(\r\n 'width',\r\n `${this._targetWidth * this.zoomLevel}`,\r\n );\r\n this._mainCanvas.setAttribute(\r\n 'height',\r\n `${this._targetHeight * this.zoomLevel}`,\r\n );\r\n this._mainCanvas.setAttribute(\r\n 'viewBox',\r\n '0 0 ' +\r\n this._targetWidth.toString() +\r\n ' ' +\r\n this._targetHeight.toString(),\r\n );\r\n this.setEditingTargetSize();\r\n }\r\n }\r\n\r\n private setEditingTargetSize() {\r\n if (this._editingTarget !== undefined) {\r\n this._editingTarget.width = this._targetWidth * this.zoomLevel;\r\n this._editingTarget.height = this._targetHeight * this.zoomLevel;\r\n this._editingTarget.style.width = `${\r\n this._targetWidth * this.zoomLevel\r\n }px`;\r\n this._editingTarget.style.height = `${\r\n this._targetHeight * this.zoomLevel\r\n }px`;\r\n }\r\n }\r\n\r\n private addTargetImage() {\r\n if (\r\n this._isInitialized &&\r\n this._editingTarget === undefined &&\r\n this.targetImage !== undefined &&\r\n this._canvasContainer !== undefined &&\r\n this._mainCanvas !== undefined\r\n ) {\r\n this._editingTarget = document.createElement('img');\r\n\r\n this._targetWidth =\r\n this._targetWidth > 0\r\n ? this._targetWidth\r\n : this.targetImage.clientWidth;\r\n this._targetHeight =\r\n this._targetHeight > 0\r\n ? this._targetHeight\r\n : this.targetImage.clientHeight;\r\n\r\n this._editingTarget.addEventListener('load', (ev) => {\r\n if (this._editingTarget !== undefined) {\r\n if (this._targetHeight <= 0 || this._targetWidth <= 0) {\r\n const img = <HTMLImageElement>ev.target;\r\n\r\n const aspectRatio = img.naturalWidth / img.naturalHeight;\r\n const calculatedWidth =\r\n this._targetWidth > 0\r\n ? this._targetWidth\r\n : this._targetHeight > 0\r\n ? this._targetHeight * aspectRatio\r\n : img.clientWidth > 0\r\n ? img.clientWidth\r\n : img.naturalWidth;\r\n const calculatedHeight =\r\n this._targetHeight > 0\r\n ? this._targetHeight\r\n : this._targetWidth > 0\r\n ? this._targetWidth / aspectRatio\r\n : img.clientHeight > 0\r\n ? img.clientHeight\r\n : img.naturalHeight;\r\n\r\n this._targetWidth = calculatedWidth;\r\n this._targetHeight = calculatedHeight;\r\n }\r\n this._editingTarget.width = this._targetWidth;\r\n this._editingTarget.height = this._targetHeight;\r\n this._editingTarget.style.width = `${this._targetWidth}px`;\r\n this._editingTarget.style.height = `${this._targetHeight}px`;\r\n this._editingTarget.style.gridColumnStart = '1';\r\n this._editingTarget.style.gridRowStart = '1';\r\n\r\n this.setMainCanvasSize();\r\n\r\n this._targetImageLoaded = true;\r\n if (this._stateToRestore !== undefined) {\r\n this.show(this._stateToRestore);\r\n }\r\n }\r\n\r\n // reset zoom to scroll to center if needed\r\n this.zoomLevel = this._zoomLevel;\r\n });\r\n this._editingTarget.src = this.targetImage.src;\r\n\r\n this._canvasContainer.insertBefore(this._editingTarget, this._mainCanvas);\r\n }\r\n }\r\n\r\n private addDefaultFilterDefs() {\r\n this.addDefs(...SvgFilters.getDefaultFilterSet());\r\n }\r\n\r\n private addNewMarker(markerType: typeof MarkerBase): MarkerBase {\r\n if (this._mainCanvas === undefined) {\r\n throw new Error('Main canvas is not initialized.');\r\n }\r\n\r\n const g = SvgHelper.createGroup();\r\n if (this.defaultFilter && markerType.applyDefaultFilter) {\r\n g.setAttribute('filter', this.defaultFilter);\r\n }\r\n this._mainCanvas.appendChild(g);\r\n\r\n const newMarker = new markerType(g);\r\n\r\n this.attachMarkerEvents(newMarker);\r\n\r\n return newMarker;\r\n }\r\n\r\n private attachMarkerEvents(marker: MarkerBase) {\r\n marker.container.addEventListener('click', () => {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEventData>('markerclick', {\r\n detail: { marker: marker, markerView: this },\r\n }),\r\n );\r\n });\r\n marker.container.addEventListener('pointerover', () => {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEventData>('markerover', {\r\n detail: { marker: marker, markerView: this },\r\n }),\r\n );\r\n });\r\n marker.container.addEventListener('pointerdown', () => {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEventData>('markerpointerdown', {\r\n detail: { marker: marker, markerView: this },\r\n }),\r\n );\r\n });\r\n marker.container.addEventListener('pointermove', () => {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEventData>('markerpointermove', {\r\n detail: { marker: marker, markerView: this },\r\n }),\r\n );\r\n });\r\n marker.container.addEventListener('pointerup', () => {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEventData>('markerpointerup', {\r\n detail: { marker: marker, markerView: this },\r\n }),\r\n );\r\n });\r\n marker.container.addEventListener('pointerenter', () => {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEventData>('markerpointerenter', {\r\n detail: { marker: marker, markerView: this },\r\n }),\r\n );\r\n });\r\n marker.container.addEventListener('pointerleave', () => {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEventData>('markerpointerleave', {\r\n detail: { marker: marker, markerView: this },\r\n }),\r\n );\r\n });\r\n }\r\n\r\n private attachEvents() {\r\n // needed to distinguish when the element is in focus (active)\r\n if (!this.hasAttribute('tabindex')) {\r\n this.setAttribute('tabindex', '0');\r\n }\r\n\r\n // @todo\r\n // this.setupResizeObserver();\r\n\r\n this._mainCanvas?.addEventListener('pointerdown', this.onCanvasPointerDown);\r\n // workaround to prevent a bug with Apple Pencil\r\n // https://bugs.webkit.org/show_bug.cgi?id=217430\r\n this._mainCanvas?.addEventListener('touchmove', (ev) =>\r\n ev.preventDefault(),\r\n );\r\n\r\n this.attachWindowEvents();\r\n }\r\n\r\n private attachWindowEvents() {\r\n window.addEventListener('pointermove', this.onPointerMove);\r\n window.addEventListener('pointerup', this.onPointerUp);\r\n window.addEventListener('pointerleave', this.onPointerUp);\r\n window.addEventListener('pointercancel', this.onPointerOut);\r\n window.addEventListener('pointerout', this.onPointerOut);\r\n }\r\n\r\n private detachEvents() {\r\n // @todo\r\n // if (this._resizeObserver && this._container) {\r\n // this._resizeObserver.unobserve(this._container);\r\n // }\r\n // this._mainCanvas?.removeEventListener('pointerdown', this.onPointerDown);\r\n // this._mainCanvas?.removeEventListener(\r\n // 'pointerdown',\r\n // this.onStencilPointerUp\r\n // );\r\n this.detachWindowEvents();\r\n }\r\n\r\n private detachWindowEvents() {\r\n // @todo\r\n // window.removeEventListener('pointermove', this.onPointerMove);\r\n // window.removeEventListener('pointerup', this.onPointerUp);\r\n // window.removeEventListener('pointercancel', this.onPointerOut);\r\n // window.removeEventListener('pointerout', this.onPointerOut);\r\n // window.removeEventListener('pointerleave', this.onPointerUp);\r\n }\r\n\r\n private touchPoints = 0;\r\n private leadPointerId?: number;\r\n\r\n private onCanvasPointerDown(ev: PointerEvent) {\r\n // @todo ?\r\n // if (!this._isFocused) {\r\n // this.focus();\r\n // }\r\n\r\n this.touchPoints++;\r\n if (this.touchPoints === 1) {\r\n this.leadPointerId = ev.pointerId;\r\n this.prevPanPoint = { x: ev.clientX, y: ev.clientY };\r\n if (this._mainCanvas) {\r\n this._mainCanvas.style.cursor = 'grabbing';\r\n }\r\n }\r\n }\r\n\r\n private onPointerMove(ev: PointerEvent) {\r\n if (this.touchPoints > 0 && this.leadPointerId === ev.pointerId) {\r\n this.panTo({ x: ev.clientX, y: ev.clientY });\r\n }\r\n }\r\n\r\n private onPointerUp() {\r\n if (this.touchPoints > 0) {\r\n this.touchPoints--;\r\n if (this.touchPoints === 0) {\r\n this.leadPointerId = undefined;\r\n }\r\n\r\n if (this._mainCanvas) {\r\n this._mainCanvas.style.cursor = 'default';\r\n }\r\n }\r\n }\r\n\r\n private onPointerOut(/*ev: PointerEvent*/) {\r\n if (this.touchPoints > 0) {\r\n this.touchPoints--;\r\n }\r\n }\r\n\r\n private getMarkerTypeByName(typeName: string): typeof MarkerBase | undefined {\r\n let result: typeof MarkerBase | undefined;\r\n this.markerTypes.forEach((mType) => {\r\n if (mType.typeName === typeName) {\r\n result = mType;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Adds a new marker type to be available in the viewer.\r\n * @param markerType\r\n */\r\n public registerMarkerType(markerType: typeof MarkerBase): void {\r\n if (this.markerTypes.indexOf(markerType) < 0) {\r\n this.markerTypes.push(markerType);\r\n }\r\n }\r\n\r\n private _stateToRestore: AnnotationState | undefined;\r\n /**\r\n * Loads and shows previously saved annotation state.\r\n * @param state\r\n */\r\n public show(state: AnnotationState): void {\r\n // can't restore if image is not loaded yet\r\n if (!this._targetImageLoaded) {\r\n this._stateToRestore = state;\r\n return;\r\n }\r\n this._stateToRestore = undefined;\r\n\r\n const stateCopy: AnnotationState = JSON.parse(JSON.stringify(state));\r\n this.markers.splice(0);\r\n\r\n while (this._mainCanvas?.lastChild) {\r\n this._mainCanvas.removeChild(this._mainCanvas.lastChild);\r\n }\r\n\r\n // re-add defs\r\n this.addDefsToMainCanvas();\r\n\r\n if (this.defaultFilter === undefined && stateCopy.defaultFilter) {\r\n this.defaultFilter = stateCopy.defaultFilter;\r\n }\r\n\r\n stateCopy.markers.forEach((markerState) => {\r\n const markerType = this.getMarkerTypeByName(markerState.typeName);\r\n if (markerType !== undefined) {\r\n const marker = this.addNewMarker(markerType);\r\n marker.restoreState(markerState);\r\n this.markers.push(marker);\r\n }\r\n });\r\n\r\n if (\r\n stateCopy.width &&\r\n stateCopy.height &&\r\n (stateCopy.width !== this.targetWidth ||\r\n stateCopy.height !== this.targetHeight)\r\n ) {\r\n this.scaleMarkers(\r\n this.targetWidth / stateCopy.width,\r\n this.targetHeight / stateCopy.height,\r\n );\r\n }\r\n\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerViewEventData>('viewrestorestate', {\r\n detail: { markerView: this },\r\n }),\r\n );\r\n }\r\n\r\n private scaleMarkers(scaleX: number, scaleY: number) {\r\n this.markers.forEach((marker) => {\r\n marker.scale(scaleX, scaleY);\r\n });\r\n }\r\n\r\n private panTo(point: IPoint) {\r\n this._canvasContainer?.scrollBy({\r\n left: this.prevPanPoint.x - point.x,\r\n top: this.prevPanPoint.y - point.y,\r\n });\r\n this.prevPanPoint = point;\r\n }\r\n\r\n /**\r\n * NOTE:\r\n *\r\n * before removing or modifying this method please consider supporting marker.js\r\n * by visiting https://markerjs.com/buy for details\r\n *\r\n * thank you!\r\n */\r\n private toggleLogo() {\r\n if (!Activator.isLicensed('MJS3V') && !Activator.isLicensed('MJS3')) {\r\n // NOTE:\r\n // before removing this call please consider supporting marker.js\r\n // by visiting https://markerjs.com/ for details\r\n // thank you!\r\n this.addLogo();\r\n } else {\r\n this.removeLogo();\r\n }\r\n }\r\n\r\n private addLogo() {\r\n if (this._logoUI !== undefined) {\r\n this._contentContainer?.removeChild(this._logoUI);\r\n }\r\n this._logoUI = document.createElement('div');\r\n this._logoUI.style.display = 'inline-block';\r\n this._logoUI.style.margin = '0px';\r\n this._logoUI.style.padding = '0px';\r\n this._logoUI.style.fill = '#333333';\r\n this._logoUI.style.opacity = '0.5';\r\n const logoUI = this._logoUI;\r\n this._logoUI.addEventListener('mouseenter', () => {\r\n logoUI.style.opacity = '1';\r\n });\r\n this._logoUI.addEventListener('mouseleave', () => {\r\n logoUI.style.opacity = '0.5';\r\n });\r\n\r\n const link = document.createElement('a');\r\n link.href = 'https://markerjs.com/';\r\n link.target = '_blank';\r\n link.innerHTML = Logo;\r\n link.title = 'Powered by marker.js';\r\n\r\n link.style.display = 'grid';\r\n link.style.alignItems = 'center';\r\n link.style.justifyItems = 'center';\r\n link.style.padding = '3px';\r\n link.style.width = '20px';\r\n link.style.height = '20px';\r\n link.style.cursor = 'pointer';\r\n\r\n this._logoUI.appendChild(link);\r\n\r\n this._contentContainer?.appendChild(this._logoUI);\r\n\r\n this._logoUI.style.position = 'absolute';\r\n this._logoUI.style.pointerEvents = 'all';\r\n this.positionLogo();\r\n }\r\n\r\n private removeLogo() {\r\n if (\r\n this._contentContainer &&\r\n this._logoUI !== undefined &&\r\n this._contentContainer.contains(this._logoUI)\r\n ) {\r\n this._contentContainer.removeChild(this._logoUI);\r\n }\r\n }\r\n\r\n private positionLogo() {\r\n if (this._logoUI && this._contentContainer) {\r\n this._logoUI.style.left = `20px`;\r\n this._logoUI.style.bottom = `20px`;\r\n }\r\n }\r\n\r\n /**\r\n * Adds \"defs\" to main canvas SVG.\r\n * Useful for filters, custom fonts and potentially other scenarios.\r\n * @since 3.3.0\r\n */\r\n public addDefs(...nodes: (string | Node)[]): void {\r\n this._defs.push(...nodes);\r\n\r\n if (this._defsElement) {\r\n this._defsElement.append(...nodes);\r\n }\r\n }\r\n\r\n addEventListener<T extends keyof MarkerViewEventMap>(\r\n // the event name, a key of MarkerViewEventMap\r\n type: T,\r\n\r\n // the listener, using a value of MarkerViewEventMap\r\n listener: (this: MarkerView, ev: MarkerViewEventMap[T]) => void,\r\n\r\n // any options\r\n options?: boolean | AddEventListenerOptions,\r\n ): void;\r\n addEventListener<K extends keyof HTMLElementEventMap>(\r\n type: K,\r\n listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => void,\r\n options?: boolean | AddEventListenerOptions | undefined,\r\n ): void;\r\n addEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject,\r\n options?: boolean | AddEventListenerOptions | undefined,\r\n ): void {\r\n super.addEventListener(type, listener, options);\r\n }\r\n\r\n removeEventListener<T extends keyof MarkerViewEventMap>(\r\n // the event name, a key of MarkerViewEventMap\r\n type: T,\r\n\r\n // the listener, using a value of MarkerViewEventMap\r\n listener: (this: MarkerView, ev: MarkerViewEventMap[T]) => void,\r\n\r\n // any options\r\n options?: boolean | EventListenerOptions,\r\n ): void;\r\n removeEventListener<K extends keyof HTMLElementEventMap>(\r\n type: K,\r\n listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => void,\r\n options?: boolean | EventListenerOptions | undefined,\r\n ): void;\r\n removeEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject,\r\n options?: boolean | EventListenerOptions | undefined,\r\n ): void {\r\n super.removeEventListener(type, listener, options);\r\n }\r\n}\r\n","/**\r\n * @module Viewer\r\n * @category API Reference\r\n */\r\nimport { MarkerView } from './MarkerView';\r\n\r\nexport {\r\n MarkerView,\r\n MarkerViewEventData,\r\n MarkerEventData,\r\n MarkerViewEventMap,\r\n} from './MarkerView';\r\n\r\nif (\r\n window &&\r\n window.customElements &&\r\n window.customElements.get('mjs-marker-view') === undefined\r\n) {\r\n window.customElements.define('mjs-marker-view', MarkerView);\r\n}\r\n","/**\r\n * @module Renderer\r\n * @category API Reference\r\n */\r\nimport {\r\n AnnotationState,\r\n CoverMarker,\r\n FrameMarker,\r\n FreehandMarker,\r\n HighlightMarker,\r\n MarkerBase,\r\n PolygonMarker,\r\n SvgHelper,\r\n TextMarker,\r\n LineMarker,\r\n ArrowMarker,\r\n MeasurementMarker,\r\n EllipseFrameMarker,\r\n EllipseMarker,\r\n CalloutMarker,\r\n CustomImageMarker,\r\n CheckImageMarker,\r\n XImageMarker,\r\n CaptionFrameMarker,\r\n CurveMarker,\r\n HighlighterMarker,\r\n SvgFilters,\r\n} from './core';\r\n\r\n/**\r\n * Renderer is used to rasterize annotations.\r\n *\r\n * @example\r\n * To render the annotation as a static image you use `Renderer`.\r\n *\r\n * ```js\r\n * import { MarkerArea, Renderer } from '@markerjs/markerjs3';\r\n * ```\r\n *\r\n * Just create an instance of it and pass the annotation state to the `rasterize()` method:\r\n *\r\n * ```js\r\n * const renderer = new Renderer();\r\n * renderer.targetImage = targetImg;\r\n * const dataUrl = await renderer.rasterize(markerArea.getState());\r\n *\r\n * const img = document.createElement('img');\r\n * img.src = dataUrl;\r\n *\r\n * someDiv.appendChild(img);\r\n * ```\r\n */\r\nexport class Renderer {\r\n private _mainCanvas?: SVGSVGElement;\r\n\r\n private _editingTarget?: HTMLImageElement;\r\n\r\n private _renderHelperContainer?: HTMLDivElement;\r\n\r\n private _targetWidth = -1;\r\n /**\r\n * Width of the target image.\r\n */\r\n public get targetWidth() {\r\n return this._targetWidth;\r\n }\r\n /**\r\n * Width of the target image.\r\n */\r\n public set targetWidth(value) {\r\n this._targetWidth = value;\r\n this.setMainCanvasSize();\r\n }\r\n private _targetHeight = -1;\r\n /**\r\n * Height of the target image.\r\n */\r\n public get targetHeight() {\r\n return this._targetHeight;\r\n }\r\n /**\r\n * Height of the target image.\r\n */\r\n public set targetHeight(value) {\r\n this._targetHeight = value;\r\n this.setMainCanvasSize();\r\n }\r\n\r\n private _targetImageLoaded = false;\r\n\r\n private _targetImage: HTMLImageElement | undefined;\r\n /**\r\n * Target image to render annotations on.\r\n */\r\n public get targetImage(): HTMLImageElement | undefined {\r\n return this._targetImage;\r\n }\r\n /**\r\n * Target image to render annotations on.\r\n */\r\n public set targetImage(value: HTMLImageElement | undefined) {\r\n this._targetImageLoaded = false;\r\n this._targetImage = value;\r\n if (value !== undefined) {\r\n this.addTargetImage();\r\n }\r\n }\r\n\r\n /**\r\n * Marker types available for rendering.\r\n */\r\n public markerTypes: Array<typeof MarkerBase> = [];\r\n\r\n /**\r\n * Array of markers to render.\r\n */\r\n public markers: MarkerBase[] = [];\r\n\r\n private _isInitialized = false;\r\n\r\n /**\r\n * Whether the image should be rendered at the original (natural) target image size.\r\n */\r\n public naturalSize = false;\r\n /**\r\n * Rendered image type (`image/png`, `image/jpeg`, etc.).\r\n */\r\n public imageType = 'image/png';\r\n /**\r\n * For formats that support it, specifies rendering quality.\r\n *\r\n * In the case of `image/jpeg` you can specify a value between 0 and 1 (lowest to highest quality).\r\n *\r\n * @type {number} - image rendering quality (0..1)\r\n */\r\n public imageQuality?: number;\r\n /**\r\n * When set to true, only the marker layer without the original image will be rendered.\r\n */\r\n public markersOnly = false;\r\n\r\n /**\r\n * When set and {@linkcode naturalSize} is `false` sets the width of the rendered image.\r\n *\r\n * Both `width` and `height` have to be set for this to take effect.\r\n */\r\n public width?: number;\r\n /**\r\n * When set and {@linkcode naturalSize} is `false` sets the height of the rendered image.\r\n *\r\n * Both `width` and `height` have to be set for this to take effect.\r\n */\r\n public height?: number;\r\n\r\n private _defaultFilter?: string;\r\n /**\r\n * Returns the default SVG filter for the created markers.\r\n *\r\n * @since 3.2.0\r\n */\r\n public get defaultFilter(): string | undefined {\r\n return this._defaultFilter;\r\n }\r\n /**\r\n * Sets the default SVG filter for the created markers\r\n * (e.g. \"drop-shadow(2px 2px 2px black)\").\r\n *\r\n * @since 3.2.0\r\n */\r\n public set defaultFilter(value: string | undefined) {\r\n this._defaultFilter = value;\r\n }\r\n\r\n private _defsElement?: SVGDefsElement;\r\n private _defs: (string | Node)[] = [];\r\n\r\n constructor() {\r\n this.markerTypes = [\r\n FrameMarker,\r\n LineMarker,\r\n ArrowMarker,\r\n MeasurementMarker,\r\n PolygonMarker,\r\n FreehandMarker,\r\n TextMarker,\r\n CoverMarker,\r\n HighlightMarker,\r\n CalloutMarker,\r\n EllipseFrameMarker,\r\n EllipseMarker,\r\n CustomImageMarker,\r\n CheckImageMarker,\r\n XImageMarker,\r\n CaptionFrameMarker,\r\n CurveMarker,\r\n HighlighterMarker,\r\n ];\r\n\r\n this.init = this.init.bind(this);\r\n\r\n this.addMainCanvas = this.addMainCanvas.bind(this);\r\n this.setMainCanvasSize = this.setMainCanvasSize.bind(this);\r\n this.setEditingTargetSize = this.setEditingTargetSize.bind(this);\r\n this.addTargetImage = this.addTargetImage.bind(this);\r\n\r\n this.addNewMarker = this.addNewMarker.bind(this);\r\n\r\n this.restoreState = this.restoreState.bind(this);\r\n this.scaleMarkers = this.scaleMarkers.bind(this);\r\n\r\n this.addDefs = this.addDefs.bind(this);\r\n this.addDefaultFilterDefs = this.addDefaultFilterDefs.bind(this);\r\n }\r\n\r\n private init() {\r\n this.addMainCanvas();\r\n this._isInitialized = true;\r\n if (this.targetImage !== undefined) {\r\n this.addTargetImage();\r\n }\r\n this.setMainCanvasSize();\r\n this.addDefaultFilterDefs();\r\n }\r\n\r\n private addMainCanvas() {\r\n this._mainCanvas = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'svg',\r\n );\r\n this._mainCanvas.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\r\n this.setMainCanvasSize();\r\n this._mainCanvas.style.gridColumnStart = '1';\r\n this._mainCanvas.style.gridRowStart = '1';\r\n this._mainCanvas.style.pointerEvents = 'auto';\r\n\r\n // text isn't sized correctly without adding to the DOM\r\n this._mainCanvas.style.visibility = 'hidden';\r\n\r\n this.addDefsToMainCanvas();\r\n\r\n this._renderHelperContainer = document.createElement('div');\r\n this._renderHelperContainer.style.position = 'absolute';\r\n this._renderHelperContainer.style.top = '0px';\r\n this._renderHelperContainer.style.left = '0px';\r\n this._renderHelperContainer.style.width = '10px';\r\n this._renderHelperContainer.style.height = '10px';\r\n this._renderHelperContainer.style.overflow = 'hidden';\r\n this._renderHelperContainer.style.visibility = 'hidden';\r\n\r\n this._renderHelperContainer.appendChild(this._mainCanvas);\r\n\r\n document.body.appendChild(this._renderHelperContainer);\r\n }\r\n\r\n private addDefsToMainCanvas() {\r\n this._defsElement = SvgHelper.createDefs();\r\n this._mainCanvas?.appendChild(this._defsElement);\r\n this._defsElement.append(...this._defs);\r\n }\r\n\r\n private setMainCanvasSize() {\r\n if (\r\n this._mainCanvas !== undefined &&\r\n this._targetHeight > 0 &&\r\n this._targetWidth > 0\r\n ) {\r\n this._mainCanvas.style.width = `${this._targetWidth}px`;\r\n this._mainCanvas.style.height = `${this._targetHeight}px`;\r\n this._mainCanvas.setAttribute('width', `${this._targetWidth}`);\r\n this._mainCanvas.setAttribute('height', `${this._targetHeight}`);\r\n this._mainCanvas.setAttribute(\r\n 'viewBox',\r\n '0 0 ' +\r\n this._targetWidth.toString() +\r\n ' ' +\r\n this._targetHeight.toString(),\r\n );\r\n this.setEditingTargetSize();\r\n }\r\n }\r\n\r\n private setEditingTargetSize() {\r\n if (this._editingTarget !== undefined) {\r\n this._editingTarget.width = this._targetWidth;\r\n this._editingTarget.height = this._targetHeight;\r\n this._editingTarget.style.width = `${this._targetWidth}px`;\r\n this._editingTarget.style.height = `${this._targetHeight}px`;\r\n }\r\n }\r\n\r\n private addTargetImage() {\r\n if (\r\n this._isInitialized &&\r\n this._editingTarget === undefined &&\r\n this.targetImage !== undefined &&\r\n this._mainCanvas !== undefined\r\n ) {\r\n this._editingTarget = document.createElement('img');\r\n\r\n this._targetWidth =\r\n this._targetWidth > 0\r\n ? this._targetWidth\r\n : this.targetImage.clientWidth;\r\n this._targetHeight =\r\n this._targetHeight > 0\r\n ? this._targetHeight\r\n : this.targetImage.clientHeight;\r\n\r\n this._editingTarget.addEventListener('load', (ev) => {\r\n if (this._editingTarget !== undefined) {\r\n if (this._targetHeight <= 0 || this._targetWidth <= 0) {\r\n const img = <HTMLImageElement>ev.target;\r\n\r\n const aspectRatio = img.naturalWidth / img.naturalHeight;\r\n const calculatedWidth =\r\n this._targetWidth > 0\r\n ? this._targetWidth\r\n : this._targetHeight > 0\r\n ? this._targetHeight * aspectRatio\r\n : img.naturalWidth;\r\n const calculatedHeight =\r\n this._targetHeight > 0\r\n ? this._targetHeight\r\n : this._targetWidth > 0\r\n ? this._targetWidth / aspectRatio\r\n : img.naturalHeight;\r\n\r\n this._targetWidth = calculatedWidth;\r\n this._targetHeight = calculatedHeight;\r\n }\r\n this._editingTarget.width = this._targetWidth;\r\n this._editingTarget.height = this._targetHeight;\r\n this._editingTarget.style.width = `${this._targetWidth}px`;\r\n this._editingTarget.style.height = `${this._targetHeight}px`;\r\n this._editingTarget.style.gridColumnStart = '1';\r\n this._editingTarget.style.gridRowStart = '1';\r\n\r\n this._targetImageLoaded = true;\r\n\r\n this.setMainCanvasSize();\r\n }\r\n });\r\n this._editingTarget.style.visibility = 'hidden';\r\n this._editingTarget.src = this.targetImage.src;\r\n\r\n this._renderHelperContainer?.insertBefore(\r\n this._editingTarget,\r\n this._mainCanvas,\r\n );\r\n // document.body.appendChild(this._editingTarget);\r\n }\r\n }\r\n\r\n private addDefaultFilterDefs() {\r\n this.addDefs(...SvgFilters.getDefaultFilterSet());\r\n }\r\n\r\n private addNewMarker(markerType: typeof MarkerBase): MarkerBase {\r\n if (this._mainCanvas === undefined) {\r\n throw new Error('Main canvas is not initialized.');\r\n }\r\n\r\n const g = SvgHelper.createGroup();\r\n if (this.defaultFilter && markerType.applyDefaultFilter) {\r\n g.setAttribute('filter', this.defaultFilter);\r\n }\r\n this._mainCanvas.appendChild(g);\r\n\r\n return new markerType(g);\r\n }\r\n\r\n private getMarkerTypeByName(typeName: string): typeof MarkerBase | undefined {\r\n let result: typeof MarkerBase | undefined;\r\n this.markerTypes.forEach((mType) => {\r\n if (mType.typeName === typeName) {\r\n result = mType;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Adds a new marker type to the list of available marker types.\r\n * @param markerType - Marker type to register.\r\n */\r\n public registerMarkerType(markerType: typeof MarkerBase) {\r\n if (this.markerTypes.indexOf(markerType) < 0) {\r\n this.markerTypes.push(markerType);\r\n }\r\n }\r\n\r\n /**\r\n * Restores the annotation state.\r\n * @param state - Annotation state to restore.\r\n */\r\n public restoreState(state: AnnotationState): void {\r\n const stateCopy: AnnotationState = JSON.parse(JSON.stringify(state));\r\n this.markers.splice(0);\r\n\r\n while (this._mainCanvas?.lastChild) {\r\n this._mainCanvas.removeChild(this._mainCanvas.lastChild);\r\n }\r\n\r\n // re-add defs\r\n this.addDefsToMainCanvas();\r\n\r\n if (this.defaultFilter === undefined && stateCopy.defaultFilter) {\r\n this.defaultFilter = stateCopy.defaultFilter;\r\n }\r\n\r\n stateCopy.markers.forEach((markerState) => {\r\n const markerType = this.getMarkerTypeByName(markerState.typeName);\r\n if (markerType !== undefined) {\r\n const marker = this.addNewMarker(markerType);\r\n marker.restoreState(markerState);\r\n this.markers.push(marker);\r\n }\r\n });\r\n\r\n if (\r\n stateCopy.width &&\r\n stateCopy.height &&\r\n (stateCopy.width !== this.targetWidth ||\r\n stateCopy.height !== this.targetHeight)\r\n ) {\r\n this.scaleMarkers(\r\n this.targetWidth / stateCopy.width,\r\n this.targetHeight / stateCopy.height,\r\n );\r\n }\r\n }\r\n\r\n private scaleMarkers(scaleX: number, scaleY: number) {\r\n this.markers.forEach((marker) => {\r\n marker.scale(scaleX, scaleY);\r\n });\r\n }\r\n\r\n /**\r\n * Rasterizes the annotation.\r\n * @param state - annotation state to render.\r\n * @param targetCanvas - optional target canvas to render the annotation on.\r\n * @returns\r\n */\r\n public async rasterize(\r\n state: AnnotationState,\r\n targetCanvas?: HTMLCanvasElement,\r\n ): Promise<string> {\r\n if (!this.naturalSize && this.targetWidth <= 0 && this.targetHeight <= 0) {\r\n this._targetWidth = state.width;\r\n this._targetHeight = state.height;\r\n }\r\n\r\n this.init();\r\n\r\n if (this._mainCanvas === undefined || this.targetImage === undefined) {\r\n throw new Error('Not properly initialized.');\r\n }\r\n\r\n let counter = 0;\r\n while (!this._targetImageLoaded && counter++ < 100) {\r\n // wait for the target image to load\r\n await new Promise((r) => setTimeout(r, 100));\r\n }\r\n\r\n this.restoreState(state);\r\n\r\n const canvas =\r\n targetCanvas !== undefined\r\n ? targetCanvas\r\n : document.createElement('canvas');\r\n\r\n if (this.targetImage === null) {\r\n this.markersOnly = true;\r\n this.naturalSize = false;\r\n }\r\n\r\n const markerImageCopy = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'svg',\r\n );\r\n markerImageCopy.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\r\n markerImageCopy.setAttribute(\r\n 'width',\r\n this._mainCanvas.width.baseVal.valueAsString,\r\n );\r\n markerImageCopy.setAttribute(\r\n 'height',\r\n this._mainCanvas.height.baseVal.valueAsString,\r\n );\r\n markerImageCopy.setAttribute(\r\n 'viewBox',\r\n '0 0 ' +\r\n this._mainCanvas.viewBox.baseVal.width.toString() +\r\n ' ' +\r\n this._mainCanvas.viewBox.baseVal.height.toString(),\r\n );\r\n\r\n // workaround for text positioning delay\r\n await new Promise((r) => setTimeout(r, 200));\r\n\r\n markerImageCopy.innerHTML = this._mainCanvas.innerHTML;\r\n\r\n if (this.naturalSize === true) {\r\n // scale to full image size\r\n markerImageCopy.width.baseVal.value = this.targetImage.naturalWidth;\r\n markerImageCopy.height.baseVal.value = this.targetImage.naturalHeight;\r\n } else if (this.width !== undefined && this.height !== undefined) {\r\n // scale to specific dimensions\r\n markerImageCopy.width.baseVal.value = this.width;\r\n markerImageCopy.height.baseVal.value = this.height;\r\n }\r\n\r\n canvas.width = markerImageCopy.width.baseVal.value;\r\n canvas.height = markerImageCopy.height.baseVal.value;\r\n\r\n const data = markerImageCopy.outerHTML;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (ctx === null) {\r\n throw new Error('Canvas 2D context is not available.');\r\n }\r\n\r\n if (this.markersOnly !== true) {\r\n ctx.drawImage(this.targetImage, 0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n const DOMURL = window.URL; // || window.webkitURL || window;\r\n\r\n const img = new Image(canvas.width, canvas.height);\r\n img.setAttribute('crossOrigin', 'anonymous');\r\n\r\n const blob = new Blob([data], { type: 'image/svg+xml' });\r\n\r\n const url = DOMURL.createObjectURL(blob);\r\n\r\n let result = '';\r\n img.onload = () => {\r\n ctx.drawImage(img, 0, 0);\r\n DOMURL.revokeObjectURL(url);\r\n\r\n result = canvas.toDataURL(this.imageType, this.imageQuality);\r\n };\r\n\r\n img.src = url;\r\n\r\n counter = 0;\r\n while (!result && counter++ < 100) {\r\n // wait for the image to load\r\n await new Promise((r) => setTimeout(r, 100));\r\n }\r\n\r\n if (this._editingTarget) {\r\n this._renderHelperContainer?.removeChild(this._editingTarget);\r\n }\r\n\r\n // remove the helper main canvas from the page\r\n this._renderHelperContainer?.removeChild(this._mainCanvas);\r\n document.body.removeChild(this._renderHelperContainer!);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Adds \"defs\" to main canvas SVG.\r\n * Useful for filters, custom fonts and potentially other scenarios.\r\n * @since 3.3.0\r\n */\r\n public addDefs(...nodes: (string | Node)[]): void {\r\n this._defs.push(...nodes);\r\n\r\n if (this._defsElement) {\r\n this._defsElement.append(...nodes);\r\n }\r\n }\r\n}\r\n"],"names":["SvgHelper","createDefs","document","createElementNS","setAttributes","el","attributes","attr","value","setAttribute","createRect","width","height","rect","toString","createLine","x1","y1","x2","y2","line","createPolygon","points","polygon","createCircle","radius","circle","createEllipse","rx","ry","ellipse","createGroup","g","createTransform","createSVGTransform","createMarker","id","orient","markerWidth","markerHeight","refX","refY","markerElement","marker","appendChild","createText","text","createTSpan","tspan","textContent","createImage","image","createPoint","x","y","svgPoint","createSVGPoint","createPath","d","path","createForeignObject","obj","clientToLocalCoordinates","localRoot","zoomLevel","clientRect","getBoundingClientRect","left","top","createSvgFromString","stringSvg","svg","innerHTML","createFilter","filter","Activator","addKey","product","key","keys","set","keyAddListeners","forEach","listener","addKeyAddListener","push","removeKeyAddListener","li","indexOf","splice","isLicensed","has","keyRegex","RegExp","get","undefined","test","Map","Array","MarkerBase","typeName","Object","getPrototypeOf","this","constructor","container","_container","strokeColor","_strokeColor","color","applyStrokeColor","fillColor","_fillColor","applyFillColor","strokeWidth","_strokeWidth","applyStrokeWidth","strokeDasharray","_strokeDasharray","applyStrokeDasharray","opacity","_opacity","applyOpacity","defaultSize","stage","bind","getBBox","ownsTarget","dispose","addMarkerVisualToContainer","element","childNodes","length","insertBefore","getOutline","getState","notes","restoreState","state","_a","_b","_c","_d","scale","scaleX","scaleY","applyDefaultFilter","TransformMatrix","toITransformMatrix","matrix","a","b","c","e","f","toSVGMatrix","currentMatrix","newMatrix","RectangularBoxMarkerBase","centerX","centerY","visual","_visual","translate","transform","baseVal","appendItem","super","rotationAngle","rotatePoint","unrotatePoint","moveVisual","point","style","setSize","rotate","Math","abs","sign","atan","PI","applyRotation","getItem","setRotate","replaceItem","getCTM","matrixTransform","inverse","assign","visualTransformMatrix","containerTransformMatrix","rbmState","setMatrix","rPoint","rotatedTL","rotatedTR","rotatedBL","rotatedBR","absTL","min","absBR","max","DOMRect","ShapeOutlineMarkerBase","createVisual","getPath","adjustVisual","title","ShapeMarkerBase","rectState","FrameMarker","LinearMarkerBase","lineVisual","startTerminatorVisual","endTerminatorVisual","selectorVisual","visibleVisual","getStartTerminatorPath","getEndTerminatorPath","lmbState","LineMarker","ArrowMarker","arrowType","_arrowType","getArrowProperties","arrowHeight","arrowWidth","dx","dy","arrowDipFactor","angle","atan2","startArrowBasePoint","cos","sin","startArrowTipBasePoint","startArrowSide1","startArrowSide2","endArrowBasePoint","endArrowTipBasePoint","endArrowSide1","endArrowSide2","result","arrowState","MeasurementMarker","tipLength","getTerminatorProperties","PolygonMarker","selectorVisualLines","some","l","map","p","i","join","createSelectorVisual","addSelectorLine","adjustSelectorVisual","missingLines","removeChild","pop","pmState","FreehandMarker","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","done","then","apply","SuppressedError","TextBlock","_text","renderText","boundingBox","_boundingBox","labelBackground","_labelBackground","textElement","_textElement","_color","fontFamily","_fontFamily","positionText","fontSize","_fontSize","units","offsetX","offsetY","wordWrap","prevWrappedText","setupTextElement","show","hide","showControlBox","hideControlBox","applyFontStyles","wrapText","found","span","textAnchor","userSelect","stroke","strokeOpacity","getTextAspectRatio","textLines","longestLineChars","lines","split","boxAspectRatio","processedLines","textAspectRatio","maxLineLength","Number","MAX_VALUE","longestLine","lastIndexOf","reminderLine","maxEnd","substring","trim","processedText","lastChild","lineno","requestAnimationFrame","ts","textSize","_textSize","textBlock","self","noOfLines","lineHeight","autoOffset","bgPadding","onTextSizeChanged","display","TextMarker","getDefaultText","DEFAULT_TEXT","padding","setColor","setFont","setFontSize","textSizeChanged","setSizeFromTextSize","textBoundingBox","setTextBoundingBox","prevWidth","prevHeight","onSizeChanged","font","hideVisual","visibility","showVisual","textState","newFontSize","CoverMarker","HighlightMarker","CalloutMarker","tipPosition","_tipPosition","tipBase1Position","tipBase2Position","_calloutVisual","setTipPoints","offset","baseWidth","cornerAngle","calloutState","EllipseFrameMarker","EllipseMarker","ImageMarkerBase","svgString","_svgString","SVGImage","imageType","outerHTML","imageSrc","_imageSrc","naturalWidth","naturalHeight","adjustImage","DOMParser","parseFromString","documentElement","SVGSVGElement","Error","svgElement","ownerDocument","importNode","isDescendant","parent","target","children","imgState","CustomImageMarker","CheckImageMarker","XImageMarker","CaptionFrameMarker","_outerFrameVisual","_captionFrameVisual","_frameVisual","adjustFrameVisual","getPaths","adjustTextPosition","frame","caption","paths","captionState","CurveMarker","curveX","curveY","HighlighterMarker","SvgFilters","getDefaultFilterSet","MarkerBaseEditor","creationStyle","_creationStyle","is","cls","_marker","overlayContainer","_overlayContainer","_state","isSelected","_isSelected","continuousCreation","_continuousCreation","adjustControlBox","stateChanged","dashes","properties","_controlBox","isMultiSelected","_markerType","markerType","select","deselect","pointerDown","pointerUp","manipulate","dblClick","multi","cursor","manipulationStartState","JSON","stringify","ev","onStateChanged","currentState","Grip","gripSize","fill","child","ResizeGrip","PolygonMarkerEditor","defaultLength","manipulationStartX","manipulationStartY","controlBox","manipulationBox","grips","setupControlBox","adjustControlGrips","createGrip","positionGrip","positionGrips","resize","grip","startCreation","finishCreation","addNewPointWhileCreating","activeGrip","find","at","pointerEvents","onMarkerCreated","activeGripIndex","selectorLineIndex","findIndex","gripIndex","noOfMissingGrips","setTranslate","LinearMarkerEditor","manipulationStartX1","manipulationStartY1","manipulationStartX2","manipulationStartY2","addControlGrips","grip1","grip2","inState","RectangularBoxMarkerGrips","findGripByVisual","gripVisual","values","getGrip","location","RotateGrip","oldFill","RectangularBoxMarkerBaseEditor","manipulationStartLeft","manipulationStartTop","manipulationStartWidth","manipulationStartHeight","CB_DISTANCE","controlGrips","disabledResizeGrips","disableRotation","_suppressMarkerCreateEvent","rotatorGrip","rotatedPoint","rotatedCenter","shiftKey","preserveAspectRatio","newX","newWidth","newY","newHeight","deltaX","deltaY","aspectRatio","controlRect","rotatorGripLine","createRotateGrip","cx","cy","bottom","right","rotatorGripSize","rtop","rcx","adjustGripVisibility","ShapeOutlineMarkerEditor","UndoRedoManager","undoStack","redoStack","isUndoPossible","isRedoPossible","undoStepCount","redoStepCount","addUndoStep","stepData","parse","lastRedoStep","replaceLastUndoStep","getLastUndoStep","undo","lastStep","redo","FreehandMarkerEditor","TextBlockEditor","_width","textEditor","_height","_left","_top","textColor","_textColor","bgColor","_bgColor","backgroundColor","isInFocus","isSetupCompleted","createElement","getEditorUi","focus","setup","flexDirection","alignItems","justifyContent","overflow","textAlign","innerText","contentEditable","outline","whiteSpace","addEventListener","stopPropagation","preventDefault","blur","cancelBubble","onTextChanged","onBlur","clipboardData","content","getData","selection","window","getSelection","rangeCount","deleteFromDocument","getRangeAt","insertNode","createTextNode","range","createRange","selectNodeContents","collapse","removeAllRanges","addRange","TextMarkerEditor","size","textBlockEditorContainer","_pointerDownTime","_pointerDownPoint","markerSizeChanged","textBlockEditor","showEditor","hideEditor","Date","now","ShapeMarkerEditor","ArrowMarkerEditor","CalloutMarkerEditor","manipulationStartTipPositionX","manipulationStartTipPositionY","tipGrip","createTipGrip","tipGripSize","ImageMarkerEditor","CaptionFrameMarkerEditor","CurveMarkerEditor","manipulationStartCurveX","manipulationStartCurveY","curveGrip","curveControlLine1","curveControlLine2","firstChild","MarkerArea","HTMLElement","targetWidth","_targetWidth","setMainCanvasSize","targetHeight","_targetHeight","currentMarkerEditor","_currentMarkerEditor","selectedMarkerEditors","_selectedMarkerEditors","targetImage","_targetImage","_targetImageLoaded","addTargetImage","_zoomLevel","_canvasContainer","_contentContainer","_mainCanvas","setEditingTargetSize","scrollMultiplier","scrollTo","clientWidth","clientHeight","panTo","scrollBy","prevPanPoint","defaultFilter","_defaultFilter","mode","_isInitialized","_newMarkerOutline","markerEditors","editors","undoRedoManager","_defs","touchPoints","isDragging","isSelecting","isPanning","_marqueeSelectOutline","_marqueeSelectRect","_manipulationStartX","_manipulationStartY","connectedCallback","disconnectedCallback","createLayout","addMainCanvas","initOverlay","attachEvents","attachWindowEvents","detachEvents","detachWindowEvents","onCanvasPointerDown","onCanvasDblClick","onKeyUp","onPointerMove","onPointerOut","onPointerUp","addNewMarker","markerCreated","markerStateChanged","deleteMarker","deleteSelectedMarkers","switchToSelectMode","showOutline","hideOutline","undoStep","redoStep","toggleLogo","addLogo","removeLogo","adjustMarqueeSelectOutline","hideMarqueeSelectOutline","addDefs","addDefaultFilterDefs","attachShadow","dispatchEvent","CustomEvent","detail","markerArea","position","flexGrow","flexShrink","touchAction","className","gridTemplateColumns","justifyItems","shadowRoot","gridColumnStart","gridRowStart","margin","addDefsToMainCanvas","_groupLayer","_defsElement","append","_editingTarget","_overlayContentContainer","img","calculatedWidth","calculatedHeight","_stateToRestore","src","registerMarkerType","editorType","mType","getMarkerTypeByName","markerEditor","setCurrentEditor","deselectEditor","markerEditorType","editor","newMarkerEditor","m","selectEditor","eventEditor","index","clientX","clientY","leadPointerId","pointerId","pointerType","button","altKey","localPoint","hitMarker","initializeMarqueeSelection","contains","localManipulationStart","finishMarqueeSelection","onlySelected","markerRect","hasAttribute","version","markers","stateCopy","markerState","scaleMarkers","preScaleSelectedMarker","_logoUI","logoUI","link","href","Logo","positionLogo","lastUndoState","nodes","type","options","removeEventListener","customElements","define","MarkerView","markerTypes","attachMarkerEvents","markerView","newMarker","naturalSize","markersOnly","init","_renderHelperContainer","body","rasterize","targetCanvas","counter","r","setTimeout","canvas","markerImageCopy","valueAsString","viewBox","data","ctx","getContext","drawImage","DOMURL","URL","Image","blob","Blob","url","createObjectURL","onload","revokeObjectURL","toDataURL","imageQuality"],"mappings":"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","x_google_ignoreList":[14]}
|
|
1
|
+
{"version":3,"file":"markerjs3.js","sources":["../../src/core/SvgHelper.ts","../../src/core/Activator.ts","../../src/core/MarkerBase.ts","../../src/core/TransformMatrix.ts","../../src/core/RectangularBoxMarkerBase.ts","../../src/core/ShapeOutlineMarkerBase.ts","../../src/core/ShapeMarkerBase.ts","../../src/core/FrameMarker.ts","../../src/core/LinearMarkerBase.ts","../../src/core/LineMarker.ts","../../src/core/ArrowMarker.ts","../../src/core/MeasurementMarker.ts","../../src/core/PolygonMarker.ts","../../src/core/FreehandMarker.ts","../../node_modules/tslib/tslib.es6.js","../../src/core/TextBlock.ts","../../src/core/TextMarker.ts","../../src/core/CoverMarker.ts","../../src/core/HighlightMarker.ts","../../src/core/CalloutMarker.ts","../../src/core/EllipseFrameMarker.ts","../../src/core/EllipseMarker.ts","../../src/core/ImageMarkerBase.ts","../../src/core/CustomImageMarker.ts","../../src/core/CheckImageMarker.ts","../../src/core/XImageMarker.ts","../../src/core/CaptionFrameMarker.ts","../../src/core/CurveMarker.ts","../../src/core/HighlighterMarker.ts","../../src/core/SvgFilters.ts","../../src/editor/MarkerBaseEditor.ts","../../src/editor/Grip.ts","../../src/editor/ResizeGrip.ts","../../src/editor/PolygonMarkerEditor.ts","../../src/editor/LinearMarkerEditor.ts","../../src/editor/RectangularBoxMarkerGrips.ts","../../src/editor/RotateGrip.ts","../../src/editor/RectangularBoxMarkerBaseEditor.ts","../../src/editor/ShapeOutlineMarkerEditor.ts","../../src/editor/UndoRedoManager.ts","../../src/editor/FreehandMarkerEditor.ts","../../src/editor/TextBlockEditor.ts","../../src/editor/TextMarkerEditor.ts","../../src/editor/ShapeMarkerEditor.ts","../../src/editor/ArrowMarkerEditor.ts","../../src/editor/CalloutMarkerEditor.ts","../../src/editor/ImageMarkerEditor.ts","../../src/editor/CaptionFrameMarkerEditor.ts","../../src/editor/CurveMarkerEditor.ts","../../src/MarkerArea.ts","../../src/editor.ts","../../src/MarkerView.ts","../../src/viewer.ts","../../src/Renderer.ts"],"sourcesContent":["import { IPoint } from './IPoint';\r\n\r\n/**\r\n * Utility class to simplify SVG operations.\r\n */\r\nexport class SvgHelper {\r\n /**\r\n * Creates SVG \"defs\".\r\n */\r\n public static createDefs(): SVGDefsElement {\r\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\r\n\r\n return defs;\r\n }\r\n\r\n /**\r\n * Sets attributes on an arbitrary SVG element\r\n * @param el - target SVG element.\r\n * @param attributes - set of name-value attribute pairs.\r\n */\r\n public static setAttributes(\r\n el: SVGElement,\r\n attributes: Array<[string, string]>,\r\n ): void {\r\n for (const [attr, value] of attributes) {\r\n el.setAttribute(attr, value);\r\n }\r\n }\r\n\r\n /**\r\n * Creates an SVG rectangle with the specified width and height.\r\n * @param width\r\n * @param height\r\n * @param attributes - additional attributes.\r\n */\r\n public static createRect(\r\n width: number | string,\r\n height: number | string,\r\n attributes?: Array<[string, string]>,\r\n ): SVGRectElement {\r\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\r\n\r\n rect.setAttribute('width', width.toString());\r\n rect.setAttribute('height', height.toString());\r\n if (attributes) {\r\n SvgHelper.setAttributes(rect, attributes);\r\n }\r\n\r\n return rect;\r\n }\r\n\r\n /**\r\n * Creates an SVG line with specified end-point coordinates.\r\n * @param x1\r\n * @param y1\r\n * @param x2\r\n * @param y2\r\n * @param attributes - additional attributes.\r\n */\r\n public static createLine(\r\n x1: number | string,\r\n y1: number | string,\r\n x2: number | string,\r\n y2: number | string,\r\n attributes?: Array<[string, string]>,\r\n ): SVGLineElement {\r\n const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');\r\n\r\n line.setAttribute('x1', x1.toString());\r\n line.setAttribute('y1', y1.toString());\r\n line.setAttribute('x2', x2.toString());\r\n line.setAttribute('y2', y2.toString());\r\n if (attributes) {\r\n SvgHelper.setAttributes(line, attributes);\r\n }\r\n\r\n return line;\r\n }\r\n\r\n /**\r\n * Creates an SVG polygon with specified points.\r\n * @param points - points as string.\r\n * @param attributes - additional attributes.\r\n */\r\n public static createPolygon(\r\n points: string,\r\n attributes?: Array<[string, string]>,\r\n ): SVGPolygonElement {\r\n const polygon = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'polygon',\r\n );\r\n\r\n polygon.setAttribute('points', points);\r\n if (attributes) {\r\n SvgHelper.setAttributes(polygon, attributes);\r\n }\r\n\r\n return polygon;\r\n }\r\n\r\n /**\r\n * Creates an SVG circle with the specified radius.\r\n * @param radius\r\n * @param attributes - additional attributes.\r\n */\r\n public static createCircle(\r\n radius: number,\r\n attributes?: Array<[string, string]>,\r\n ): SVGCircleElement {\r\n const circle = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'circle',\r\n );\r\n\r\n circle.setAttribute('cx', (radius / 2).toString());\r\n circle.setAttribute('cy', (radius / 2).toString());\r\n circle.setAttribute('r', radius.toString());\r\n if (attributes) {\r\n SvgHelper.setAttributes(circle, attributes);\r\n }\r\n\r\n return circle;\r\n }\r\n\r\n /**\r\n * Creates an SVG ellipse with the specified horizontal and vertical radii.\r\n * @param rx\r\n * @param ry\r\n * @param attributes - additional attributes.\r\n */\r\n public static createEllipse(\r\n rx: number,\r\n ry: number,\r\n attributes?: Array<[string, string]>,\r\n ): SVGEllipseElement {\r\n const ellipse = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'ellipse',\r\n );\r\n\r\n ellipse.setAttribute('cx', (rx / 2).toString());\r\n ellipse.setAttribute('cy', (ry / 2).toString());\r\n ellipse.setAttribute('rx', (rx / 2).toString());\r\n ellipse.setAttribute('ry', (ry / 2).toString());\r\n if (attributes) {\r\n SvgHelper.setAttributes(ellipse, attributes);\r\n }\r\n\r\n return ellipse;\r\n }\r\n\r\n /**\r\n * Creates an SVG group.\r\n * @param attributes - additional attributes.\r\n */\r\n public static createGroup(attributes?: Array<[string, string]>): SVGGElement {\r\n const g = document.createElementNS('http://www.w3.org/2000/svg', 'g');\r\n if (attributes) {\r\n SvgHelper.setAttributes(g, attributes);\r\n }\r\n return g;\r\n }\r\n\r\n /**\r\n * Creates an SVG transform.\r\n */\r\n public static createTransform(): SVGTransform {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n\r\n return svg.createSVGTransform();\r\n }\r\n\r\n /**\r\n * Creates an SVG marker.\r\n * @param id\r\n * @param orient\r\n * @param markerWidth\r\n * @param markerHeight\r\n * @param refX\r\n * @param refY\r\n * @param markerElement\r\n */\r\n public static createMarker(\r\n id: string,\r\n orient: string,\r\n markerWidth: number | string,\r\n markerHeight: number | string,\r\n refX: number | string,\r\n refY: number | string,\r\n markerElement: SVGGraphicsElement,\r\n ): SVGMarkerElement {\r\n const marker = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'marker',\r\n );\r\n SvgHelper.setAttributes(marker, [\r\n ['id', id],\r\n ['orient', orient],\r\n ['markerWidth', markerWidth.toString()],\r\n ['markerHeight', markerHeight.toString()],\r\n ['refX', refX.toString()],\r\n ['refY', refY.toString()],\r\n ]);\r\n\r\n marker.appendChild(markerElement);\r\n\r\n return marker;\r\n }\r\n\r\n /**\r\n * Creates an SVG text element.\r\n * @param attributes - additional attributes.\r\n */\r\n public static createText(\r\n attributes?: Array<[string, string]>,\r\n ): SVGTextElement {\r\n const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');\r\n text.setAttribute('x', '0');\r\n text.setAttribute('y', '0');\r\n\r\n if (attributes) {\r\n SvgHelper.setAttributes(text, attributes);\r\n }\r\n\r\n return text;\r\n }\r\n\r\n /**\r\n * Creates an SVG TSpan.\r\n * @param text - inner text.\r\n * @param attributes - additional attributes.\r\n */\r\n public static createTSpan(\r\n text: string,\r\n attributes?: Array<[string, string]>,\r\n ): SVGTSpanElement {\r\n const tspan = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'tspan',\r\n );\r\n tspan.textContent = text;\r\n\r\n if (attributes) {\r\n SvgHelper.setAttributes(tspan, attributes);\r\n }\r\n\r\n return tspan;\r\n }\r\n\r\n /**\r\n * Creates an SVG image element.\r\n * @param attributes - additional attributes.\r\n */\r\n public static createImage(\r\n attributes?: Array<[string, string]>,\r\n ): SVGImageElement {\r\n const image = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'image',\r\n );\r\n\r\n if (attributes) {\r\n SvgHelper.setAttributes(image, attributes);\r\n }\r\n\r\n return image;\r\n }\r\n\r\n /**\r\n * Creates an SVG point with the specified coordinates.\r\n * @param x\r\n * @param y\r\n */\r\n public static createPoint(x: number, y: number): SVGPoint {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n const svgPoint = svg.createSVGPoint();\r\n svgPoint.x = x;\r\n svgPoint.y = y;\r\n\r\n return svgPoint;\r\n }\r\n\r\n /**\r\n * Creates an SVG path with the specified shape (d).\r\n * @param d - path shape\r\n * @param attributes - additional attributes.\r\n */\r\n public static createPath(\r\n d: string,\r\n attributes?: Array<[string, string]>,\r\n ): SVGPathElement {\r\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\r\n\r\n path.setAttribute('d', d);\r\n if (attributes) {\r\n SvgHelper.setAttributes(path, attributes);\r\n }\r\n\r\n return path;\r\n }\r\n\r\n /**\r\n * Creates an SVG text element.\r\n * @param attributes - additional attributes.\r\n */\r\n public static createForeignObject(\r\n attributes?: Array<[string, string]>,\r\n ): SVGForeignObjectElement {\r\n const obj = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'foreignObject',\r\n );\r\n obj.setAttribute('x', '0');\r\n obj.setAttribute('y', '0');\r\n\r\n if (attributes) {\r\n SvgHelper.setAttributes(obj, attributes);\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n /**\r\n * Returns local coordinates relative to the provided `localRoot` of a client (screen) point.\r\n * @param localRoot relative coordinate root\r\n * @param x horizontal client coordinate\r\n * @param y vertical client coordinate\r\n * @param zoomLevel zoom level\r\n * @returns local coordinates relative to `localRoot`\r\n */\r\n public static clientToLocalCoordinates(\r\n localRoot: SVGElement | undefined,\r\n x: number,\r\n y: number,\r\n zoomLevel = 1,\r\n ): IPoint {\r\n if (localRoot) {\r\n const clientRect = localRoot.getBoundingClientRect();\r\n return {\r\n x: (x - clientRect.left) / zoomLevel,\r\n y: (y - clientRect.top) / zoomLevel,\r\n };\r\n } else {\r\n return { x: x, y: y };\r\n }\r\n }\r\n\r\n /**\r\n * Creates an SVG image element from a supplied inner SVG markup string.\r\n * @param stringSvg SVG markup (without the root svg tags)\r\n * @returns SVG image element\r\n */\r\n public static createSvgFromString(stringSvg: string): SVGSVGElement {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.innerHTML = stringSvg;\r\n\r\n return svg;\r\n }\r\n\r\n /**\r\n * Creates an SVG filter element.\r\n * @param id filter id\r\n * @param attributes other filter element attributes\r\n * @param innerHTML filter definition as string\r\n * @returns filter element\r\n */\r\n public static createFilter(\r\n id: string,\r\n attributes?: Array<[string, string]>,\r\n innerHTML?: string,\r\n ): SVGFilterElement {\r\n const filter = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'filter',\r\n );\r\n filter.id = id;\r\n if (attributes) {\r\n SvgHelper.setAttributes(filter, attributes);\r\n }\r\n if (innerHTML) {\r\n filter.innerHTML = innerHTML;\r\n }\r\n return filter;\r\n }\r\n}\r\n","/**\r\n * Manages commercial licenses.\r\n * @ignore\r\n */\r\nexport class Activator {\r\n private static keys: Map<string, string> = new Map<string, string>();\r\n private static keyAddListeners: Array<() => void> = new Array<() => void>();\r\n\r\n /**\r\n * Add a license key\r\n * @param product product identifier.\r\n * @param key license key sent to you after purchase.\r\n */\r\n public static addKey(product: string, key: string): void {\r\n Activator.keys.set(product, key);\r\n Activator.keyAddListeners.forEach((listener) => {\r\n listener();\r\n });\r\n }\r\n\r\n /**\r\n * Add a function to be called when license key is added.\r\n * @param listener\r\n */\r\n public static addKeyAddListener(listener: () => void) {\r\n Activator.keyAddListeners.push(listener);\r\n }\r\n\r\n /**\r\n * Remove a function called when key is added.\r\n * @param listener\r\n */\r\n public static removeKeyAddListener(listener: () => void) {\r\n const li = Activator.keyAddListeners.indexOf(listener);\r\n if (li > -1) {\r\n Activator.keyAddListeners.splice(li, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if the product is commercially licensed.\r\n * @param product product identifier.\r\n */\r\n public static isLicensed(product: string): boolean {\r\n // NOTE:\r\n // before removing or modifying this please consider supporting marker.js development\r\n // by visiting https://markerjs.com/ for details\r\n // thank you!\r\n if (Activator.keys.has(product)) {\r\n const keyRegex = new RegExp(\r\n `${product}-[A-Z][0-9]{3}-[A-Z][0-9]{3}-[0-9]{4}`,\r\n 'i',\r\n );\r\n const key = Activator.keys.get(product);\r\n return key === undefined ? false : keyRegex.test(key);\r\n } else {\r\n return false;\r\n }\r\n }\r\n}\r\n","import { ISize } from './ISize';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\n\r\n/**\r\n * Represents a stage in a marker's lifecycle.\r\n *\r\n * Most markers are created immediately after the user clicks on the canvas.\r\n * However, some markers are only finished creating after additional interactions.\r\n */\r\nexport type MarkerStage = 'creating' | 'normal';\r\n\r\n/**\r\n * Base class for all markers.\r\n *\r\n * When creating custom marker types usually you will want to extend one of the derived classes.\r\n * However, if you cannot find a suitable base class, you can and you should extend this class.\r\n *\r\n * @summary Base class for all markers.\r\n * @group Markers\r\n */\r\nexport class MarkerBase {\r\n /**\r\n * Marker type name.\r\n *\r\n * It's important to set this in each derived class. This value is used to identify marker types\r\n * when restoring marker state and other scenarios.\r\n */\r\n public static typeName = 'MarkerBase';\r\n\r\n /**\r\n * Returns marker type name for the object instance.\r\n */\r\n public get typeName(): string {\r\n return Object.getPrototypeOf(this).constructor.typeName;\r\n }\r\n\r\n /**\r\n * Marker type title (display name) used for accessibility and other attributes.\r\n */\r\n public static title: string;\r\n\r\n /**\r\n * When true, the default filter is applied to the marker's visual.\r\n *\r\n * @since 3.2.0\r\n */\r\n public static applyDefaultFilter: boolean = true;\r\n\r\n /**\r\n * SVG container object holding the marker's visual.\r\n *\r\n * It is created and passed to the constructor by marker editor or viewer when creating the marker.\r\n */\r\n protected _container: SVGGElement;\r\n /**\r\n * SVG container object holding the marker's visual.\r\n */\r\n /**\r\n * SVG container object holding the marker's visual.\r\n */\r\n public get container(): SVGGElement {\r\n return this._container;\r\n }\r\n\r\n /**\r\n * Additional information about the marker.\r\n *\r\n * Generally, this isn't used for anything functional.\r\n * However, in a derived type it could be used for storing arbitrary data with no need to create extra properties and state types.\r\n */\r\n public notes?: string;\r\n\r\n /**\r\n * The default marker size when the marker is created with a click (without dragging).\r\n */\r\n public defaultSize: ISize = { width: 50, height: 20 };\r\n\r\n /**\r\n * Marker lifecycle stage.\r\n *\r\n * Most markers are created immediately after the user clicks on the canvas (`normal`).\r\n * However, some markers are only finished creating after additional interactions (`creating`).\r\n */\r\n public stage: MarkerStage = 'normal';\r\n\r\n /**\r\n * Stroke (outline) color of the marker.\r\n */\r\n protected _strokeColor = 'transparent';\r\n /**\r\n * Stroke (outline) color of the marker.\r\n *\r\n * In a derived class override {@link applyStrokeColor} to apply the color to the marker's visual.\r\n */\r\n public get strokeColor() {\r\n return this._strokeColor;\r\n }\r\n public set strokeColor(color: string) {\r\n this._strokeColor = color;\r\n this.applyStrokeColor();\r\n }\r\n /**\r\n * Applies the stroke color to the marker's visual.\r\n *\r\n * Override this method in a derived class to apply the color to the marker's visual.\r\n */\r\n protected applyStrokeColor() {}\r\n\r\n /**\r\n * Fill color of the marker.\r\n */\r\n protected _fillColor = 'transparent';\r\n /**\r\n * Fill color of the marker.\r\n *\r\n * In a derived class override {@link applyFillColor} to apply the color to the marker's visual.\r\n */\r\n public get fillColor() {\r\n return this._fillColor;\r\n }\r\n public set fillColor(color: string) {\r\n this._fillColor = color;\r\n this.applyFillColor();\r\n }\r\n /**\r\n * Applies the fill color to the marker's visual.\r\n *\r\n * Override this method in a derived class to apply the color to the marker's visual.\r\n */\r\n protected applyFillColor() {}\r\n\r\n /**\r\n * Stroke (outline) width of the marker.\r\n */\r\n protected _strokeWidth = 0;\r\n /**\r\n * Stroke (outline) width of the marker.\r\n *\r\n * In a derived class override {@link applyStrokeWidth} to apply the width to the marker's visual.\r\n */\r\n public get strokeWidth() {\r\n return this._strokeWidth;\r\n }\r\n public set strokeWidth(value) {\r\n this._strokeWidth = value;\r\n this.applyStrokeWidth();\r\n }\r\n /**\r\n * Applies the stroke width to the marker's visual.\r\n *\r\n * Override this method in a derived class to apply the width to the marker's visual.\r\n */\r\n protected applyStrokeWidth() {}\r\n\r\n /**\r\n * Stroke (outline) dash array of the marker.\r\n */\r\n protected _strokeDasharray = '';\r\n /**\r\n * Stroke (outline) dash array of the marker.\r\n *\r\n * In a derived class override {@link applyStrokeDasharray} to apply the dash array to the marker's visual.\r\n */\r\n public get strokeDasharray() {\r\n return this._strokeDasharray;\r\n }\r\n public set strokeDasharray(value) {\r\n this._strokeDasharray = value;\r\n this.applyStrokeDasharray();\r\n }\r\n /**\r\n * Applies the stroke dash array to the marker's visual.\r\n *\r\n * Override this method in a derived class to apply the dash array to the marker's visual.\r\n */\r\n protected applyStrokeDasharray() {}\r\n\r\n /**\r\n * Opacity of the marker.\r\n */\r\n protected _opacity = 1;\r\n /**\r\n * Opacity of the marker.\r\n *\r\n * In a derived class override {@link applyOpacity} to apply the opacity to the marker's visual.\r\n */\r\n public get opacity() {\r\n return this._opacity;\r\n }\r\n public set opacity(value) {\r\n this._opacity = value;\r\n this.applyOpacity();\r\n }\r\n /**\r\n * Applies the opacity to the marker's visual.\r\n *\r\n * Override this method in a derived class to apply the opacity to the marker's visual\r\n */\r\n protected applyOpacity() {}\r\n\r\n /**\r\n * Creates a new marker object.\r\n *\r\n * @param container - SVG container object holding the marker's visual.\r\n */\r\n constructor(container: SVGGElement) {\r\n this._container = container;\r\n\r\n this.applyFillColor = this.applyFillColor.bind(this);\r\n this.applyStrokeColor = this.applyStrokeColor.bind(this);\r\n this.applyStrokeWidth = this.applyStrokeWidth.bind(this);\r\n this.applyStrokeDasharray = this.applyStrokeDasharray.bind(this);\r\n this.applyOpacity = this.applyOpacity.bind(this);\r\n this.getBBox = this.getBBox.bind(this);\r\n }\r\n\r\n /**\r\n * Returns true if passed SVG element belongs to the marker. False otherwise.\r\n *\r\n * @param el - target element.\r\n * @returns true if the element belongs to the marker.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public ownsTarget(el: EventTarget): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Disposes the marker and cleans up.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n public dispose(): void {}\r\n\r\n protected addMarkerVisualToContainer(element: SVGElement): void {\r\n if (this.container.childNodes.length > 0) {\r\n this.container.insertBefore(element, this.container.childNodes[0]);\r\n } else {\r\n this.container.appendChild(element);\r\n }\r\n }\r\n\r\n /**\r\n * When overridden in a derived class, represents a preliminary outline for markers that can be displayed before the marker is actually created.\r\n * @returns SVG path string.\r\n */\r\n public getOutline(): string {\r\n return '';\r\n }\r\n\r\n /**\r\n * Returns current marker state that can be restored in the future.\r\n */\r\n public getState(): MarkerBaseState {\r\n return {\r\n typeName: Object.getPrototypeOf(this).constructor.typeName,\r\n notes: this.notes,\r\n strokeColor: this._strokeColor,\r\n strokeWidth: this._strokeWidth,\r\n strokeDasharray: this._strokeDasharray,\r\n opacity: this._opacity,\r\n };\r\n }\r\n\r\n /**\r\n * Restores previously saved marker state.\r\n *\r\n * @param state - previously saved state.\r\n */\r\n public restoreState(state: MarkerBaseState): void {\r\n this.notes = state.notes;\r\n this._strokeColor = state.strokeColor ?? this._strokeColor;\r\n this._strokeWidth = state.strokeWidth ?? this._strokeWidth;\r\n this._strokeDasharray = state.strokeDasharray ?? this._strokeDasharray;\r\n this._opacity = state.opacity ?? this._opacity;\r\n }\r\n\r\n /**\r\n * Scales marker. Used after resize.\r\n *\r\n * @param scaleX - horizontal scale\r\n * @param scaleY - vertical scale\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars\r\n public scale(scaleX: number, scaleY: number): void {}\r\n\r\n /**\r\n * Returns markers bounding box.\r\n *\r\n * Override to return a custom bounding box.\r\n *\r\n * @returns rectangle fitting the marker.\r\n */\r\n public getBBox(): DOMRect {\r\n return this.container.getBBox();\r\n }\r\n}\r\n","/**\r\n * Represents a simplified version of the SVGMatrix.\r\n */\r\nexport interface ITransformMatrix {\r\n a: number;\r\n b: number;\r\n c: number;\r\n d: number;\r\n e: number;\r\n f: number;\r\n}\r\n\r\n/**\r\n * A utility class to transform between SVGMatrix and its simplified representation.\r\n */\r\nexport class TransformMatrix {\r\n public static toITransformMatrix(matrix: SVGMatrix): ITransformMatrix {\r\n return {\r\n a: matrix.a,\r\n b: matrix.b,\r\n c: matrix.c,\r\n d: matrix.d,\r\n e: matrix.e,\r\n f: matrix.f,\r\n };\r\n }\r\n public static toSVGMatrix(\r\n currentMatrix: SVGMatrix,\r\n newMatrix: ITransformMatrix,\r\n ): SVGMatrix {\r\n currentMatrix.a = newMatrix.a;\r\n currentMatrix.b = newMatrix.b;\r\n currentMatrix.c = newMatrix.c;\r\n currentMatrix.d = newMatrix.d;\r\n currentMatrix.e = newMatrix.e;\r\n currentMatrix.f = newMatrix.f;\r\n return currentMatrix;\r\n }\r\n}\r\n","import { IPoint } from './IPoint';\r\nimport { MarkerBase } from './MarkerBase';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { RectangularBoxMarkerBaseState } from './RectangularBoxMarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\nimport { TransformMatrix } from './TransformMatrix';\r\n\r\n/**\r\n * RectangularBoxMarkerBase is a base class for all marker's that conceptually fit into a rectangle\r\n * such as all rectangle markers, ellipse, text and callout markers.\r\n *\r\n * @summary Base class for all markers that conceptually fit into a rectangle.\r\n * @group Markers\r\n */\r\nexport class RectangularBoxMarkerBase extends MarkerBase {\r\n /**\r\n * x coordinate of the top-left corner.\r\n */\r\n public left = 0;\r\n /**\r\n * y coordinate of the top-left corner.\r\n */\r\n public top = 0;\r\n /**\r\n * Marker width.\r\n */\r\n public width = 0;\r\n /**\r\n * Marker height.\r\n */\r\n public height = 0;\r\n\r\n /**\r\n * Marker's rotation angle.\r\n */\r\n public rotationAngle = 0;\r\n\r\n /**\r\n * x coordinate of the marker's center.\r\n */\r\n public get centerX(): number {\r\n return this.left + this.width / 2;\r\n }\r\n /**\r\n * y coordinate of the marker's center.\r\n */\r\n public get centerY(): number {\r\n return this.top + this.height / 2;\r\n }\r\n\r\n private _visual?: SVGGraphicsElement;\r\n /**\r\n * Container for the marker's visual.\r\n */\r\n protected get visual(): SVGGraphicsElement | undefined {\r\n return this._visual;\r\n }\r\n protected set visual(value: SVGGraphicsElement) {\r\n this._visual = value;\r\n const translate = SvgHelper.createTransform();\r\n this._visual.transform.baseVal.appendItem(translate);\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.rotatePoint = this.rotatePoint.bind(this);\r\n this.unrotatePoint = this.unrotatePoint.bind(this);\r\n\r\n // add rotation transform\r\n this.container.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n }\r\n\r\n /**\r\n * Moves visual to the specified coordinates.\r\n * @param point - coordinates of the new top-left corner of the visual.\r\n */\r\n public moveVisual(point: IPoint): void {\r\n if (this.visual) {\r\n this.visual.style.transform = `translate(${point.x}px, ${point.y}px)`;\r\n }\r\n }\r\n\r\n /**\r\n * Adjusts marker's size.\r\n */\r\n public setSize(): void {\r\n this.moveVisual({ x: this.left, y: this.top });\r\n }\r\n\r\n /**\r\n * Rotates marker around the center.\r\n * @param point - coordinates of the rotation point.\r\n */\r\n public rotate(point: IPoint) {\r\n // avoid glitch when crossing the 0 rotation point\r\n if (Math.abs(point.x - this.centerX) > 0.1) {\r\n const sign = Math.sign(point.x - this.centerX);\r\n this.rotationAngle =\r\n (Math.atan((point.y - this.centerY) / (point.x - this.centerX)) * 180) /\r\n Math.PI +\r\n 90 * sign;\r\n this.applyRotation();\r\n }\r\n }\r\n\r\n private applyRotation() {\r\n const rotate = this.container.transform.baseVal.getItem(0);\r\n rotate.setRotate(this.rotationAngle, this.centerX, this.centerY);\r\n this.container.transform.baseVal.replaceItem(rotate, 0);\r\n }\r\n\r\n /**\r\n * Returns point coordinates based on the actual screen coordinates and marker's rotation.\r\n * @param point - original pointer coordinates\r\n */\r\n public rotatePoint(point: IPoint): IPoint {\r\n if (this.rotationAngle === 0) {\r\n return point;\r\n }\r\n\r\n const matrix = this.container.getCTM();\r\n if (matrix === null) {\r\n return point;\r\n }\r\n let svgPoint = SvgHelper.createPoint(point.x, point.y);\r\n svgPoint = svgPoint.matrixTransform(matrix);\r\n\r\n const result = { x: svgPoint.x, y: svgPoint.y };\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns original point coordinates based on coordinates with rotation applied.\r\n * @param point - rotated point coordinates.\r\n */\r\n public unrotatePoint(point: IPoint): IPoint {\r\n if (this.rotationAngle === 0) {\r\n return point;\r\n }\r\n\r\n let matrix = this.container.getCTM();\r\n if (matrix === null) {\r\n return point;\r\n }\r\n matrix = matrix.inverse();\r\n let svgPoint = SvgHelper.createPoint(point.x, point.y);\r\n svgPoint = svgPoint.matrixTransform(matrix);\r\n\r\n const result = { x: svgPoint.x, y: svgPoint.y };\r\n\r\n return result;\r\n }\r\n\r\n public getOutline(): string {\r\n const result = `M 0 0 \r\n H ${this.defaultSize} \r\n V ${this.defaultSize} \r\n H 0 \r\n V 0 Z`;\r\n\r\n return result;\r\n }\r\n\r\n public getState(): RectangularBoxMarkerBaseState {\r\n const result: RectangularBoxMarkerBaseState = Object.assign(\r\n {\r\n left: this.left,\r\n top: this.top,\r\n width: this.width,\r\n height: this.height,\r\n rotationAngle: this.rotationAngle,\r\n visualTransformMatrix: TransformMatrix.toITransformMatrix(\r\n this.visual!.transform.baseVal.getItem(0).matrix,\r\n ),\r\n containerTransformMatrix: TransformMatrix.toITransformMatrix(\r\n this.container.transform.baseVal.getItem(0).matrix,\r\n ),\r\n },\r\n super.getState(),\r\n );\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n super.restoreState(state);\r\n const rbmState = state as RectangularBoxMarkerBaseState;\r\n this.left = rbmState.left;\r\n this.top = rbmState.top;\r\n this.width = rbmState.width;\r\n this.height = rbmState.height;\r\n this.rotationAngle = rbmState.rotationAngle;\r\n\r\n this.moveVisual({ x: this.left, y: this.top });\r\n\r\n if (rbmState.visualTransformMatrix && rbmState.containerTransformMatrix) {\r\n this.visual!.transform.baseVal.getItem(0).setMatrix(\r\n TransformMatrix.toSVGMatrix(\r\n this.visual!.transform.baseVal.getItem(0).matrix,\r\n rbmState.visualTransformMatrix,\r\n ),\r\n );\r\n this.container.transform.baseVal\r\n .getItem(0)\r\n .setMatrix(\r\n TransformMatrix.toSVGMatrix(\r\n this.container.transform.baseVal.getItem(0).matrix,\r\n rbmState.containerTransformMatrix,\r\n ),\r\n );\r\n } else {\r\n this.applyRotation();\r\n }\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n const rPoint = this.rotatePoint({ x: this.left, y: this.top });\r\n const point = this.unrotatePoint({\r\n x: rPoint.x * scaleX,\r\n y: rPoint.y * scaleY,\r\n });\r\n\r\n this.left = point.x;\r\n this.top = point.y;\r\n this.width = this.width * scaleX;\r\n this.height = this.height * scaleY;\r\n }\r\n\r\n public getBBox(): DOMRect {\r\n const rotatedTL = this.rotatePoint({ x: this.left, y: this.top });\r\n const rotatedTR = this.rotatePoint({\r\n x: this.left + this.width,\r\n y: this.top,\r\n });\r\n const rotatedBL = this.rotatePoint({\r\n x: this.left,\r\n y: this.top + this.height,\r\n });\r\n const rotatedBR = this.rotatePoint({\r\n x: this.left + this.width,\r\n y: this.top + this.height,\r\n });\r\n const absTL = {\r\n x: Math.min(rotatedTL.x, rotatedTR.x, rotatedBL.x, rotatedBR.x),\r\n y: Math.min(rotatedTL.y, rotatedTR.y, rotatedBL.y, rotatedBR.y),\r\n };\r\n const absBR = {\r\n x: Math.max(rotatedTL.x, rotatedTR.x, rotatedBL.x, rotatedBR.x),\r\n y: Math.max(rotatedTL.y, rotatedTR.y, rotatedBL.y, rotatedBR.y),\r\n };\r\n return new DOMRect(absTL.x, absTL.y, absBR.x - absTL.x, absBR.y - absTL.y);\r\n }\r\n}\r\n","import { MarkerBaseState } from './MarkerBaseState';\r\nimport { RectangularBoxMarkerBase } from './RectangularBoxMarkerBase';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\n/**\r\n * Shape outline marker is a base class for all markers that represent a shape outline.\r\n *\r\n * @summary Base class for shape outline (unfilled shape) markers.\r\n * @group Markers\r\n */\r\nexport class ShapeOutlineMarkerBase extends RectangularBoxMarkerBase {\r\n public static title = 'Shape outline marker';\r\n\r\n protected applyStrokeColor() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [['stroke', this._strokeColor]]);\r\n }\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeDasharray() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || el === this.visual) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n protected getPath(\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n width: number = this.width,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n height: number = this.height,\r\n ): string {\r\n return 'M0,0';\r\n }\r\n\r\n public getOutline(): string {\r\n return this.getPath(this.defaultSize.width, this.defaultSize.height);\r\n }\r\n\r\n /**\r\n * Creates marker's visual.\r\n */\r\n public createVisual(): void {\r\n this.visual = SvgHelper.createPath(this.getPath(), [\r\n ['fill', 'transparent'],\r\n ['stroke', this._strokeColor],\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n this.addMarkerVisualToContainer(this.visual);\r\n }\r\n\r\n /**\r\n * Adjusts marker's visual according to the current state\r\n * (color, width, etc.).\r\n */\r\n public adjustVisual(): void {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['d', this.getPath()],\r\n ['fill', 'transparent'],\r\n ['stroke', this._strokeColor],\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n public setSize(): void {\r\n super.setSize();\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [['d', this.getPath()]]);\r\n }\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n this.createVisual();\r\n super.restoreState(state);\r\n this.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.strokeWidth *= (scaleX + scaleY) / 2;\r\n\r\n this.setSize();\r\n }\r\n}\r\n","import { MarkerBaseState } from './MarkerBaseState';\r\nimport { ShapeOutlineMarkerBase } from './ShapeOutlineMarkerBase';\r\nimport { ShapeMarkerBaseState } from './ShapeMarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\n/**\r\n * Base class for filled shape markers.\r\n *\r\n * @summary Base class for filled shape markers.\r\n * @group Markers\r\n */\r\nexport abstract class ShapeMarkerBase extends ShapeOutlineMarkerBase {\r\n public static title = 'Shape marker';\r\n\r\n /**\r\n * Marker's fill color.\r\n */\r\n protected _fillColor = 'transparent';\r\n /**\r\n * Applies the fill color to the marker's visual.\r\n *\r\n * If needed, override this method in a derived class to apply the color to the marker's visual.\r\n */\r\n protected applyFillColor() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [['fill', this._fillColor]]);\r\n }\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n }\r\n\r\n public createVisual(): void {\r\n super.createVisual();\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [['fill', this._fillColor]]);\r\n }\r\n }\r\n\r\n public getState(): ShapeMarkerBaseState {\r\n const result: ShapeMarkerBaseState = Object.assign(\r\n {\r\n fillColor: this._fillColor,\r\n },\r\n super.getState(),\r\n );\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n const rectState = state as ShapeMarkerBaseState;\r\n super.restoreState(state);\r\n\r\n this.fillColor = rectState.fillColor;\r\n\r\n this.setSize();\r\n }\r\n}\r\n","import { ShapeOutlineMarkerBase } from './ShapeOutlineMarkerBase';\r\n\r\n/**\r\n * Frame marker represents unfilled rectangle shape.\r\n *\r\n * @summary Unfilled rectangle marker.\r\n * @group Markers\r\n */\r\nexport class FrameMarker extends ShapeOutlineMarkerBase {\r\n public static typeName = 'FrameMarker';\r\n public static title = 'Frame marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.strokeColor = '#ff0000';\r\n this.strokeWidth = 3;\r\n }\r\n\r\n protected getPath(\r\n width: number = this.width,\r\n height: number = this.height,\r\n ): string {\r\n const result = `M 0 0 \r\n H ${width} \r\n V ${height} \r\n H 0 \r\n V 0 Z`;\r\n\r\n return result;\r\n }\r\n}\r\n","import { LinearMarkerBaseState } from './LinearMarkerBaseState';\r\nimport { MarkerBase } from './MarkerBase';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\n/**\r\n * Base class for line-like markers.\r\n *\r\n * Use one of the derived classes.\r\n *\r\n * @summary Base class for line-like markers.\r\n * @group Markers\r\n */\r\nexport class LinearMarkerBase extends MarkerBase {\r\n /**\r\n * x coordinate of the first end-point\r\n */\r\n public x1 = 0;\r\n /**\r\n * y coordinate of the first end-point\r\n */\r\n public y1 = 0;\r\n /**\r\n * x coordinate of the second end-point\r\n */\r\n public x2 = 0;\r\n /**\r\n * y coordinate of the second end-point\r\n */\r\n public y2 = 0;\r\n\r\n /**\r\n * Marker's main visual.\r\n */\r\n protected visual: SVGGraphicsElement | undefined;\r\n\r\n /**\r\n * Wider invisible visual to make it easier to select and manipulate the marker.\r\n */\r\n protected selectorVisual: SVGGraphicsElement | undefined;\r\n /**\r\n * Visible visual of the marker.\r\n */\r\n protected visibleVisual: SVGGraphicsElement | undefined;\r\n /**\r\n * Line visual of the marker.\r\n */\r\n protected lineVisual: SVGGraphicsElement | undefined;\r\n /**\r\n * Start terminator (ending) visual of the marker.\r\n */\r\n protected startTerminatorVisual: SVGGraphicsElement | undefined;\r\n /**\r\n * End terminator (ending) visual of the marker.\r\n */\r\n protected endTerminatorVisual: SVGGraphicsElement | undefined;\r\n\r\n protected applyStrokeColor() {\r\n if (this.lineVisual) {\r\n SvgHelper.setAttributes(this.lineVisual, [['stroke', this._strokeColor]]);\r\n }\r\n if (this.startTerminatorVisual && this.endTerminatorVisual) {\r\n SvgHelper.setAttributes(this.startTerminatorVisual, [\r\n ['stroke', this._strokeColor],\r\n ['fill', this._strokeColor],\r\n ]);\r\n SvgHelper.setAttributes(this.endTerminatorVisual, [\r\n ['stroke', this._strokeColor],\r\n ['fill', this._strokeColor],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n if (this.lineVisual) {\r\n SvgHelper.setAttributes(this.lineVisual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n }\r\n if (this.selectorVisual) {\r\n SvgHelper.setAttributes(this.selectorVisual, [\r\n ['stroke-width', Math.max(this._strokeWidth, 8).toString()],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeDasharray() {\r\n if (this.lineVisual) {\r\n SvgHelper.setAttributes(this.lineVisual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n this.getState = this.getState.bind(this);\r\n this.restoreState = this.restoreState.bind(this);\r\n this.scale = this.scale.bind(this);\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (\r\n super.ownsTarget(el) ||\r\n el === this.visual ||\r\n el === this.selectorVisual ||\r\n el === this.visibleVisual ||\r\n el === this.lineVisual ||\r\n el === this.startTerminatorVisual ||\r\n el === this.endTerminatorVisual\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * The path representing the line part of the marker visual.\r\n *\r\n * When implemented in derived class should return SVG path for the marker.\r\n *\r\n * @returns SVG path for the marker.\r\n */\r\n protected getPath(): string {\r\n return 'M0,0';\r\n }\r\n\r\n /**\r\n * The path representing the start terminator (ending) part of the marker visual.\r\n * @returns SVG path\r\n */\r\n protected getStartTerminatorPath(): string {\r\n return '';\r\n }\r\n\r\n /**\r\n * The path representing the end terminator (ending) part of the marker visual.\r\n * @returns SVG path\r\n */\r\n protected getEndTerminatorPath(): string {\r\n return '';\r\n }\r\n\r\n /**\r\n * Creates marker's visual.\r\n */\r\n public createVisual(): void {\r\n this.visual = SvgHelper.createGroup();\r\n this.selectorVisual = SvgHelper.createPath(this.getPath(), [\r\n ['stroke', 'transparent'],\r\n ['fill', 'transparent'],\r\n ['stroke-width', Math.max(this.strokeWidth, 8).toString()],\r\n ]);\r\n\r\n this.visibleVisual = SvgHelper.createGroup([\r\n ['opacity', this.opacity.toString()],\r\n ]);\r\n this.lineVisual = SvgHelper.createPath(this.getPath(), [\r\n ['stroke', this.strokeColor],\r\n ['fill', this.strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['stroke-linejoin', 'round'],\r\n ['stroke-dasharray', this.strokeDasharray.toString()],\r\n ]);\r\n this.startTerminatorVisual = SvgHelper.createPath(\r\n this.getStartTerminatorPath(),\r\n [\r\n ['stroke', this.strokeColor],\r\n ['fill', this.strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['stroke-linejoin', 'round'],\r\n ],\r\n );\r\n this.endTerminatorVisual = SvgHelper.createPath(\r\n this.getEndTerminatorPath(),\r\n [\r\n ['stroke', this.strokeColor],\r\n ['fill', this.strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['stroke-linejoin', 'round'],\r\n ],\r\n );\r\n\r\n this.visibleVisual.appendChild(this.lineVisual);\r\n this.visibleVisual.appendChild(this.startTerminatorVisual);\r\n this.visibleVisual.appendChild(this.endTerminatorVisual);\r\n\r\n this.visual.appendChild(this.selectorVisual);\r\n this.visual.appendChild(this.visibleVisual);\r\n\r\n this.addMarkerVisualToContainer(this.visual);\r\n }\r\n\r\n /**\r\n * Adjusts marker visual after manipulation when needed.\r\n */\r\n public adjustVisual(): void {\r\n if (\r\n this.selectorVisual &&\r\n this.visibleVisual &&\r\n this.lineVisual &&\r\n this.startTerminatorVisual &&\r\n this.endTerminatorVisual\r\n ) {\r\n SvgHelper.setAttributes(this.selectorVisual, [['d', this.getPath()]]);\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['opacity', this.opacity.toString()],\r\n ]);\r\n SvgHelper.setAttributes(this.lineVisual, [\r\n ['d', this.getPath()],\r\n ['stroke', this.strokeColor],\r\n ['fill', this.fillColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['stroke-dasharray', this.strokeDasharray.toString()],\r\n ]);\r\n SvgHelper.setAttributes(this.startTerminatorVisual, [\r\n ['d', this.getStartTerminatorPath()],\r\n ['stroke', this.strokeColor],\r\n ['fill', this.strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ]);\r\n SvgHelper.setAttributes(this.endTerminatorVisual, [\r\n ['d', this.getEndTerminatorPath()],\r\n ['stroke', this.strokeColor],\r\n ['fill', this.strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n public getState(): LinearMarkerBaseState {\r\n const result: LinearMarkerBaseState = Object.assign(\r\n {\r\n x1: this.x1,\r\n y1: this.y1,\r\n x2: this.x2,\r\n y2: this.y2,\r\n },\r\n super.getState(),\r\n );\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n super.restoreState(state);\r\n\r\n const lmbState = state as LinearMarkerBaseState;\r\n this.x1 = lmbState.x1;\r\n this.y1 = lmbState.y1;\r\n this.x2 = lmbState.x2;\r\n this.y2 = lmbState.y2;\r\n\r\n this.createVisual();\r\n this.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.x1 = this.x1 * scaleX;\r\n this.y1 = this.y1 * scaleY;\r\n this.x2 = this.x2 * scaleX;\r\n this.y2 = this.y2 * scaleY;\r\n\r\n this.strokeWidth *= (scaleX + scaleY) / 2;\r\n\r\n this.adjustVisual();\r\n }\r\n}\r\n","import { LinearMarkerBase } from './LinearMarkerBase';\r\n\r\n/**\r\n * Line marker represents a simple straight line.\r\n *\r\n * @summary Line marker.\r\n * @group Markers\r\n */\r\nexport class LineMarker extends LinearMarkerBase {\r\n public static typeName = 'LineMarker';\r\n public static title = 'Line marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.strokeColor = '#ff0000';\r\n this.strokeWidth = 3;\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n }\r\n\r\n protected getPath(): string {\r\n // svg path for line\r\n const result = `M ${this.x1} ${this.y1} L ${this.x2} ${this.y2}`;\r\n\r\n return result;\r\n }\r\n}\r\n","import { ArrowMarkerState, ArrowType } from './ArrowMarkerState';\r\nimport { IPoint } from './IPoint';\r\nimport { LineMarker } from './LineMarker';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\n\r\n/**\r\n * Arrow marker represents a line with arrow heads at the ends.\r\n *\r\n * @summary A line with arrow heads at the ends.\r\n *\r\n * @group Markers\r\n */\r\nexport class ArrowMarker extends LineMarker {\r\n public static typeName = 'ArrowMarker';\r\n public static title = 'Arrow marker';\r\n\r\n private _arrowType: ArrowType = 'end';\r\n /**\r\n * Type of the arrow.\r\n *\r\n * Specify whether the arrow should be drawn at the start, end, both ends or none.\r\n */\r\n public get arrowType(): ArrowType {\r\n return this._arrowType;\r\n }\r\n public set arrowType(value: ArrowType) {\r\n this._arrowType = value;\r\n this.adjustVisual();\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.getArrowProperties = this.getArrowProperties.bind(this);\r\n this.getStartTerminatorPath = this.getStartTerminatorPath.bind(this);\r\n this.getEndTerminatorPath = this.getEndTerminatorPath.bind(this);\r\n }\r\n\r\n private getArrowProperties() {\r\n const arrowHeight = 10 + this.strokeWidth * 2;\r\n const arrowWidth = Math.min(\r\n Math.max(5, this.strokeWidth * 2),\r\n this.strokeWidth + 5,\r\n );\r\n const arrowDipFactor = 0.7; // arrow base \"bend factor\"\r\n\r\n const dx = this.x2 - this.x1;\r\n const dy = this.y2 - this.y1;\r\n const angle = Math.atan2(dy, dx);\r\n return { arrowHeight, arrowDipFactor, angle, arrowWidth };\r\n }\r\n\r\n protected getStartTerminatorPath(): string {\r\n const { arrowHeight, arrowDipFactor, angle, arrowWidth } =\r\n this.getArrowProperties();\r\n\r\n // Start arrow\r\n const startArrowBasePoint: IPoint = {\r\n x: this.x1 + arrowHeight * arrowDipFactor * Math.cos(angle),\r\n y: this.y1 + arrowHeight * arrowDipFactor * Math.sin(angle),\r\n };\r\n\r\n const startArrowTipBasePoint: IPoint = {\r\n x: this.x1 + arrowHeight * Math.cos(angle),\r\n y: this.y1 + arrowHeight * Math.sin(angle),\r\n };\r\n\r\n const startArrowSide1: IPoint = {\r\n x: startArrowTipBasePoint.x + arrowWidth * Math.sin(angle),\r\n y: startArrowTipBasePoint.y - arrowWidth * Math.cos(angle),\r\n };\r\n\r\n const startArrowSide2: IPoint = {\r\n x: startArrowTipBasePoint.x - arrowWidth * Math.sin(angle),\r\n y: startArrowTipBasePoint.y + arrowWidth * Math.cos(angle),\r\n };\r\n\r\n const startSegment =\r\n this.arrowType === 'start' || this.arrowType === 'both'\r\n ? `M ${startArrowBasePoint.x} ${startArrowBasePoint.y}\r\n L ${startArrowSide1.x} ${startArrowSide1.y} L ${this.x1} ${this.y1} L ${startArrowSide2.x} ${startArrowSide2.y} L ${startArrowBasePoint.x} ${startArrowBasePoint.y}\r\n L ${startArrowBasePoint.x} ${startArrowBasePoint.y}`\r\n : ``;\r\n\r\n return startSegment;\r\n }\r\n\r\n protected getEndTerminatorPath(): string {\r\n const { arrowHeight, arrowDipFactor, angle, arrowWidth } =\r\n this.getArrowProperties();\r\n\r\n // End arrow\r\n const endArrowBasePoint: IPoint = {\r\n x: this.x2 - arrowHeight * arrowDipFactor * Math.cos(angle),\r\n y: this.y2 - arrowHeight * arrowDipFactor * Math.sin(angle),\r\n };\r\n\r\n const endArrowTipBasePoint: IPoint = {\r\n x: this.x2 - arrowHeight * Math.cos(angle),\r\n y: this.y2 - arrowHeight * Math.sin(angle),\r\n };\r\n\r\n const endArrowSide1: IPoint = {\r\n x: endArrowTipBasePoint.x + arrowWidth * Math.sin(angle),\r\n y: endArrowTipBasePoint.y - arrowWidth * Math.cos(angle),\r\n };\r\n\r\n const endArrowSide2: IPoint = {\r\n x: endArrowTipBasePoint.x - arrowWidth * Math.sin(angle),\r\n y: endArrowTipBasePoint.y + arrowWidth * Math.cos(angle),\r\n };\r\n\r\n const endSegment =\r\n this.arrowType === 'end' || this.arrowType === 'both'\r\n ? `M ${endArrowBasePoint.x} ${endArrowBasePoint.y} \r\n L ${endArrowSide1.x} ${endArrowSide1.y} L ${this.x2} ${this.y2} L ${endArrowSide2.x} ${endArrowSide2.y} L ${endArrowBasePoint.x} ${endArrowBasePoint.y} Z`\r\n : ``;\r\n\r\n return endSegment;\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n super.applyStrokeWidth();\r\n this.adjustVisual();\r\n }\r\n\r\n public getState(): ArrowMarkerState {\r\n const result: ArrowMarkerState = Object.assign(\r\n {\r\n arrowType: this.arrowType,\r\n },\r\n super.getState(),\r\n );\r\n result.typeName = ArrowMarker.typeName;\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n const arrowState = state as ArrowMarkerState;\r\n this.arrowType = arrowState.arrowType;\r\n\r\n super.restoreState(state);\r\n }\r\n}\r\n","import { IPoint } from './IPoint';\r\nimport { LineMarker } from './LineMarker';\r\n\r\n/**\r\n * Represents a measurement marker.\r\n *\r\n * Measurement marker is a line with two vertical bars at the ends.\r\n *\r\n * @summary A line with two vertical bars at the ends.\r\n * @group Markers\r\n */\r\nexport class MeasurementMarker extends LineMarker {\r\n public static typeName = 'MeasurementMarker';\r\n public static title = 'Measurement marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n }\r\n\r\n protected getStartTerminatorPath(): string {\r\n const { tipLength, angle } = this.getTerminatorProperties();\r\n\r\n const startArrowSide1: IPoint = {\r\n x: this.x1 + tipLength * Math.sin(angle),\r\n y: this.y1 - tipLength * Math.cos(angle),\r\n };\r\n\r\n const startArrowSide2: IPoint = {\r\n x: this.x1 - tipLength * Math.sin(angle),\r\n y: this.y1 + tipLength * Math.cos(angle),\r\n };\r\n\r\n const result = `M ${startArrowSide1.x} ${startArrowSide1.y}\r\n L ${startArrowSide2.x} ${startArrowSide2.y}`;\r\n\r\n return result;\r\n }\r\n\r\n protected getEndTerminatorPath(): string {\r\n const { tipLength, angle } = this.getTerminatorProperties();\r\n\r\n const endArrowSide1: IPoint = {\r\n x: this.x2 + tipLength * Math.sin(angle),\r\n y: this.y2 - tipLength * Math.cos(angle),\r\n };\r\n\r\n const endArrowSide2: IPoint = {\r\n x: this.x2 - tipLength * Math.sin(angle),\r\n y: this.y2 + tipLength * Math.cos(angle),\r\n };\r\n\r\n // svg path for the arrow\r\n const result = `M ${endArrowSide1.x} ${endArrowSide1.y} L ${endArrowSide2.x} ${endArrowSide2.y}`;\r\n\r\n return result;\r\n }\r\n\r\n private getTerminatorProperties() {\r\n const tipLength = 5 + this.strokeWidth * 3;\r\n\r\n const dx = this.x2 - this.x1;\r\n const dy = this.y2 - this.y1;\r\n const angle = Math.atan2(dy, dx);\r\n return { tipLength, angle };\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n super.applyStrokeWidth();\r\n this.adjustVisual();\r\n }\r\n}\r\n","import { IPoint } from './IPoint';\r\nimport { MarkerBase } from './MarkerBase';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { PolygonMarkerState } from './PolygonMarkerState';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\n/**\r\n * Polygon marker is a multi-point marker that represents a polygon.\r\n *\r\n * @summary Polygon marker.\r\n * @group Markers\r\n */\r\nexport class PolygonMarker extends MarkerBase {\r\n public static typeName = 'PolygonMarker';\r\n public static title = 'Polygon marker';\r\n\r\n /**\r\n * Marker's points.\r\n */\r\n public points: IPoint[] = [];\r\n\r\n /**\r\n * Marker's main visual.\r\n */\r\n public visual: SVGGraphicsElement | undefined;\r\n\r\n public selectorVisual: SVGGElement | undefined;\r\n public selectorVisualLines: SVGLineElement[] = [];\r\n public visibleVisual: SVGGraphicsElement | undefined;\r\n\r\n protected applyStrokeColor() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke', this._strokeColor],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyFillColor() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [['fill', this._fillColor]]);\r\n }\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n }\r\n if (this.selectorVisual) {\r\n SvgHelper.setAttributes(this.selectorVisual, [\r\n ['stroke-width', Math.max(this._strokeWidth, 8).toString()],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeDasharray() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.strokeColor = '#ff0000';\r\n this.strokeWidth = 3;\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n this.getState = this.getState.bind(this);\r\n this.restoreState = this.restoreState.bind(this);\r\n this.scale = this.scale.bind(this);\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (\r\n super.ownsTarget(el) ||\r\n el === this.visual ||\r\n el === this.selectorVisual ||\r\n el === this.visibleVisual ||\r\n this.selectorVisualLines.some((l) => l === el)\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Returns SVG path string for the polygon.\r\n *\r\n * @returns Path string for the polygon.\r\n */\r\n protected getPath(): string {\r\n if (this.points.length > 1) {\r\n return (\r\n this.points\r\n .map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x},${p.y}`)\r\n .join(' ') + (this.stage !== 'creating' ? ' Z' : '')\r\n );\r\n }\r\n return 'M0,0';\r\n }\r\n\r\n /**\r\n * Creates marker's main visual.\r\n */\r\n public createVisual(): void {\r\n this.visual = SvgHelper.createGroup();\r\n this.visibleVisual = SvgHelper.createPath(this.getPath(), [\r\n ['stroke', this.strokeColor],\r\n ['fill', this.fillColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['opacity', this.opacity.toString()],\r\n ]);\r\n this.visual.appendChild(this.visibleVisual);\r\n\r\n this.createSelectorVisual();\r\n\r\n this.addMarkerVisualToContainer(this.visual);\r\n }\r\n\r\n /**\r\n * Creates selector visual.\r\n *\r\n * Selector visual is a transparent wider visual that allows easier selection of the marker.\r\n */\r\n private createSelectorVisual() {\r\n if (this.visual) {\r\n this.selectorVisual = SvgHelper.createGroup();\r\n this.visual.appendChild(this.selectorVisual);\r\n\r\n this.points.forEach(() => {\r\n this.addSelectorLine();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Adjusts marker visual after manipulation when needed.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n public adjustVisual(): void {\r\n if (this.selectorVisual && this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['d', this.getPath()],\r\n ['stroke', this.strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['stroke-dasharray', this.strokeDasharray.toString()],\r\n ['fill', this.fillColor],\r\n ['opacity', this.opacity.toString()],\r\n ]);\r\n\r\n this.adjustSelectorVisual();\r\n }\r\n }\r\n\r\n private adjustSelectorVisual() {\r\n if (this.selectorVisual) {\r\n // adjust number of lines\r\n const missingLines = this.points.length - this.selectorVisualLines.length;\r\n if (missingLines > 0) {\r\n for (let i = 0; i < missingLines; i++) {\r\n this.addSelectorLine();\r\n }\r\n } else if (missingLines < 0) {\r\n for (let i = 0; i < -missingLines; i++) {\r\n this.selectorVisual!.removeChild(this.selectorVisualLines.pop()!);\r\n }\r\n }\r\n\r\n // adjust line coordinates\r\n this.selectorVisualLines.forEach((line, i) => {\r\n SvgHelper.setAttributes(line, [\r\n ['x1', this.points[i].x.toString()],\r\n ['y1', this.points[i].y.toString()],\r\n ['x2', this.points[(i + 1) % this.points.length].x.toString()],\r\n ['y2', this.points[(i + 1) % this.points.length].y.toString()],\r\n ]);\r\n });\r\n }\r\n }\r\n\r\n private addSelectorLine() {\r\n const line = SvgHelper.createLine(0, 0, 0, 0, [\r\n ['stroke', 'transparent'],\r\n ['stroke-width', Math.max(this.strokeWidth, 8).toString()],\r\n ]);\r\n this.selectorVisual!.appendChild(line);\r\n this.selectorVisualLines.push(line);\r\n }\r\n\r\n public getState(): PolygonMarkerState {\r\n const result: PolygonMarkerState = Object.assign(\r\n {\r\n points: this.points,\r\n },\r\n super.getState(),\r\n );\r\n result.typeName = PolygonMarker.typeName;\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n super.restoreState(state);\r\n\r\n const pmState = state as PolygonMarkerState;\r\n this.points = pmState.points;\r\n\r\n this.createVisual();\r\n this.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.points.forEach((p) => {\r\n p.x = p.x * scaleX;\r\n p.y = p.y * scaleY;\r\n });\r\n\r\n this.adjustVisual();\r\n }\r\n}\r\n","import { FreehandMarkerState } from './FreehandMarkerState';\r\nimport { IPoint } from './IPoint';\r\nimport { MarkerBase } from './MarkerBase';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\n/**\r\n * Freehand marker represents a hand drawing.\r\n *\r\n * Unlike v2 in v3 freehand marker is represented by an SVG path element.\r\n * This means that the line properties like stroke color, width, dasharray, etc.\r\n * can be modified after drawing.\r\n *\r\n * @summary Freehand drawing marker.\r\n * @group Markers\r\n */\r\nexport class FreehandMarker extends MarkerBase {\r\n public static typeName = 'FreehandMarker';\r\n public static title = 'Freehand marker';\r\n public static applyDefaultFilter = false;\r\n\r\n /**\r\n * Points of the freehand line.\r\n */\r\n public points: IPoint[] = [];\r\n\r\n /**\r\n * Marker's main visual.\r\n */\r\n public visual: SVGGraphicsElement | undefined;\r\n\r\n /**\r\n * Wider invisible visual to make it easier to select and manipulate the marker.\r\n */\r\n protected selectorVisual: SVGGraphicsElement | undefined;\r\n /**\r\n * Visible visual of the marker.\r\n */\r\n public visibleVisual: SVGGraphicsElement | undefined;\r\n\r\n protected applyStrokeColor() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke', this._strokeColor],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n }\r\n if (this.selectorVisual) {\r\n SvgHelper.setAttributes(this.selectorVisual, [\r\n ['stroke-width', Math.max(this._strokeWidth, 8).toString()],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeDasharray() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.strokeColor = '#ff0000';\r\n this.strokeWidth = 3;\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n this.getState = this.getState.bind(this);\r\n this.restoreState = this.restoreState.bind(this);\r\n this.scale = this.scale.bind(this);\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (\r\n super.ownsTarget(el) ||\r\n el === this.visual ||\r\n el === this.selectorVisual ||\r\n el === this.visibleVisual\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Returns SVG path string representing the freehand line.\r\n *\r\n * @returns SVG path string representing the freehand line.\r\n */\r\n protected getPath(): string {\r\n if (this.points.length > 1) {\r\n return this.points\r\n .map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x},${p.y}`)\r\n .join(' ');\r\n }\r\n return 'M0,0';\r\n }\r\n\r\n /**\r\n * Creates the visual elements comprising the marker's visual.\r\n */\r\n public createVisual(): void {\r\n this.visual = SvgHelper.createGroup();\r\n this.selectorVisual = SvgHelper.createPath(this.getPath(), [\r\n ['stroke', 'transparent'],\r\n ['fill', 'transparent'],\r\n ['stroke-width', Math.max(this.strokeWidth, 8).toString()],\r\n ]);\r\n this.visibleVisual = SvgHelper.createPath(this.getPath(), [\r\n ['stroke', this.strokeColor],\r\n ['fill', 'transparent'],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['opacity', this.opacity.toString()],\r\n ]);\r\n this.visual.appendChild(this.selectorVisual);\r\n this.visual.appendChild(this.visibleVisual);\r\n\r\n this.addMarkerVisualToContainer(this.visual);\r\n }\r\n\r\n /**\r\n * Adjusts marker visual after manipulation or with new points.\r\n */\r\n public adjustVisual(): void {\r\n if (this.selectorVisual && this.visibleVisual) {\r\n const path = this.getPath();\r\n SvgHelper.setAttributes(this.selectorVisual, [['d', path]]);\r\n SvgHelper.setAttributes(this.visibleVisual, [['d', path]]);\r\n\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke', this.strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['stroke-dasharray', this.strokeDasharray.toString()],\r\n ['stroke-dasharray', this.strokeDasharray.toString()],\r\n ['opacity', this.opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n public getState(): FreehandMarkerState {\r\n const result: FreehandMarkerState = Object.assign(\r\n {\r\n points: this.points,\r\n },\r\n super.getState(),\r\n );\r\n result.typeName = FreehandMarker.typeName;\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n super.restoreState(state);\r\n\r\n const pmState = state as FreehandMarkerState;\r\n this.points = pmState.points;\r\n\r\n this.createVisual();\r\n this.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.points.forEach((p) => {\r\n p.x = p.x * scaleX;\r\n p.y = p.y * scaleY;\r\n });\r\n\r\n this.adjustVisual();\r\n }\r\n}\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n function next() {\r\n while (env.stack.length) {\r\n var rec = env.stack.pop();\r\n try {\r\n var result = rec.dispose && rec.dispose.call(rec.value);\r\n if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n};\r\n","import { FontSize } from './FontSize';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\n/**\r\n * TextBlock represents a block of text used across all text-based markers.\r\n */\r\nexport class TextBlock {\r\n /**\r\n * Fired when text size changes.\r\n *\r\n * @group Events\r\n */\r\n public onTextSizeChanged?: (textBlock: TextBlock) => void;\r\n\r\n private _text = '';\r\n /**\r\n * Returns the text block's text.\r\n */\r\n public get text() {\r\n return this._text;\r\n }\r\n /**\r\n * Sets the text block's text.\r\n */\r\n public set text(value) {\r\n this._text = value;\r\n this.renderText();\r\n }\r\n\r\n /**\r\n * Text block's horizontal offset from the automatically calculated position.\r\n */\r\n public offsetX = 0;\r\n /**\r\n * Text block's vertical offset from the automatically calculated position.\r\n */\r\n public offsetY = 0;\r\n\r\n private _boundingBox: DOMRect = new DOMRect();\r\n /**\r\n * Returns the bounding box where text should fit and/or be anchored.\r\n */\r\n public get boundingBox(): DOMRect {\r\n return this._boundingBox;\r\n }\r\n /**\r\n * Sets the bounding box where text should fit and/or be anchored.\r\n */\r\n public set boundingBox(value: DOMRect) {\r\n this._boundingBox = value;\r\n this.renderText();\r\n //this.positionText();\r\n }\r\n\r\n private _labelBackground: SVGRectElement = SvgHelper.createRect(10, 10, [\r\n ['fill', 'white'],\r\n ]);\r\n /**\r\n * Returns the background rectangle (behind the text).\r\n */\r\n public get labelBackground(): SVGRectElement {\r\n return this._labelBackground;\r\n }\r\n\r\n private _textElement: SVGTextElement = SvgHelper.createText();\r\n /**\r\n * Returns the text block's text element.\r\n */\r\n public get textElement(): SVGTextElement {\r\n return this._textElement;\r\n }\r\n\r\n private _color = 'transparent';\r\n /**\r\n * Sets the text color.\r\n */\r\n public set color(value: string) {\r\n if (this.textElement) {\r\n SvgHelper.setAttributes(this._textElement, [['fill', value]]);\r\n }\r\n this._color = value;\r\n }\r\n /**\r\n * Returns the text color.\r\n */\r\n public get color(): string {\r\n return this._color;\r\n }\r\n\r\n private _fontFamily = '';\r\n /**\r\n * Returns the text's font family.\r\n */\r\n public get fontFamily() {\r\n return this._fontFamily;\r\n }\r\n /**\r\n * Sets the text's font family.\r\n */\r\n public set fontFamily(value) {\r\n if (this._textElement) {\r\n this._textElement.style.fontFamily = value;\r\n }\r\n this._fontFamily = value;\r\n this.positionText();\r\n }\r\n\r\n private _fontSize: FontSize = {\r\n value: 1,\r\n units: 'rem',\r\n step: 0.1,\r\n };\r\n /**\r\n * Returns the text's font size.\r\n */\r\n public get fontSize() {\r\n return this._fontSize;\r\n }\r\n /**\r\n * Sets the text's font size.\r\n */\r\n public set fontSize(value: FontSize) {\r\n if (this._textElement) {\r\n this._textElement.style.fontSize = `${value.value}${value.units}`;\r\n }\r\n this._fontSize = value;\r\n this.positionText();\r\n }\r\n\r\n /**\r\n * Creates a text block\r\n * @param text initial text\r\n */\r\n constructor(text?: string) {\r\n this.setupTextElement();\r\n\r\n if (text !== undefined) {\r\n this.text = text;\r\n }\r\n\r\n this.setupTextElement = this.setupTextElement.bind(this);\r\n this.renderText = this.renderText.bind(this);\r\n this.positionText = this.positionText.bind(this);\r\n this.ownsTarget = this.ownsTarget.bind(this);\r\n this.show = this.show.bind(this);\r\n this.hide = this.hide.bind(this);\r\n this.showControlBox = this.showControlBox.bind(this);\r\n this.hideControlBox = this.hideControlBox.bind(this);\r\n this.applyFontStyles = this.applyFontStyles.bind(this);\r\n this.wrapText = this.wrapText.bind(this);\r\n }\r\n\r\n /**\r\n * Returns true if the text block contains the supplied element.\r\n * @param el element to test.\r\n * @returns true if the element belongs to the text block, false otherwise.\r\n */\r\n public ownsTarget(el: EventTarget) {\r\n if (el === this._textElement) {\r\n return true;\r\n } else {\r\n let found = false;\r\n this._textElement.childNodes.forEach((span) => {\r\n if (span === el) {\r\n found = true;\r\n }\r\n });\r\n return found;\r\n }\r\n }\r\n\r\n private setupTextElement() {\r\n this._textElement.style.fontSize = `${this.fontSize.value}${this.fontSize.units}`;\r\n this._textElement.style.textAnchor = 'middle';\r\n this._textElement.style.userSelect = 'none';\r\n\r\n this._labelBackground.style.stroke = '#aaa';\r\n this._labelBackground.style.strokeDasharray = '2 2';\r\n this._labelBackground.style.strokeWidth = '1';\r\n this._labelBackground.style.strokeOpacity = '0';\r\n }\r\n\r\n private wrapText(): string {\r\n function getTextAspectRatio(textLines: string[]): number {\r\n const charsLinesAspectRatio = 0.35;\r\n\r\n let longestLineChars = textLines[0].length;\r\n textLines.forEach((line) => {\r\n if (line.length > longestLineChars) {\r\n longestLineChars = line.length;\r\n }\r\n });\r\n\r\n return (longestLineChars * charsLinesAspectRatio) / textLines.length;\r\n }\r\n\r\n if (this.text !== '') {\r\n const lines = this.text.split(/\\r\\n|[\\n\\v\\f\\r\\x85\\u2028\\u2029]/);\r\n const boxAspectRatio =\r\n (this.boundingBox.width * 1.0) / this.boundingBox.height;\r\n let processedLines = new Array<string>(...lines);\r\n\r\n let textAspectRatio = getTextAspectRatio(processedLines);\r\n\r\n let maxLineLength = Number.MAX_VALUE;\r\n while (textAspectRatio > boxAspectRatio) {\r\n let longestLine = processedLines[0];\r\n processedLines.forEach((line) => {\r\n if (line.length > longestLine.length) {\r\n longestLine = line;\r\n }\r\n });\r\n maxLineLength = longestLine.lastIndexOf(' ', maxLineLength - 1);\r\n\r\n if (maxLineLength > 0) {\r\n processedLines = [];\r\n lines.forEach((line) => {\r\n let reminderLine = line;\r\n while (reminderLine.length > maxLineLength) {\r\n let maxEnd = reminderLine.lastIndexOf(' ', maxLineLength);\r\n if (maxEnd < 0) {\r\n // if the first word is longer than max, at least wrap after it\r\n maxEnd = reminderLine.indexOf(' ');\r\n }\r\n if (maxEnd > 0) {\r\n processedLines.push(reminderLine.substring(0, maxEnd));\r\n reminderLine = reminderLine.substring(maxEnd).trim();\r\n } else {\r\n processedLines.push(reminderLine);\r\n reminderLine = '';\r\n }\r\n }\r\n processedLines.push(reminderLine);\r\n });\r\n textAspectRatio = getTextAspectRatio(processedLines);\r\n } else {\r\n // can't wrap no more\r\n textAspectRatio = -1;\r\n }\r\n }\r\n\r\n return processedLines.join(`\\r\\n`);\r\n } else {\r\n return this.text;\r\n }\r\n }\r\n\r\n public wordWrap = false;\r\n private prevWrappedText = '';\r\n /**\r\n * Renders text within the text block according to its settings.\r\n */\r\n public async renderText() {\r\n const LINE_SIZE = '1em'; // `${this.fontSize.value}${this.fontSize.units}`;\r\n\r\n if (this._textElement) {\r\n const processedText = this.wordWrap ? this.wrapText() : this.text;\r\n if (this.prevWrappedText === processedText) {\r\n this.positionText();\r\n return;\r\n }\r\n this.prevWrappedText = processedText;\r\n\r\n while (this._textElement.lastChild) {\r\n this._textElement.removeChild(this._textElement.lastChild);\r\n }\r\n\r\n const lines = processedText.split(/\\r\\n|[\\n\\v\\f\\r\\x85\\u2028\\u2029]/);\r\n lines.forEach((line, lineno) => {\r\n this._textElement.appendChild(\r\n SvgHelper.createTSpan(\r\n // workaround for swallowed empty lines\r\n line.trim() === '' ? ' ' : line.trim(),\r\n [\r\n // ['x', '0'],\r\n ['dy', lineno > 0 ? LINE_SIZE : '0'],\r\n ],\r\n ),\r\n );\r\n });\r\n\r\n // hide to prevent jerky movements during layout\r\n this.textElement.style.opacity = '0';\r\n\r\n // Wait for next frame to ensure DOM is updated\r\n await new Promise((resolve) => requestAnimationFrame(resolve));\r\n this.positionText(this);\r\n }\r\n }\r\n\r\n private applyFontStyles() {\r\n this._textElement.childNodes.forEach((ts) => {\r\n const tspan = <SVGTSpanElement>ts;\r\n tspan.style.fontFamily = this._textElement.style.fontFamily;\r\n tspan.style.fontSize = this._textElement.style.fontSize;\r\n });\r\n }\r\n\r\n private _textSize?: DOMRect;\r\n /**\r\n * Returns the size of the rectangle containing the text block's text.\r\n */\r\n public get textSize(): DOMRect | undefined {\r\n return this._textSize;\r\n }\r\n\r\n /**\r\n * Positions the text within the text block.\r\n * @param textBlock\r\n */\r\n public positionText(textBlock?: TextBlock) {\r\n const self = textBlock === undefined ? this : textBlock;\r\n const LINE_SIZE = '1em'; //`${this.fontSize.value}${this.fontSize.units}`;\r\n\r\n self.applyFontStyles();\r\n\r\n self._textSize = self._textElement.getBBox();\r\n const centerX =\r\n self.boundingBox.x + self._textSize.width / 2 + self.offsetX;\r\n\r\n const noOfLines = self._textElement.childNodes.length;\r\n const lineHeight = self._textSize.height / noOfLines;\r\n // arbitrary approximation for correct vertical alignment\r\n const autoOffset =\r\n noOfLines > 1 ? -(lineHeight * (noOfLines - 2)) / 2 : lineHeight / 3;\r\n\r\n const centerY =\r\n self.boundingBox.y +\r\n self._textSize.height / 2 +\r\n // - self._textSize.height / 2\r\n autoOffset +\r\n self.offsetY;\r\n\r\n self._textElement.childNodes.forEach((ts, lineno) => {\r\n const tspan = <SVGTSpanElement>ts;\r\n SvgHelper.setAttributes(tspan, [\r\n ['x', `${centerX}`],\r\n ['dy', lineno > 0 ? LINE_SIZE : '0'],\r\n ]);\r\n });\r\n SvgHelper.setAttributes(self._textElement, [['x', `${centerX}`]]);\r\n SvgHelper.setAttributes(self._textElement, [['y', `${centerY}`]]);\r\n\r\n self._textSize = self._textElement.getBBox();\r\n const bgPadding = 1.2;\r\n SvgHelper.setAttributes(self.labelBackground, [\r\n ['width', (self._textSize.width * bgPadding).toString()],\r\n ['height', (self._textSize.height * bgPadding).toString()],\r\n ['x', (centerX - (self._textSize.width * bgPadding) / 2).toString()],\r\n [\r\n 'y',\r\n (self._textSize.y - bgPadding)\r\n // centerY -\r\n // (self._textSize.height / 2) * (bgPadding - 1) * 2\r\n // - lineHeight / 2\r\n .toString(),\r\n ],\r\n ]);\r\n\r\n if (self.onTextSizeChanged) {\r\n self.onTextSizeChanged(self);\r\n }\r\n\r\n // restore visibility\r\n this.textElement.style.opacity = '1';\r\n }\r\n\r\n /**\r\n * Makes the text block content visible.\r\n */\r\n public show() {\r\n this._textElement.style.display = '';\r\n this._labelBackground.style.display = '';\r\n }\r\n /**\r\n * Hides the text block content.\r\n */\r\n public hide() {\r\n this._textElement.style.display = 'none';\r\n this._labelBackground.style.display = 'none';\r\n }\r\n\r\n /**\r\n * Shows the text block's dashed outline.\r\n */\r\n public showControlBox() {\r\n this.labelBackground.style.strokeOpacity = '1';\r\n }\r\n /**\r\n * Hides the text block's dashed outline.\r\n */\r\n public hideControlBox() {\r\n this.labelBackground.style.strokeOpacity = '0';\r\n }\r\n}\r\n","import { FontSize } from './FontSize';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { RectangularBoxMarkerBase } from './RectangularBoxMarkerBase';\r\nimport { SvgHelper } from './SvgHelper';\r\nimport { TextBlock } from './TextBlock';\r\nimport { TextMarkerState } from './TextMarkerState';\r\n\r\n/**\r\n * Text marker.\r\n *\r\n * Used to represent a text block as well a base class for other text-based markers.\r\n *\r\n * @summary Text marker.\r\n * @group Markers\r\n */\r\nexport class TextMarker extends RectangularBoxMarkerBase {\r\n public static typeName = 'TextMarker';\r\n\r\n public static title = 'Text marker';\r\n\r\n /**\r\n * Default text for the marker type.\r\n */\r\n protected static DEFAULT_TEXT = 'Text';\r\n // protected static DEFAULT_TEXT =\r\n // 'Longer text to see what happens when it is too long to fit the bounding box.';\r\n\r\n /**\r\n * Callback to be called when the text size changes.\r\n */\r\n public onSizeChanged?: (textMarker: TextMarker) => void;\r\n\r\n private _color = 'black';\r\n /**\r\n * Returns markers's text color.\r\n */\r\n public get color() {\r\n return this._color;\r\n }\r\n /**\r\n * Sets the markers's text color.\r\n */\r\n public set color(value) {\r\n this._color = value;\r\n this.textBlock.color = value;\r\n }\r\n\r\n private _fontFamily = 'Helvetica, Arial, sans-serif';\r\n /**\r\n * Returns the markers's font family.\r\n */\r\n public get fontFamily() {\r\n return this._fontFamily;\r\n }\r\n /**\r\n * Sets the markers's font family.\r\n */\r\n public set fontFamily(value) {\r\n this._fontFamily = value;\r\n this.textBlock.fontFamily = value;\r\n }\r\n\r\n private _fontSize: FontSize = {\r\n value: 1,\r\n units: 'rem',\r\n step: 0.1,\r\n };\r\n /**\r\n * Returns the marker's font size.\r\n */\r\n public get fontSize(): FontSize {\r\n return this._fontSize;\r\n }\r\n /**\r\n * Sets the marker's font size.\r\n */\r\n public set fontSize(value: FontSize) {\r\n this._fontSize = value;\r\n this.textBlock.fontSize = value;\r\n }\r\n\r\n /**\r\n * Returns the default text for the marker type.\r\n * @returns marker type's default text.\r\n */\r\n protected getDefaultText(): string {\r\n return Object.getPrototypeOf(this).constructor.DEFAULT_TEXT;\r\n }\r\n private _text: string = this.getDefaultText();\r\n /**\r\n * Returns the marker's text.\r\n */\r\n public get text(): string {\r\n return this.textBlock.text;\r\n }\r\n /**\r\n * Sets the marker's text.\r\n */\r\n public set text(value: string) {\r\n this._text = value;\r\n this.textBlock.text = this._text;\r\n }\r\n\r\n /**\r\n * Text padding from the bounding box.\r\n */\r\n public padding = 2;\r\n\r\n /**\r\n * Text's bounding box where text should fit and/or be anchored to.\r\n */\r\n public textBoundingBox: DOMRect;\r\n\r\n /**\r\n * Text block handling the text rendering.\r\n */\r\n public textBlock: TextBlock = new TextBlock(this.getDefaultText());\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.setColor = this.setColor.bind(this);\r\n this.setFont = this.setFont.bind(this);\r\n this.setFontSize = this.setFontSize.bind(this);\r\n this.setSize = this.setSize.bind(this);\r\n this.textSizeChanged = this.textSizeChanged.bind(this);\r\n this.setSizeFromTextSize = this.setSizeFromTextSize.bind(this);\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n\r\n this.textBoundingBox = new DOMRect();\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this.opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n /**\r\n * Creates marker's visual.\r\n */\r\n public createVisual(): void {\r\n this.textBlock.fontFamily = this.fontFamily;\r\n this.textBlock.fontSize = this.fontSize;\r\n this.textBlock.color = this.color;\r\n this.textBlock.offsetX = this.padding;\r\n this.textBlock.offsetY = this.padding;\r\n\r\n this.textBlock.onTextSizeChanged = this.textSizeChanged;\r\n\r\n this.visual = SvgHelper.createGroup();\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n this.visual.appendChild(this.textBlock.textElement);\r\n this.addMarkerVisualToContainer(this.visual);\r\n\r\n this.textBlock.text = this._text;\r\n }\r\n\r\n /**\r\n * Adjusts marker's visual according to the current state.\r\n */\r\n public adjustVisual(): void {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n this.setSize();\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (\r\n super.ownsTarget(el) ||\r\n el === this.visual ||\r\n this.textBlock.ownsTarget(el)\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Sets the text bounding box.\r\n */\r\n protected setTextBoundingBox() {\r\n this.textBoundingBox.x = this.padding;\r\n this.textBoundingBox.y = this.padding;\r\n this.textBoundingBox.width = Number.MAX_VALUE; // this.width - this.padding * 2;\r\n this.textBoundingBox.height = Number.MAX_VALUE; // this.height - this.padding * 2;\r\n //this.textBlock.boundingBox = this.textBoundingBox;\r\n }\r\n\r\n /**\r\n * Sets (adjusts) the marker's size.\r\n */\r\n public setSize(): void {\r\n const [prevWidth, prevHeight] = [this.width, this.height];\r\n\r\n super.setSize();\r\n this.setSizeFromTextSize();\r\n\r\n if (\r\n (prevWidth !== this.width || prevHeight !== this.height) &&\r\n this.onSizeChanged\r\n ) {\r\n this.onSizeChanged(this);\r\n }\r\n\r\n this.setTextBoundingBox();\r\n }\r\n\r\n /**\r\n * Sets the marker's size based on the text size.\r\n */\r\n protected setSizeFromTextSize(): void {\r\n if (this.textBlock.textSize) {\r\n this.width = this.textBlock.textSize.width + this.padding * 2;\r\n this.height = this.textBlock.textSize.height + this.padding * 2;\r\n }\r\n\r\n this.textBlock.offsetX = this.padding;\r\n this.textBlock.offsetY = this.padding;\r\n }\r\n\r\n private textSizeChanged(): void {\r\n this.adjustVisual();\r\n }\r\n\r\n /**\r\n * Sets the text color.\r\n * @param color text color\r\n */\r\n public setColor(color: string): void {\r\n this.color = color;\r\n }\r\n\r\n /**\r\n * Sets the font family.\r\n * @param font font family string\r\n */\r\n public setFont(font: string): void {\r\n this.fontFamily = font;\r\n }\r\n\r\n /**\r\n * Sets the font size.\r\n * @param fontSize font size\r\n */\r\n public setFontSize(fontSize: FontSize): void {\r\n this.fontSize = fontSize;\r\n }\r\n\r\n /**\r\n * Hides the marker's visual.\r\n *\r\n * Used when editing the text.\r\n */\r\n public hideVisual(): void {\r\n if (this.visual) {\r\n this.visual.style.visibility = 'hidden';\r\n }\r\n }\r\n /**\r\n * Shows the marker's visual.\r\n *\r\n * Eg. when done editing the text.\r\n */\r\n public showVisual() {\r\n if (this.visual) {\r\n this.visual.style.visibility = 'visible';\r\n this.textBlock.renderText();\r\n }\r\n }\r\n\r\n public getState(): TextMarkerState {\r\n const result: TextMarkerState = Object.assign(\r\n {\r\n color: this.color,\r\n fontFamily: this.fontFamily,\r\n fontSize: this.fontSize,\r\n text: this.text,\r\n },\r\n super.getState(),\r\n );\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n const textState = state as TextMarkerState;\r\n this.color = textState.color;\r\n this.fontFamily = textState.fontFamily;\r\n this.fontSize = textState.fontSize;\r\n this.text = textState.text;\r\n\r\n this.createVisual();\r\n\r\n super.restoreState(state);\r\n this.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n const newFontSize = {\r\n ...this.fontSize,\r\n value: this.fontSize.value * Math.min(scaleX, scaleY),\r\n };\r\n this.fontSize = newFontSize;\r\n\r\n this.padding = this.padding * Math.min(scaleX, scaleY);\r\n\r\n this.adjustVisual();\r\n }\r\n}\r\n","import { ShapeMarkerBase } from './ShapeMarkerBase';\r\n\r\n/**\r\n * Cover marker is a filled rectangle marker.\r\n *\r\n * A typical use case is to cover some area of the image with a colored rectangle as a \"redaction\".\r\n *\r\n * @summary Filled rectangle marker.\r\n * @group Markers\r\n */\r\nexport class CoverMarker extends ShapeMarkerBase {\r\n public static typeName = 'CoverMarker';\r\n public static title = 'Cover marker';\r\n public static applyDefaultFilter = false;\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.fillColor = '#000000';\r\n this.strokeColor = 'transparent';\r\n this.strokeWidth = 0;\r\n }\r\n\r\n protected getPath(\r\n width: number = this.width,\r\n height: number = this.height,\r\n ): string {\r\n const result = `M 0 0 \r\n H ${width} \r\n V ${height} \r\n H 0 \r\n V 0 Z`;\r\n\r\n return result;\r\n }\r\n}\r\n","import { ShapeMarkerBase } from './ShapeMarkerBase';\r\n\r\n/**\r\n * Highlight marker is a semi-transparent rectangular marker.\r\n *\r\n * @summary Semi-transparent rectangular marker.\r\n * @group Markers\r\n */\r\nexport class HighlightMarker extends ShapeMarkerBase {\r\n public static typeName = 'HighlightMarker';\r\n public static title = 'Highlight marker';\r\n public static applyDefaultFilter = false;\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.fillColor = '#ffff00';\r\n this.opacity = 0.5;\r\n this.strokeColor = 'transparent';\r\n this.strokeWidth = 0;\r\n }\r\n\r\n protected getPath(\r\n width: number = this.width,\r\n height: number = this.height,\r\n ): string {\r\n const result = `M 0 0 \r\n H ${width} \r\n V ${height} \r\n H 0 \r\n V 0 Z`;\r\n\r\n return result;\r\n }\r\n}\r\n","import { CalloutMarkerState } from './CalloutMarkerState';\r\nimport { IPoint } from './IPoint';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\nimport { TextMarker } from './TextMarker';\r\n\r\n/**\r\n * Callout marker is a text-based marker with a callout outline with a tip that can point to specific place\r\n * on the underlying image or annotation.\r\n *\r\n * @summary Text-based marker with a callout outline with a tip that can point to specific place\r\n * on the underlying image or annotation.\r\n *\r\n * @group Markers\r\n */\r\nexport class CalloutMarker extends TextMarker {\r\n public static typeName = 'CalloutMarker';\r\n\r\n public static title = 'Callout marker';\r\n\r\n private _tipPosition: IPoint = { x: 0, y: 0 };\r\n /**\r\n * Coordinates of the position of the tip of the callout.\r\n */\r\n public get tipPosition(): IPoint {\r\n return this._tipPosition;\r\n }\r\n public set tipPosition(value: IPoint) {\r\n this._tipPosition = value;\r\n this.adjustVisual();\r\n }\r\n\r\n private tipBase1Position: IPoint = { x: 0, y: 0 };\r\n private tipBase2Position: IPoint = { x: 0, y: 0 };\r\n\r\n private _calloutVisual: SVGPathElement = SvgHelper.createPath('M0,0');\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.color = '#ffffff';\r\n this.fillColor = '#ff0000';\r\n this.strokeColor = '#ffffff';\r\n this.strokeWidth = 3;\r\n this.padding = 20;\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n this.getPath = this.getPath.bind(this);\r\n this.setTipPoints = this.setTipPoints.bind(this);\r\n }\r\n\r\n protected applyStrokeColor() {\r\n SvgHelper.setAttributes(this._calloutVisual, [\r\n ['stroke', this._strokeColor],\r\n ]);\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n SvgHelper.setAttributes(this._calloutVisual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n }\r\n\r\n protected applyStrokeDasharray() {\r\n SvgHelper.setAttributes(this._calloutVisual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyFillColor() {\r\n SvgHelper.setAttributes(this._calloutVisual, [['fill', this._fillColor]]);\r\n }\r\n\r\n /**\r\n * Returns the SVG path string for the callout outline.\r\n *\r\n * @returns Path string for the callout outline.\r\n */\r\n protected getPath(): string {\r\n const r = 5;\r\n this.setTipPoints();\r\n\r\n const result = `M ${r} 0 \r\n ${\r\n this.tipBase1Position.y === 0\r\n ? `H ${this.tipBase1Position.x} L ${this.tipPosition.x} ${this.tipPosition.y} L ${this.tipBase2Position.x} 0`\r\n : ''\r\n }\r\n H ${this.width - r} \r\n A ${r} ${r} 0 0 1 ${this.width} ${r} \r\n ${\r\n this.tipBase1Position.x === this.width\r\n ? `V ${this.tipBase1Position.y} L ${this.tipPosition.x} ${this.tipPosition.y} L ${this.tipBase2Position.x} ${this.tipBase2Position.y}`\r\n : ''\r\n }\r\n V ${this.height - r} \r\n A ${r} ${r} 0 0 1 ${this.width - r} ${this.height} \r\n ${\r\n this.tipBase1Position.y === this.height\r\n ? `H ${this.tipBase2Position.x} L ${this.tipPosition.x} ${this.tipPosition.y} L ${this.tipBase1Position.x} ${this.height}`\r\n : ''\r\n }\r\n H ${r}\r\n A ${r} ${r} 0 0 1 0 ${this.height - r} \r\n ${\r\n this.tipBase1Position.x === 0\r\n ? `V ${this.tipBase2Position.y} L ${this.tipPosition.x} ${this.tipPosition.y} L ${this.tipBase1Position.x} ${this.tipBase1Position.y}`\r\n : ''\r\n }\r\n V ${r} \r\n A ${r} ${r} 0 0 1 ${r} 0 \r\n Z`;\r\n\r\n return result;\r\n }\r\n\r\n private setTipPoints() {\r\n let offset = Math.min(this.height / 2, 15);\r\n let baseWidth = this.height / 5;\r\n\r\n const cornerAngle = Math.atan(this.height / 2 / (this.width / 2));\r\n if (\r\n this.tipPosition.x < this.width / 2 &&\r\n this.tipPosition.y < this.height / 2\r\n ) {\r\n // top left\r\n const tipAngle = Math.atan(\r\n (this.height / 2 - this.tipPosition.y) /\r\n (this.width / 2 - this.tipPosition.x),\r\n );\r\n if (cornerAngle < tipAngle) {\r\n baseWidth = this.width / 5;\r\n offset = Math.min(this.width / 2, 15);\r\n this.tipBase1Position = { x: offset, y: 0 };\r\n this.tipBase2Position = { x: offset + baseWidth, y: 0 };\r\n } else {\r\n this.tipBase1Position = { x: 0, y: offset };\r\n this.tipBase2Position = { x: 0, y: offset + baseWidth };\r\n }\r\n } else if (\r\n this.tipPosition.x >= this.width / 2 &&\r\n this.tipPosition.y < this.height / 2\r\n ) {\r\n // top right\r\n const tipAngle = Math.atan(\r\n (this.height / 2 - this.tipPosition.y) /\r\n (this.tipPosition.x - this.width / 2),\r\n );\r\n if (cornerAngle < tipAngle) {\r\n baseWidth = this.width / 5;\r\n offset = Math.min(this.width / 2, 15);\r\n this.tipBase1Position = { x: this.width - offset - baseWidth, y: 0 };\r\n this.tipBase2Position = { x: this.width - offset, y: 0 };\r\n } else {\r\n this.tipBase1Position = { x: this.width, y: offset };\r\n this.tipBase2Position = { x: this.width, y: offset + baseWidth };\r\n }\r\n } else if (\r\n this.tipPosition.x >= this.width / 2 &&\r\n this.tipPosition.y >= this.height / 2\r\n ) {\r\n // bottom right\r\n const tipAngle = Math.atan(\r\n (this.tipPosition.y - this.height / 2) /\r\n (this.tipPosition.x - this.width / 2),\r\n );\r\n if (cornerAngle < tipAngle) {\r\n baseWidth = this.width / 5;\r\n offset = Math.min(this.width / 2, 15);\r\n this.tipBase1Position = {\r\n x: this.width - offset - baseWidth,\r\n y: this.height,\r\n };\r\n this.tipBase2Position = { x: this.width - offset, y: this.height };\r\n } else {\r\n this.tipBase1Position = {\r\n x: this.width,\r\n y: this.height - offset - baseWidth,\r\n };\r\n this.tipBase2Position = { x: this.width, y: this.height - offset };\r\n }\r\n } else {\r\n // bottom left\r\n const tipAngle = Math.atan(\r\n (this.tipPosition.y - this.height / 2) /\r\n (this.width / 2 - this.tipPosition.x),\r\n );\r\n if (cornerAngle < tipAngle) {\r\n baseWidth = this.width / 5;\r\n offset = Math.min(this.width / 2, 15);\r\n this.tipBase1Position = { x: offset, y: this.height };\r\n this.tipBase2Position = { x: offset + baseWidth, y: this.height };\r\n } else {\r\n this.tipBase1Position = { x: 0, y: this.height - offset - baseWidth };\r\n this.tipBase2Position = { x: 0, y: this.height - offset };\r\n }\r\n }\r\n }\r\n\r\n public createVisual(): void {\r\n super.createVisual();\r\n\r\n this._tipPosition = {\r\n // x: -50,\r\n // x: this.width + 50,\r\n x: this.width / 4,\r\n // y: this.height / 4,\r\n // y: -50,\r\n y: this.height + 20,\r\n };\r\n\r\n this._calloutVisual = SvgHelper.createPath(this.getPath(), [\r\n ['fill', this._fillColor],\r\n ['stroke', this._strokeColor],\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n this.visual?.insertBefore(this._calloutVisual, this.textBlock.textElement);\r\n }\r\n\r\n public adjustVisual(): void {\r\n super.adjustVisual();\r\n if (this._calloutVisual) {\r\n SvgHelper.setAttributes(this._calloutVisual, [\r\n ['d', this.getPath()],\r\n ['fill', this._fillColor],\r\n ['stroke', this._strokeColor],\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this._calloutVisual === el) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public getState(): CalloutMarkerState {\r\n const result: CalloutMarkerState = Object.assign(\r\n {\r\n fillColor: this.fillColor,\r\n tipPosition: this.tipPosition,\r\n },\r\n super.getState(),\r\n );\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n const calloutState = state as CalloutMarkerState;\r\n super.restoreState(state);\r\n this.fillColor = calloutState.fillColor;\r\n this.tipPosition = calloutState.tipPosition;\r\n\r\n this.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.width = this.width * scaleX;\r\n this.height = this.height * scaleY;\r\n\r\n this.strokeWidth *= (scaleX + scaleY) / 2;\r\n\r\n this._tipPosition = {\r\n x: this._tipPosition.x * scaleX,\r\n y: this._tipPosition.y * scaleY,\r\n };\r\n\r\n this.adjustVisual();\r\n }\r\n}\r\n","import { ShapeOutlineMarkerBase } from './ShapeOutlineMarkerBase';\r\n\r\n/**\r\n * Ellipse frame marker represents unfilled circle/ellipse shape.\r\n *\r\n * @summary Unfilled ellipse marker.\r\n * @group Markers\r\n */\r\nexport class EllipseFrameMarker extends ShapeOutlineMarkerBase {\r\n public static typeName = 'EllipseFrameMarker';\r\n public static title = 'Ellipse frame marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.strokeColor = '#ff0000';\r\n this.strokeWidth = 3;\r\n }\r\n\r\n protected getPath(\r\n width: number = this.width,\r\n height: number = this.height,\r\n ): string {\r\n const result = `M ${width / 2} 0 \r\n a ${width / 2} ${height / 2} 0 1 0 0 ${height} \r\n a ${width / 2} ${height / 2} 0 1 0 0 -${height} z`;\r\n\r\n return result;\r\n }\r\n}\r\n","import { ShapeMarkerBase } from './ShapeMarkerBase';\r\n\r\n/**\r\n * Ellipse marker is a filled ellipse marker.\r\n *\r\n * @summary Filled ellipse marker.\r\n * @group Markers\r\n */\r\nexport class EllipseMarker extends ShapeMarkerBase {\r\n public static typeName = 'EllipseMarker';\r\n public static title = 'Ellipse marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.fillColor = '#ff0000';\r\n this.strokeColor = '#ff0000';\r\n }\r\n\r\n protected getPath(\r\n width: number = this.width,\r\n height: number = this.height,\r\n ): string {\r\n const result = `M ${width / 2} 0 \r\n a ${width / 2} ${height / 2} 0 1 0 0 ${height} \r\n a ${width / 2} ${height / 2} 0 1 0 0 -${height} z`;\r\n\r\n return result;\r\n }\r\n}\r\n","import { ImageMarkerBaseState, ImageType } from './ImageMarkerBaseState';\r\nimport { RectangularBoxMarkerBase } from './RectangularBoxMarkerBase';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\n/**\r\n * Base class for image markers.\r\n *\r\n * This class isn't meant to be used directly. Use one of the derived classes instead.\r\n *\r\n * @summary Image marker base class.\r\n * @group Markers\r\n */\r\nexport class ImageMarkerBase extends RectangularBoxMarkerBase {\r\n public static title = 'Image marker';\r\n\r\n /**\r\n * Main SVG or image element of the marker.\r\n */\r\n protected SVGImage?: SVGSVGElement | SVGImageElement;\r\n /**\r\n * Type of the image: SVG or bitmap.\r\n */\r\n protected imageType: ImageType = 'svg';\r\n\r\n /**\r\n * For SVG images this holds the SVG markup of the image.\r\n */\r\n protected _svgString?: string;\r\n /**\r\n * For SVG images this holds the SVG markup of the image.\r\n */\r\n public get svgString() {\r\n return this._svgString;\r\n }\r\n public set svgString(value) {\r\n this._svgString = value;\r\n if (this.SVGImage && this.imageType === 'svg') {\r\n if (value !== undefined) {\r\n this.SVGImage.outerHTML = value;\r\n } else {\r\n this.SVGImage.outerHTML = '';\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * For bitmap images this holds the base64 encoded image.\r\n */\r\n protected _imageSrc?: string; // = 'data:image/png;base64,...';\r\n /**\r\n * For bitmap images this holds the base64 encoded image.\r\n *\r\n * @remarks\r\n * Technically this could be any URL but due to browser security constraints\r\n * an external image will almost certainly cause bitmap rendering of the image to fail.\r\n *\r\n * In cases you know you will never render the annotation as a static image,\r\n * it should be safe to use external URLs. Otherwise, use base64 encoded images\r\n * like 'data:image/png;base64,...'.\r\n */\r\n public get imageSrc() {\r\n return this._imageSrc;\r\n }\r\n public set imageSrc(value) {\r\n this._imageSrc = value;\r\n if (this.SVGImage && this.imageType === 'bitmap') {\r\n if (value !== undefined) {\r\n SvgHelper.setAttributes(this.SVGImage, [['href', value]]);\r\n } else {\r\n SvgHelper.setAttributes(this.SVGImage, [['href', '']]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Natural (real) width of the image.\r\n */\r\n protected naturalWidth = 24;\r\n /**\r\n * Natural (real) height of the image.\r\n */\r\n protected naturalHeight = 24;\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.defaultSize = { width: this.naturalWidth, height: this.naturalHeight };\r\n\r\n this.createImage = this.createImage.bind(this);\r\n this.createVisual = this.createVisual.bind(this);\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n this.adjustImage = this.adjustImage.bind(this);\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this.opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n /**\r\n * Creates the image element based on the image type and source.\r\n */\r\n protected createImage(): void {\r\n if (this._svgString !== undefined) {\r\n this.imageType = 'svg';\r\n // Import into current document to avoid cross-document issues\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(this._svgString, 'image/svg+xml');\r\n const element = doc.documentElement;\r\n if (!(element instanceof SVGSVGElement)) {\r\n throw new Error('Invalid SVG string');\r\n }\r\n const svgElement = element;\r\n this.SVGImage = this.container.ownerDocument.importNode(svgElement, true);\r\n } else {\r\n this.imageType = 'bitmap';\r\n this.SVGImage = SvgHelper.createImage([['href', this._imageSrc ?? '']]);\r\n }\r\n }\r\n\r\n /**\r\n * Creates marker's visual, including its image element.\r\n */\r\n public createVisual(): void {\r\n this.createImage();\r\n if (this.SVGImage !== undefined) {\r\n this.visual = SvgHelper.createGroup();\r\n\r\n if (this.imageType === 'svg') {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['viewBox', `0 0 ${this.naturalWidth} ${this.naturalHeight}`],\r\n ['fill', this._fillColor],\r\n ['stroke', this._strokeColor],\r\n ['color', this._strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['stroke-dasharray', this.strokeDasharray],\r\n ['opacity', this.opacity.toString()],\r\n ['pointer-events', 'bounding-box'],\r\n ]);\r\n // } else if (this.imageType === 'bitmap') {\r\n }\r\n this.adjustImage();\r\n this.visual.appendChild(this.SVGImage);\r\n this.addMarkerVisualToContainer(this.visual);\r\n }\r\n }\r\n\r\n /**\r\n * Adjusts marker's visual according to the current state\r\n * (color, width, etc.).\r\n */\r\n public adjustVisual(): void {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n /**\r\n * Adjusts the image size and position.\r\n */\r\n public adjustImage(): void {\r\n if (this.SVGImage !== undefined) {\r\n this.SVGImage.setAttribute('x', `0px`);\r\n this.SVGImage.setAttribute('y', `0px`);\r\n this.SVGImage.setAttribute('width', `${this.width}px`);\r\n this.SVGImage.setAttribute('height', `${this.height}px`);\r\n }\r\n }\r\n\r\n private isDescendant(parent: Element, target: EventTarget): boolean {\r\n if (parent === target) {\r\n return true;\r\n }\r\n\r\n for (let i = 0; i < parent.children.length; i++) {\r\n if (this.isDescendant(parent.children[i], target)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n return (\r\n super.ownsTarget(el) ||\r\n (this.SVGImage !== undefined && this.isDescendant(this.SVGImage, el))\r\n );\r\n }\r\n\r\n public setSize(): void {\r\n super.setSize();\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['width', `${this.width}px`],\r\n ['height', `${this.height}px`],\r\n ]);\r\n this.adjustImage();\r\n }\r\n }\r\n\r\n public getState(): ImageMarkerBaseState {\r\n const result: ImageMarkerBaseState = Object.assign(\r\n {\r\n imageType: this.imageType,\r\n svgString: this.svgString,\r\n imageSrc: this.imageSrc,\r\n },\r\n super.getState(),\r\n );\r\n\r\n return result;\r\n }\r\n\r\n protected applyStrokeColor() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [['color', this._strokeColor]]);\r\n }\r\n }\r\n\r\n public restoreState(state: ImageMarkerBaseState): void {\r\n const imgState = state as ImageMarkerBaseState;\r\n if (imgState.imageType !== undefined) {\r\n this.imageType = imgState.imageType;\r\n }\r\n if (imgState.svgString !== undefined) {\r\n this._svgString = imgState.svgString;\r\n }\r\n if (imgState.imageSrc !== undefined) {\r\n this._imageSrc = imgState.imageSrc;\r\n }\r\n this.createVisual();\r\n super.restoreState(state);\r\n this.setSize();\r\n this.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.setSize();\r\n }\r\n}\r\n","import { ImageMarkerBase } from './ImageMarkerBase';\r\n\r\n/**\r\n * Used to represent user-set images.\r\n *\r\n * Use this marker to display custom images at runtime.\r\n * For example, you can use this type to represent emojis selected in an emoji picker.\r\n *\r\n * @summary Custom image marker.\r\n * @group Markers\r\n */\r\nexport class CustomImageMarker extends ImageMarkerBase {\r\n public static typeName = 'CustomImageMarker';\r\n public static title = 'Custom image marker';\r\n}\r\n","import { ImageMarkerBase } from './ImageMarkerBase';\r\n\r\n/**\r\n * Check mark marker.\r\n *\r\n * Represents a check mark image marker. Can be used to quickly mark something as correct, or\r\n * similar use cases.\r\n *\r\n * @summary Check mark image marker.\r\n * @group Markers\r\n */\r\nexport class CheckImageMarker extends ImageMarkerBase {\r\n public static typeName = 'CheckImageMarker';\r\n public static title = 'Check image marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this._svgString = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"><path d=\"M21.801 10A10 10 0 1 1 17 3.335\"/><path d=\"m9 11l3 3L22 4\"/></g></svg>`;\r\n this.strokeColor = '#008000';\r\n }\r\n}\r\n","import { ImageMarkerBase } from './ImageMarkerBase';\r\n\r\n/**\r\n * X mark image marker.\r\n *\r\n * @summary X (crossed) image marker.\r\n * @group Markers\r\n */\r\nexport class XImageMarker extends ImageMarkerBase {\r\n public static typeName = 'XImageMarker';\r\n public static title = 'X image marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this._svgString = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"m15 9l-6 6m0-6l6 6\"/></g></svg>`;\r\n this.strokeColor = '#d00000';\r\n }\r\n}\r\n","import { CaptionFrameMarkerState } from './CaptionFrameMarkerState';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\nimport { TextMarker } from './TextMarker';\r\n\r\n/**\r\n * Caption frame marker is a combination of a frame (rectangle) and a text caption that goes with it.\r\n *\r\n * @summary A combination of a frame (rectangle) and a text caption that goes with it.\r\n *\r\n * @group Markers\r\n */\r\nexport class CaptionFrameMarker extends TextMarker {\r\n public static typeName = 'CaptionFrameMarker';\r\n\r\n public static title = 'Caption frame marker';\r\n\r\n private _outerFrameVisual: SVGPathElement = SvgHelper.createPath('M0,0');\r\n private _captionFrameVisual: SVGPathElement = SvgHelper.createPath('M0,0');\r\n private _frameVisual: SVGGElement = SvgHelper.createGroup();\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.color = '#ffffff';\r\n this.fillColor = '#ff0000';\r\n this.strokeColor = '#ff0000';\r\n this.strokeWidth = 3;\r\n this.padding = 5;\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n this.adjustFrameVisual = this.adjustFrameVisual.bind(this);\r\n this.getPaths = this.getPaths.bind(this);\r\n }\r\n\r\n protected applyStrokeColor() {\r\n SvgHelper.setAttributes(this._outerFrameVisual, [\r\n ['stroke', this._strokeColor],\r\n ]);\r\n SvgHelper.setAttributes(this._captionFrameVisual, [\r\n ['stroke', this._strokeColor],\r\n ]);\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n SvgHelper.setAttributes(this._outerFrameVisual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n SvgHelper.setAttributes(this._captionFrameVisual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n this.adjustTextPosition();\r\n this.adjustFrameVisual();\r\n }\r\n\r\n protected applyStrokeDasharray() {\r\n SvgHelper.setAttributes(this._outerFrameVisual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n SvgHelper.setAttributes(this._captionFrameVisual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyFillColor() {\r\n SvgHelper.setAttributes(this._captionFrameVisual, [\r\n ['fill', this._fillColor],\r\n ]);\r\n }\r\n\r\n /**\r\n * Returns the SVG path strings for the frame and the caption background.\r\n *\r\n * @param width\r\n * @param height\r\n * @returns SVG path strings for the frame and the caption background.\r\n */\r\n protected getPaths(\r\n width: number = this.width,\r\n height: number = this.height,\r\n ): { frame: string; caption: string } {\r\n const titleHeight =\r\n (this.textBlock.textSize?.height ?? 40) +\r\n this.padding * 2 +\r\n this.strokeWidth;\r\n return {\r\n frame: `M 0 0\r\n V ${height}\r\n H ${width}\r\n V 0\r\n Z`,\r\n caption: `M 0 0\r\n H ${width}\r\n V ${titleHeight}\r\n H 0\r\n Z`,\r\n };\r\n }\r\n\r\n public createVisual(): void {\r\n super.createVisual();\r\n\r\n const paths = this.getPaths();\r\n\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n this._outerFrameVisual = SvgHelper.createPath(paths.frame, [\r\n ['fill', 'transparent'],\r\n ['stroke', this._strokeColor],\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n this._captionFrameVisual = SvgHelper.createPath(paths.caption, [\r\n ['fill', 'this._fillColor'],\r\n ['fill-rule', 'evenodd'],\r\n ['stroke', this._strokeColor],\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n this._frameVisual.appendChild(this._outerFrameVisual);\r\n this._frameVisual.appendChild(this._captionFrameVisual);\r\n this.visual?.insertBefore(this._frameVisual, this.textBlock.textElement);\r\n }\r\n\r\n public adjustVisual(): void {\r\n super.adjustVisual();\r\n\r\n this.adjustTextPosition();\r\n this.adjustFrameVisual();\r\n }\r\n\r\n /**\r\n * Adjusts text position inside the caption frame.\r\n */\r\n protected adjustTextPosition(): void {\r\n if (this.textBlock.textSize) {\r\n this.textBlock.textElement.style.transform = `translate(${\r\n this.width / 2 - this.textBlock.textSize?.width / 2 - this.padding\r\n }px, ${this.strokeWidth / 2}px)`;\r\n }\r\n }\r\n\r\n /**\r\n * Adjusts frame visual according to the current marker properties.\r\n */\r\n protected adjustFrameVisual(): void {\r\n const paths = this.getPaths();\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n\r\n if (this._outerFrameVisual) {\r\n SvgHelper.setAttributes(this._outerFrameVisual, [\r\n ['d', paths.frame],\r\n ['stroke', this._strokeColor],\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n if (this._captionFrameVisual) {\r\n SvgHelper.setAttributes(this._captionFrameVisual, [\r\n ['d', paths.caption],\r\n ['fill', this._fillColor],\r\n ['stroke', this._strokeColor],\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (\r\n super.ownsTarget(el) ||\r\n this._outerFrameVisual === el ||\r\n this._captionFrameVisual === el\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public setSize(): void {\r\n super.setSize();\r\n this.adjustTextPosition();\r\n this.adjustFrameVisual();\r\n }\r\n protected setSizeFromTextSize(): void {}\r\n\r\n /**\r\n * Hides the marker visual.\r\n *\r\n * Used by the editor to hide rendered marker while editing the text.\r\n */\r\n public hideVisual(): void {\r\n this.textBlock.hide();\r\n }\r\n /**\r\n * Shows the marker visual.\r\n *\r\n * Used by the editor to show rendered marker after editing the text.\r\n */\r\n public showVisual() {\r\n this.textBlock.show();\r\n this.textBlock.renderText();\r\n }\r\n\r\n public getState(): CaptionFrameMarkerState {\r\n const result: CaptionFrameMarkerState = Object.assign(\r\n {\r\n fillColor: this.fillColor,\r\n },\r\n super.getState(),\r\n );\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n const captionState = state as CaptionFrameMarkerState;\r\n super.restoreState(state);\r\n this.fillColor = captionState.fillColor;\r\n\r\n this.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.strokeWidth *= (scaleX + scaleY) / 2;\r\n\r\n this.setSize();\r\n }\r\n}\r\n","import { CurveMarkerState } from './CurveMarkerState';\r\nimport { LineMarker } from './LineMarker';\r\n\r\n/**\r\n * Curve marker represents a curved line.\r\n *\r\n * @summary Curve marker.\r\n * @group Markers\r\n */\r\nexport class CurveMarker extends LineMarker {\r\n public static typeName = 'CurveMarker';\r\n public static title = 'Curve marker';\r\n\r\n /**\r\n * x coordinate for the curve control point.\r\n */\r\n public curveX = 0;\r\n /**\r\n * y coordinate for the curve control point.\r\n */\r\n public curveY = 0;\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.fillColor = 'transparent';\r\n }\r\n\r\n protected getPath(): string {\r\n const result = `M ${this.x1} ${this.y1} Q ${this.curveX} ${this.curveY}, ${this.x2} ${this.y2}`;\r\n return result;\r\n }\r\n\r\n public getState(): CurveMarkerState {\r\n const result: CurveMarkerState = Object.assign(\r\n {\r\n curveX: this.curveX,\r\n curveY: this.curveY,\r\n },\r\n super.getState(),\r\n );\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: CurveMarkerState): void {\r\n this.curveX = state.curveX;\r\n this.curveY = state.curveY;\r\n\r\n super.restoreState(state);\r\n }\r\n}\r\n","import { FreehandMarker } from './FreehandMarker';\r\n\r\n/**\r\n * Highlighter marker imitates a freeform highlighter pen.\r\n *\r\n * @summary Semi-transparent freeform marker.\r\n * @group Markers\r\n * @since 3.2.0\r\n */\r\nexport class HighlighterMarker extends FreehandMarker {\r\n public static typeName = 'HighlighterMarker';\r\n public static title = 'Highlighter marker';\r\n public static applyDefaultFilter = false;\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.opacity = 0.5;\r\n this.strokeColor = '#ffff00';\r\n this.strokeWidth = 20;\r\n }\r\n}\r\n","import { SvgHelper } from './SvgHelper';\r\n\r\n/**\r\n * A set of common SVG filters that can be used to make markers more legible\r\n * or just for visual effect.\r\n */\r\nexport class SvgFilters {\r\n /**\r\n * Returns a set of default filters that can be used to make markers more legible.\r\n * @returns array of SVG filters.\r\n */\r\n public static getDefaultFilterSet(): SVGFilterElement[] {\r\n const dsFilter = SvgHelper.createFilter(\r\n 'dropShadow',\r\n [\r\n ['x', '-20%'],\r\n ['y', '-20%'],\r\n ['width', '140%'],\r\n ['height', '140%'],\r\n ],\r\n `<feDropShadow dx=\"2\" dy=\"2\" stdDeviation=\"2\" flood-color=\"rgba(0,0,0,0.8)\"/>`,\r\n );\r\n\r\n const outlineFilter = SvgHelper.createFilter(\r\n 'outline',\r\n [\r\n ['x', '-5%'],\r\n ['y', '-5%'],\r\n ['width', '110%'],\r\n ['height', '110%'],\r\n ],\r\n `<feMorphology operator=\"dilate\" radius=\"2\" in=\"SourceAlpha\" result=\"expanded\"/>\r\n <feFlood flood-color=\"white\" flood-opacity=\"1\"/>\r\n <feComposite in2=\"expanded\" operator=\"in\"/>\r\n <feComposite in=\"SourceGraphic\" operator=\"over\"/>`,\r\n );\r\n\r\n const glowFilter = SvgHelper.createFilter(\r\n 'glow',\r\n [\r\n ['x', '-50%'],\r\n ['y', '-50%'],\r\n ['width', '200%'],\r\n ['height', '200%'],\r\n ],\r\n `<feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"3\" result=\"blur\"/>\r\n <feFlood flood-color=\"#ffffff\" flood-opacity=\"1\"/>\r\n <feComposite in2=\"blur\" operator=\"in\"/>\r\n <feMerge>\r\n <feMergeNode/>\r\n <feMergeNode in=\"SourceGraphic\"/>\r\n </feMerge>`,\r\n );\r\n\r\n return [dsFilter, outlineFilter, glowFilter];\r\n }\r\n}\r\n","import { IPoint, MarkerBase, MarkerBaseState, SvgHelper } from '../core';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\n\r\n/**\r\n * Represents marker's state (status) in time.\r\n */\r\nexport type MarkerEditorState =\r\n | 'new'\r\n | 'creating'\r\n | 'select'\r\n | 'move'\r\n | 'resize'\r\n | 'rotate'\r\n | 'edit';\r\n\r\n/**\r\n * Marker creation style defines whether markers are created by drawing them or just dropping them on the canvas.\r\n */\r\nexport type MarkerCreationStyle = 'draw' | 'drop';\r\n\r\n/**\r\n * Base class for all marker editors.\r\n *\r\n * @typeParam TMarkerType - marker type the instance of the editor is for.\r\n *\r\n * @summary Base class for all marker editors.\r\n * @group Editors\r\n */\r\nexport class MarkerBaseEditor<TMarkerType extends MarkerBase = MarkerBase> {\r\n /**\r\n * Marker type constructor.\r\n */\r\n protected _markerType: new (container: SVGGElement) => TMarkerType;\r\n\r\n /**\r\n * Marker creation style.\r\n *\r\n * Markers can either be created by drawing them or just dropping them on the canvas.\r\n */\r\n protected _creationStyle: MarkerCreationStyle = 'draw';\r\n /**\r\n * Marker creation style.\r\n *\r\n * Markers can either be created by drawing them or just dropping them on the canvas.\r\n */\r\n public get creationStyle(): MarkerCreationStyle {\r\n return this._creationStyle;\r\n }\r\n\r\n /**\r\n * Type guard for specific marker editor types.\r\n *\r\n * This allows to check if the editor is of a specific type which is useful for displaying type-specific UI.\r\n *\r\n * @typeParam T - specific marker editor type.\r\n * @param cls\r\n * @returns\r\n */\r\n public is<T>(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cls: new (...args: any[]) => T,\r\n ): this is T {\r\n return this instanceof cls;\r\n }\r\n\r\n /**\r\n * Marker instance.\r\n */\r\n protected _marker: TMarkerType;\r\n\r\n /**\r\n * Returns the marker instance.\r\n */\r\n public get marker(): TMarkerType {\r\n return this._marker;\r\n }\r\n\r\n /**\r\n * SVG container for the marker's and editor's visual elements.\r\n */\r\n protected _container: SVGGElement;\r\n /**\r\n * Returns the SVG container for the marker's and editor's visual elements.\r\n */\r\n public get container(): SVGGElement {\r\n return this._container;\r\n }\r\n\r\n /**\r\n * Overlay container for HTML elements like text editors, etc.\r\n */\r\n protected _overlayContainer: HTMLDivElement;\r\n /**\r\n * Overlay container for HTML elements like text editors, etc.\r\n */\r\n public get overlayContainer(): HTMLDivElement {\r\n return this._overlayContainer;\r\n }\r\n\r\n /**\r\n * Editor's state.\r\n */\r\n protected _state: MarkerEditorState = 'new';\r\n /**\r\n * Gets editor's state.\r\n */\r\n public get state(): MarkerEditorState {\r\n return this._state;\r\n }\r\n /**\r\n * Sets editor's state.\r\n */\r\n public set state(value: MarkerEditorState) {\r\n this._state = value;\r\n }\r\n\r\n /**\r\n * SVG group holding editor's control box.\r\n */\r\n protected _controlBox = SvgHelper.createGroup();\r\n\r\n /**\r\n * Method called when marker creation is finished.\r\n */\r\n public onMarkerCreated?: <T extends MarkerBaseEditor<MarkerBase>>(\r\n editor: T,\r\n ) => void;\r\n\r\n /**\r\n * Method to call when marker state changes.\r\n */\r\n public onStateChanged?: <T extends MarkerBaseEditor<MarkerBase>>(\r\n editor: T,\r\n ) => void;\r\n\r\n /**\r\n * Marker's state when it is selected\r\n */\r\n protected manipulationStartState?: string;\r\n\r\n /**\r\n * Is this marker selected?\r\n */\r\n protected _isSelected = false;\r\n\r\n /**\r\n * Returns true if the marker is currently selected\r\n */\r\n public get isSelected(): boolean {\r\n return this._isSelected;\r\n }\r\n\r\n /**\r\n * When set to true, a new marker of the same type is created immediately after the current one is finished.\r\n */\r\n protected _continuousCreation = false;\r\n /**\r\n * When set to true, a new marker of the same type is created immediately after the current one is finished.\r\n */\r\n public get continuousCreation() {\r\n return this._continuousCreation;\r\n }\r\n\r\n /**\r\n * Sets marker's stroke (outline) color.\r\n * @param color - color as string\r\n */\r\n public set strokeColor(color: string) {\r\n this.marker.strokeColor = color;\r\n }\r\n\r\n /**\r\n * Gets marker's stroke (outline) color.\r\n */\r\n public get strokeColor(): string {\r\n return this.marker.strokeColor;\r\n }\r\n\r\n /**\r\n * Sets marker's stroke (outline) width.\r\n * @param width - stroke width in pixels.\r\n */\r\n public set strokeWidth(width: number) {\r\n this.marker.strokeWidth = width;\r\n this.adjustControlBox();\r\n this.stateChanged();\r\n }\r\n\r\n /**\r\n * Gets marker's stroke (outline) width.\r\n */\r\n public get strokeWidth(): number {\r\n return this.marker.strokeWidth;\r\n }\r\n\r\n /**\r\n * Sets marker's stroke (outline) dash array.\r\n * @param dashes - dash array as string\r\n */\r\n public set strokeDasharray(dashes: string) {\r\n this.marker.strokeDasharray = dashes;\r\n this.stateChanged();\r\n }\r\n\r\n /**\r\n * Gets marker's stroke (outline) dash array.\r\n */\r\n public get strokeDasharray(): string {\r\n return this.marker.strokeDasharray;\r\n }\r\n\r\n /**\r\n * Sets marker's fill color.\r\n */\r\n public set fillColor(color: string) {\r\n this.marker.fillColor = color;\r\n }\r\n\r\n /**\r\n * Gets marker's fill color.\r\n */\r\n public get fillColor(): string {\r\n return this.marker.fillColor;\r\n }\r\n\r\n /**\r\n * Sets marker's opacity.\r\n */\r\n public set opacity(value: number) {\r\n this.marker.opacity = value;\r\n }\r\n\r\n /**\r\n * Gets marker's opacity.\r\n */\r\n public get opacity(): number {\r\n return this.marker.opacity;\r\n }\r\n\r\n /**\r\n * Sets marker's notes.\r\n */\r\n public set notes(value: string | undefined) {\r\n this.marker.notes = value;\r\n }\r\n\r\n /**\r\n * Gets marker's notes.\r\n */\r\n public get notes(): string | undefined {\r\n return this.marker.notes;\r\n }\r\n\r\n /**\r\n * Creates a new instance of marker editor.\r\n *\r\n * @param properties - marker editor properties.\r\n */\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n this._container = properties.container;\r\n this._overlayContainer = properties.overlayContainer;\r\n this._markerType = properties.markerType;\r\n this._marker =\r\n properties.marker ?? new properties.markerType(properties.container);\r\n\r\n this.select = this.select.bind(this);\r\n this.deselect = this.deselect.bind(this);\r\n this.ownsTarget = this.ownsTarget.bind(this);\r\n this.adjustControlBox = this.adjustControlBox.bind(this);\r\n this.stateChanged = this.stateChanged.bind(this);\r\n this.scale = this.scale.bind(this);\r\n this.dispose = this.dispose.bind(this);\r\n this.pointerDown = this.pointerDown.bind(this);\r\n this.pointerUp = this.pointerUp.bind(this);\r\n this.manipulate = this.manipulate.bind(this);\r\n this.dblClick = this.dblClick.bind(this);\r\n }\r\n\r\n /**\r\n * Returns true if the marker or the editor owns supplied target element.\r\n *\r\n * @param el target element\r\n * @returns\r\n */\r\n public ownsTarget(el: EventTarget | null): boolean {\r\n let found = false;\r\n if (el !== null) {\r\n if (this._marker?.ownsTarget(el)) {\r\n found = true;\r\n }\r\n }\r\n return found;\r\n }\r\n\r\n /**\r\n * Is this marker selected in a multi-selection?\r\n */\r\n protected isMultiSelected = false;\r\n /**\r\n * Selects this marker and displays appropriate selected marker UI.\r\n */\r\n public select(multi = false): void {\r\n this.isMultiSelected = multi;\r\n this.container.style.cursor = 'move';\r\n this._isSelected = true;\r\n this.manipulationStartState = JSON.stringify(this._marker.getState());\r\n //console.log('manipulationStartState', this.manipulationStartState);\r\n }\r\n\r\n /**\r\n * Deselects this marker and hides selected marker UI.\r\n */\r\n public deselect(): void {\r\n this.container.style.cursor = 'default';\r\n this._isSelected = false;\r\n this.stateChanged();\r\n }\r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) down event.\r\n *\r\n * @param point - event coordinates.\r\n * @param target - direct event target element.\r\n * @param ev - pointer event.\r\n */\r\n // prettier-ignore\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function\r\n public pointerDown(point: IPoint, target?: EventTarget, ev?: PointerEvent): void {}\r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) double click event.\r\n *\r\n * @param point - event coordinates.\r\n * @param target - direct event target element.\r\n * @param ev - pointer event.\r\n */\r\n // prettier-ignore\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function\r\n public dblClick(point: IPoint, target?: EventTarget, ev?: MouseEvent): void {}\r\n\r\n /**\r\n * Handles marker manipulation (move, resize, rotate, etc.).\r\n *\r\n * @param point - event coordinates.\r\n * @param ev - pointer event.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function\r\n public manipulate(point: IPoint, ev?: PointerEvent): void {}\r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) up event.\r\n *\r\n * @param point - event coordinates.\r\n * @param ev - pointer event.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function\r\n public pointerUp(point: IPoint, ev?: PointerEvent): void {}\r\n\r\n /**\r\n * Disposes the marker and clean's up.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n public dispose(): void {}\r\n\r\n /**\r\n * Adjusts marker's control box.\r\n */\r\n protected adjustControlBox() {}\r\n\r\n /**\r\n * Scales the marker and the editor.\r\n *\r\n * @param scaleX\r\n * @param scaleY\r\n */\r\n public scale(scaleX: number, scaleY: number): void {\r\n this._marker.scale(scaleX, scaleY);\r\n\r\n this.adjustControlBox();\r\n }\r\n\r\n /**\r\n * Called by a marker when its state could have changed.\r\n * Does a check if the state has indeed changed before firing the handler.\r\n */\r\n protected stateChanged(): void {\r\n if (\r\n this.onStateChanged &&\r\n this.state !== 'creating' &&\r\n this.state !== 'new'\r\n ) {\r\n const currentState = JSON.stringify(this._marker.getState());\r\n // console.log('currentState', currentState);\r\n // @todo - check if this is needed\r\n // avoid reacting to state (mode) differences\r\n // if (this.manipulationStartState !== undefined) {\r\n // this.manipulationStartState.state = 'select';\r\n // }\r\n // currentState.state = 'select';\r\n if (this.manipulationStartState != currentState) {\r\n this.manipulationStartState = currentState;\r\n this.onStateChanged(this);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Returns marker's state that can be restored in the future.\r\n *\r\n * @returns\r\n */\r\n public getState(): MarkerBaseState {\r\n return this.marker.getState();\r\n }\r\n\r\n /**\r\n * Restores previously saved marker state.\r\n *\r\n * @param state - previously saved state.\r\n */\r\n public restoreState(state: MarkerBaseState): void {\r\n this._state = 'select';\r\n this.marker.restoreState(state);\r\n this.adjustControlBox();\r\n }\r\n}\r\n","import { SvgHelper } from '../core/SvgHelper';\r\n\r\n/**\r\n * Represents location of the manipulation grips.\r\n */\r\nexport type GripLocation =\r\n | 'topleft'\r\n | 'topcenter'\r\n | 'topright'\r\n | 'leftcenter'\r\n | 'rightcenter'\r\n | 'bottomleft'\r\n | 'bottomcenter'\r\n | 'bottomright';\r\n\r\n/**\r\n * Represents a single resize-manipulation grip used in marker's manipulation controls.\r\n */\r\nexport class Grip {\r\n /**\r\n * Grip's visual element.\r\n */\r\n protected _visual?: SVGGraphicsElement;\r\n /**\r\n * Grip's visual element.\r\n */\r\n public get visual(): SVGGraphicsElement {\r\n if (!this._visual) {\r\n this.createVisual();\r\n }\r\n return this._visual!;\r\n }\r\n\r\n /**\r\n * Grip's size (radius).\r\n */\r\n public gripSize = 5;\r\n\r\n /**\r\n * Grip's fill color.\r\n */\r\n public fillColor = 'rgba(255,255,255,0.9)';\r\n /**\r\n * Grip's stroke color.\r\n */\r\n public strokeColor = '#0ea5e9';\r\n\r\n /**\r\n * Creates a new grip.\r\n */\r\n constructor() {\r\n this.createVisual = this.createVisual.bind(this);\r\n }\r\n\r\n /**\r\n * Creates grip's visual.\r\n */\r\n protected createVisual() {\r\n this._visual = SvgHelper.createGroup();\r\n this._visual.appendChild(\r\n SvgHelper.createCircle(this.gripSize * 2, [\r\n ['fill', 'transparent'],\r\n ['cx', (this.gripSize / 2).toString()],\r\n ['cy', (this.gripSize / 2).toString()],\r\n ]),\r\n );\r\n const visual = SvgHelper.createCircle(this.gripSize, [\r\n ['fill-opacity', '1'],\r\n ['stroke-width', '1'],\r\n ['stroke-opacity', '1'],\r\n ]);\r\n visual.style.fill = `var(--mjs-grip-fill, ${this.fillColor})`;\r\n visual.style.stroke = `var(--mjs-grip-stroke, ${this.strokeColor})`;\r\n visual.style.filter = 'drop-shadow(0px 0px 2px rgba(0, 0, 0, .7))';\r\n this._visual.appendChild(visual);\r\n }\r\n\r\n /**\r\n * Returns true if passed SVG element belongs to the grip. False otherwise.\r\n *\r\n * @param el - target element.\r\n */\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (el === this._visual) {\r\n return true;\r\n } else {\r\n let found = false;\r\n this._visual?.childNodes.forEach((child) => {\r\n if (child === el) {\r\n found = true;\r\n }\r\n });\r\n return found;\r\n }\r\n }\r\n}\r\n","import { Grip } from './Grip';\r\n\r\n/**\r\n * Represents a resize grip.\r\n */\r\nexport class ResizeGrip extends Grip {}\r\n","import { IPoint, PolygonMarker, SvgHelper } from '../core';\r\nimport { MarkerBaseEditor } from './MarkerBaseEditor';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { ResizeGrip } from './ResizeGrip';\r\n\r\n/**\r\n * Editor for polygon markers.\r\n *\r\n * @summary Polygon marker editor.\r\n * @group Editors\r\n */\r\nexport class PolygonMarkerEditor<\r\n TMarkerType extends PolygonMarker = PolygonMarker,\r\n> extends MarkerBaseEditor<TMarkerType> {\r\n /**\r\n * Default line length when marker is created with a simple click (without dragging).\r\n */\r\n protected defaultLength = 50;\r\n\r\n /**\r\n * Pointer X coordinate at the start of move or resize.\r\n */\r\n protected manipulationStartX = 0;\r\n /**\r\n * Pointer Y coordinate at the start of move or resize.\r\n */\r\n protected manipulationStartY = 0;\r\n\r\n /**\r\n * Container for control elements.\r\n */\r\n protected controlBox: SVGGElement = SvgHelper.createGroup();\r\n /**\r\n * Container for manipulation grips.\r\n */\r\n protected manipulationBox: SVGGElement = SvgHelper.createGroup();\r\n\r\n /**\r\n * Array of manipulation grips.\r\n */\r\n protected grips: ResizeGrip[] = [];\r\n /**\r\n * Active manipulation grip.\r\n */\r\n protected activeGrip?: ResizeGrip;\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this.ownsTarget = this.ownsTarget.bind(this);\r\n\r\n this.setupControlBox = this.setupControlBox.bind(this);\r\n this.adjustControlBox = this.adjustControlBox.bind(this);\r\n\r\n this.adjustControlGrips = this.adjustControlGrips.bind(this);\r\n this.createGrip = this.createGrip.bind(this);\r\n this.positionGrip = this.positionGrip.bind(this);\r\n this.positionGrips = this.positionGrips.bind(this);\r\n\r\n this.resize = this.resize.bind(this);\r\n\r\n this.manipulate = this.manipulate.bind(this);\r\n this.pointerDown = this.pointerDown.bind(this);\r\n this.pointerUp = this.pointerUp.bind(this);\r\n\r\n this.setupControlBox();\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this.marker.ownsTarget(el)) {\r\n return true;\r\n } else if (this.grips.some((grip) => grip.ownsTarget(el))) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public override pointerDown(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: PointerEvent,\r\n ): void {\r\n super.pointerDown(point, target, ev);\r\n\r\n this.manipulationStartX = point.x;\r\n this.manipulationStartY = point.y;\r\n\r\n if (this.state === 'new') {\r\n this.startCreation(point);\r\n } else if (this._state === 'creating') {\r\n if (this.grips.length > 0 && target && this.grips[0].ownsTarget(target)) {\r\n this.finishCreation();\r\n } else {\r\n this.addNewPointWhileCreating(point);\r\n }\r\n } else {\r\n this.select(this.isMultiSelected);\r\n this.activeGrip =\r\n target && this.grips.find((grip) => grip.ownsTarget(target));\r\n\r\n if (this.activeGrip) {\r\n this._state = 'resize';\r\n } else {\r\n this._state = 'move';\r\n }\r\n }\r\n }\r\n\r\n private startCreation(point: IPoint) {\r\n this.marker.stage = 'creating';\r\n this.marker.points.push(point);\r\n this.marker.points.push(point);\r\n this.marker.createVisual();\r\n this.marker.adjustVisual();\r\n this.adjustControlGrips();\r\n\r\n this.activeGrip = this.grips.at(-1);\r\n if (this.activeGrip) {\r\n this.activeGrip.visual.style.pointerEvents = 'none';\r\n }\r\n\r\n this._state = 'creating';\r\n }\r\n\r\n private addNewPointWhileCreating(point: IPoint) {\r\n this.marker.points.push(point);\r\n this.marker.adjustVisual();\r\n this.adjustControlGrips();\r\n this.activeGrip = this.grips.at(-1);\r\n if (this.activeGrip) {\r\n this.activeGrip.visual.style.pointerEvents = 'none';\r\n }\r\n }\r\n\r\n private finishCreation() {\r\n this.marker.stage = 'normal';\r\n // connected the last point with the first one\r\n // remove the first point and adjust grips\r\n this.marker.points.splice(0, 1);\r\n this.marker.adjustVisual();\r\n this.adjustControlGrips();\r\n this.grips.forEach((grip) => {\r\n grip.visual.style.pointerEvents = '';\r\n });\r\n\r\n this._state = 'select';\r\n if (this.onMarkerCreated) {\r\n this.onMarkerCreated(this);\r\n }\r\n }\r\n\r\n public override pointerUp(point: IPoint, ev?: PointerEvent): void {\r\n super.pointerUp(point, ev);\r\n this.manipulate(point, ev);\r\n if (this._state !== 'creating') {\r\n this._state = 'select';\r\n }\r\n this.stateChanged();\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public override manipulate(point: IPoint, ev?: PointerEvent): void {\r\n if (this.state === 'creating') {\r\n this.resize(point);\r\n } else if (this.state === 'move') {\r\n this.marker.points.forEach((p) => {\r\n p.x += point.x - this.manipulationStartX;\r\n p.y += point.y - this.manipulationStartY;\r\n });\r\n this.manipulationStartX = point.x;\r\n this.manipulationStartY = point.y;\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n } else if (this.state === 'resize') {\r\n this.resize(point);\r\n }\r\n }\r\n\r\n protected resize(point: IPoint): void {\r\n const activeGripIndex = this.activeGrip\r\n ? this.grips.indexOf(this.activeGrip)\r\n : -1;\r\n if (activeGripIndex >= 0) {\r\n this.marker.points[activeGripIndex] = point;\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n }\r\n }\r\n\r\n public override dblClick(\r\n point: IPoint,\r\n target?: EventTarget,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n ev?: MouseEvent,\r\n ): void {\r\n if (target && this.state === 'select') {\r\n const selectorLineIndex = this.marker.selectorVisualLines.findIndex(\r\n (l) => l === target,\r\n );\r\n if (selectorLineIndex > -1) {\r\n this.marker.points.splice(selectorLineIndex + 1, 0, point);\r\n this.marker.adjustVisual();\r\n this.adjustControlGrips();\r\n } else {\r\n const gripIndex = this.grips.findIndex((g) => g.ownsTarget(target));\r\n if (gripIndex > -1) {\r\n this.marker.points.splice(gripIndex, 1);\r\n this.marker.adjustVisual();\r\n this.adjustControlGrips();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates control box for manipulation controls.\r\n */\r\n protected setupControlBox(): void {\r\n this.controlBox = SvgHelper.createGroup();\r\n this.container.appendChild(this.controlBox);\r\n this.manipulationBox = SvgHelper.createGroup();\r\n this.controlBox.appendChild(this.manipulationBox);\r\n\r\n this.adjustControlGrips();\r\n\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n protected adjustControlBox() {\r\n // this.positionGrips();\r\n this.adjustControlGrips();\r\n }\r\n\r\n /**\r\n * Adds control grips to control box.\r\n */\r\n protected adjustControlGrips(): void {\r\n const noOfMissingGrips = this.marker.points.length - this.grips.length;\r\n if (noOfMissingGrips > 0) {\r\n for (let i = 0; i < noOfMissingGrips; i++) {\r\n this.grips.push(this.createGrip());\r\n }\r\n } else if (noOfMissingGrips < 0) {\r\n for (let i = 0; i < -noOfMissingGrips; i++) {\r\n const grip = this.grips.pop();\r\n if (grip) {\r\n this.manipulationBox.removeChild(grip.visual);\r\n }\r\n }\r\n }\r\n\r\n this.positionGrips();\r\n }\r\n\r\n /**\r\n * Creates manipulation grip.\r\n * @returns - manipulation grip.\r\n */\r\n protected createGrip(): ResizeGrip {\r\n const grip = new ResizeGrip();\r\n grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n this.manipulationBox.appendChild(grip.visual);\r\n\r\n return grip;\r\n }\r\n\r\n /**\r\n * Updates manipulation grip layout.\r\n */\r\n protected positionGrips(): void {\r\n this.grips.forEach((grip, i) => {\r\n const point = this.marker.points[i];\r\n this.positionGrip(\r\n grip.visual,\r\n point.x - grip.gripSize / 2,\r\n point.y - grip.gripSize / 2,\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Positions manipulation grip.\r\n * @param grip - grip to position\r\n * @param x - new X coordinate\r\n * @param y - new Y coordinate\r\n */\r\n protected positionGrip(grip: SVGGraphicsElement, x: number, y: number): void {\r\n const translate = grip.transform.baseVal.getItem(0);\r\n translate.setTranslate(x, y);\r\n grip.transform.baseVal.replaceItem(translate, 0);\r\n }\r\n\r\n public select(multi = false): void {\r\n super.select(multi);\r\n this.adjustControlBox();\r\n this.manipulationBox.style.display = multi ? 'none' : '';\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n public deselect(): void {\r\n super.deselect();\r\n this.controlBox.style.display = 'none';\r\n if (this.state === 'creating') {\r\n this.finishCreation();\r\n }\r\n }\r\n}\r\n","import { IPoint, LinearMarkerBase, SvgHelper } from '../core';\r\nimport { MarkerBaseEditor } from './MarkerBaseEditor';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { ResizeGrip } from './ResizeGrip';\r\n\r\n/**\r\n * Editor for linear markers.\r\n *\r\n * @summary Editor for line-like markers.\r\n * @group Editors\r\n */\r\nexport class LinearMarkerEditor<\r\n TMarkerType extends LinearMarkerBase = LinearMarkerBase,\r\n> extends MarkerBaseEditor<TMarkerType> {\r\n /**\r\n * Default line length when marker is created with a simple click (without dragging).\r\n */\r\n protected defaultLength = 50;\r\n\r\n /**\r\n * Pointer X coordinate at the start of move or resize.\r\n */\r\n protected manipulationStartX = 0;\r\n /**\r\n * Pointer Y coordinate at the start of move or resize.\r\n */\r\n protected manipulationStartY = 0;\r\n\r\n private manipulationStartX1 = 0;\r\n private manipulationStartY1 = 0;\r\n private manipulationStartX2 = 0;\r\n private manipulationStartY2 = 0;\r\n\r\n /**\r\n * Container for manipulation grips.\r\n */\r\n protected manipulationBox: SVGGElement = SvgHelper.createGroup();\r\n\r\n /**\r\n * First manipulation grip\r\n */\r\n protected grip1?: ResizeGrip;\r\n /**\r\n * Second manipulation grip.\r\n */\r\n protected grip2?: ResizeGrip;\r\n /**\r\n * Active manipulation grip.\r\n */\r\n protected activeGrip?: ResizeGrip;\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this.ownsTarget = this.ownsTarget.bind(this);\r\n\r\n this.setupControlBox = this.setupControlBox.bind(this);\r\n this.adjustControlBox = this.adjustControlBox.bind(this);\r\n\r\n this.addControlGrips = this.addControlGrips.bind(this);\r\n this.createGrip = this.createGrip.bind(this);\r\n this.positionGrip = this.positionGrip.bind(this);\r\n this.positionGrips = this.positionGrips.bind(this);\r\n\r\n this.resize = this.resize.bind(this);\r\n\r\n this.manipulate = this.manipulate.bind(this);\r\n this.pointerDown = this.pointerDown.bind(this);\r\n this.pointerUp = this.pointerUp.bind(this);\r\n\r\n this.setupControlBox();\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this.marker.ownsTarget(el)) {\r\n return true;\r\n } else if (this.grip1?.ownsTarget(el) || this.grip2?.ownsTarget(el)) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public override pointerDown(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: PointerEvent,\r\n ): void {\r\n super.pointerDown(point, target, ev);\r\n\r\n this.manipulationStartX = point.x;\r\n this.manipulationStartY = point.y;\r\n\r\n if (this.state === 'new') {\r\n this.marker.x1 = point.x;\r\n this.marker.y1 = point.y;\r\n this.marker.x2 = point.x;\r\n this.marker.y2 = point.y;\r\n }\r\n\r\n this.manipulationStartX1 = this.marker.x1;\r\n this.manipulationStartY1 = this.marker.y1;\r\n this.manipulationStartX2 = this.marker.x2;\r\n this.manipulationStartY2 = this.marker.y2;\r\n\r\n if (this.state === 'new') {\r\n this.marker.createVisual();\r\n this.marker.adjustVisual();\r\n\r\n this._state = 'creating';\r\n } else {\r\n this.select(this.isMultiSelected);\r\n if (target && this.grip1?.ownsTarget(target)) {\r\n this.activeGrip = this.grip1;\r\n } else if (target && this.grip2?.ownsTarget(target)) {\r\n this.activeGrip = this.grip2;\r\n } else {\r\n this.activeGrip = undefined;\r\n }\r\n\r\n if (this.activeGrip) {\r\n this._state = 'resize';\r\n } else {\r\n this._state = 'move';\r\n }\r\n }\r\n }\r\n\r\n public override pointerUp(point: IPoint, ev?: PointerEvent): void {\r\n const inState = this.state;\r\n super.pointerUp(point, ev);\r\n if (\r\n this.state === 'creating' &&\r\n Math.abs(this.marker.x1 - this.marker.x2) < 10 &&\r\n Math.abs(this.marker.y1 - this.marker.y2) < 10\r\n ) {\r\n this.marker.x2 = this.marker.x1 + this.defaultLength;\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n } else {\r\n this.manipulate(point, ev);\r\n }\r\n this._state = 'select';\r\n if (inState === 'creating' && this.onMarkerCreated) {\r\n this.onMarkerCreated(this);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public override manipulate(point: IPoint, ev?: PointerEvent): void {\r\n if (this.state === 'creating') {\r\n this.resize(point);\r\n } else if (this.state === 'move') {\r\n this.marker.x1 =\r\n this.manipulationStartX1 + point.x - this.manipulationStartX;\r\n this.marker.y1 =\r\n this.manipulationStartY1 + point.y - this.manipulationStartY;\r\n this.marker.x2 =\r\n this.manipulationStartX2 + point.x - this.manipulationStartX;\r\n this.marker.y2 =\r\n this.manipulationStartY2 + point.y - this.manipulationStartY;\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n } else if (this.state === 'resize') {\r\n this.resize(point);\r\n }\r\n }\r\n\r\n protected resize(point: IPoint): void {\r\n switch (this.activeGrip) {\r\n case this.grip1:\r\n this.marker.x1 = point.x;\r\n this.marker.y1 = point.y;\r\n break;\r\n case this.grip2:\r\n case undefined:\r\n this.marker.x2 = point.x;\r\n this.marker.y2 = point.y;\r\n break;\r\n }\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n }\r\n\r\n /**\r\n * Creates control box for manipulation controls.\r\n */\r\n protected setupControlBox(): void {\r\n this.container.appendChild(this._controlBox);\r\n this.manipulationBox = SvgHelper.createGroup();\r\n this._controlBox.appendChild(this.manipulationBox);\r\n\r\n this.addControlGrips();\r\n\r\n this._controlBox.style.display = 'none';\r\n }\r\n\r\n protected adjustControlBox() {\r\n this.positionGrips();\r\n }\r\n\r\n /**\r\n * Adds control grips to control box.\r\n */\r\n protected addControlGrips(): void {\r\n this.grip1 = this.createGrip();\r\n this.grip2 = this.createGrip();\r\n\r\n this.positionGrips();\r\n }\r\n\r\n /**\r\n * Creates manipulation grip.\r\n * @returns - manipulation grip.\r\n */\r\n protected createGrip(): ResizeGrip {\r\n const grip = new ResizeGrip();\r\n grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n this.manipulationBox.appendChild(grip.visual);\r\n\r\n return grip;\r\n }\r\n\r\n /**\r\n * Updates manipulation grip layout.\r\n */\r\n protected positionGrips(): void {\r\n if (this.grip1 && this.grip2) {\r\n const gripSize = this.grip1.gripSize;\r\n\r\n this.positionGrip(\r\n this.grip1.visual,\r\n this.marker.x1 - gripSize / 2,\r\n this.marker.y1 - gripSize / 2,\r\n );\r\n this.positionGrip(\r\n this.grip2.visual,\r\n this.marker.x2 - gripSize / 2,\r\n this.marker.y2 - gripSize / 2,\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Positions manipulation grip.\r\n * @param grip - grip to position\r\n * @param x - new X coordinate\r\n * @param y - new Y coordinate\r\n */\r\n protected positionGrip(grip: SVGGraphicsElement, x: number, y: number): void {\r\n const translate = grip.transform.baseVal.getItem(0);\r\n translate.setTranslate(x, y);\r\n grip.transform.baseVal.replaceItem(translate, 0);\r\n }\r\n\r\n public select(multi = false): void {\r\n super.select(multi);\r\n this.adjustControlBox();\r\n this.manipulationBox.style.display = multi ? 'none' : '';\r\n this._controlBox.style.display = '';\r\n }\r\n\r\n public deselect(): void {\r\n super.deselect();\r\n this._controlBox.style.display = 'none';\r\n }\r\n}\r\n","import { GripLocation } from './Grip';\r\nimport { ResizeGrip } from './ResizeGrip';\r\n\r\n/**\r\n * RectangularBoxMarkerGrips is a set of resize/rotation grips for a rectangular marker.\r\n */\r\nexport class RectangularBoxMarkerGrips {\r\n public grips = new Map<GripLocation, ResizeGrip>([\r\n ['topleft', new ResizeGrip()],\r\n ['topcenter', new ResizeGrip()],\r\n ['topright', new ResizeGrip()],\r\n ['leftcenter', new ResizeGrip()],\r\n ['rightcenter', new ResizeGrip()],\r\n ['bottomleft', new ResizeGrip()],\r\n ['bottomcenter', new ResizeGrip()],\r\n ['bottomright', new ResizeGrip()],\r\n ]);\r\n /**\r\n * Creates a new marker grip set.\r\n */\r\n constructor() {\r\n this.findGripByVisual = this.findGripByVisual.bind(this);\r\n }\r\n\r\n /**\r\n * Returns a marker grip owning the specified visual.\r\n * @param gripVisual - visual for owner to be determined.\r\n */\r\n public findGripByVisual(gripVisual: EventTarget): ResizeGrip | undefined {\r\n for (const grip of this.grips.values()) {\r\n if (grip.ownsTarget(gripVisual)) {\r\n return grip;\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Returns a grip by its location.\r\n * @param location\r\n * @returns\r\n */\r\n public getGrip(location: GripLocation): ResizeGrip {\r\n return this.grips.get(location)!;\r\n }\r\n}\r\n","import { Grip } from './Grip';\r\n\r\n/**\r\n * Represents a rotation grip.\r\n */\r\nexport class RotateGrip extends Grip {\r\n constructor() {\r\n super();\r\n // swap fill and stroke colors\r\n const oldFill = this.fillColor;\r\n this.fillColor = this.strokeColor;\r\n this.strokeColor = oldFill;\r\n }\r\n}\r\n","import { IPoint, RectangularBoxMarkerBase, SvgHelper } from '../core';\r\nimport { Grip, GripLocation } from './Grip';\r\nimport { MarkerBaseEditor } from './MarkerBaseEditor';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { RectangularBoxMarkerGrips } from './RectangularBoxMarkerGrips';\r\nimport { RotateGrip } from './RotateGrip';\r\n\r\n/**\r\n * Base editor for markers that can be represented by a rectangular area.\r\n *\r\n * @summary Base editor for markers that can be represented by a rectangular area.\r\n * @group Editors\r\n */\r\nexport class RectangularBoxMarkerBaseEditor<\r\n TMarkerType extends RectangularBoxMarkerBase = RectangularBoxMarkerBase,\r\n> extends MarkerBaseEditor<TMarkerType> {\r\n /**\r\n * x coordinate of the top-left corner at the start of manipulation.\r\n */\r\n protected manipulationStartLeft = 0;\r\n /**\r\n * y coordinate of the top-left corner at the start of manipulation.\r\n */\r\n protected manipulationStartTop = 0;\r\n /**\r\n * Width at the start of manipulation.\r\n */\r\n protected manipulationStartWidth = 0;\r\n /**\r\n * Height at the start of manipulation.\r\n */\r\n protected manipulationStartHeight = 0;\r\n\r\n /**\r\n * x coordinate of the pointer at the start of manipulation.\r\n */\r\n protected manipulationStartX = 0;\r\n /**\r\n * y coordinate of the pointer at the start of manipulation.\r\n */\r\n protected manipulationStartY = 0;\r\n\r\n /**\r\n * Pointer's horizontal distance from the top left corner.\r\n */\r\n protected offsetX = 0;\r\n /**\r\n * Pointer's vertical distance from the top left corner.\r\n */\r\n protected offsetY = 0;\r\n\r\n /**\r\n * Container for the marker's editing controls.\r\n */\r\n protected controlBox = SvgHelper.createGroup();\r\n /**\r\n * Container for the marker's manipulation grips.\r\n */\r\n protected manipulationBox = SvgHelper.createGroup();\r\n private readonly CB_DISTANCE: number = 0;\r\n private controlRect?: SVGRectElement;\r\n private rotatorGripLine?: SVGLineElement;\r\n\r\n private controlGrips: RectangularBoxMarkerGrips =\r\n new RectangularBoxMarkerGrips();\r\n /**\r\n * Array of disabled resize grips.\r\n *\r\n * Use this in derived classes to disable specific resize grips.\r\n */\r\n protected disabledResizeGrips: GripLocation[] = [];\r\n private rotatorGrip?: RotateGrip;\r\n /**\r\n * Active grip during manipulation\r\n */\r\n protected activeGrip?: Grip;\r\n private disableRotation = false;\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this.setupControlBox();\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this._marker.ownsTarget(el)) {\r\n return true;\r\n } else if (\r\n this.controlGrips?.findGripByVisual(el) !== undefined ||\r\n (this.rotatorGrip !== undefined && this.rotatorGrip.ownsTarget(el))\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public override pointerDown(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: PointerEvent,\r\n ): void {\r\n super.pointerDown(point, target, ev);\r\n\r\n if (this.state === 'new') {\r\n this.marker.left = point.x;\r\n this.marker.top = point.y;\r\n }\r\n\r\n this.manipulationStartLeft = this.marker.left;\r\n this.manipulationStartTop = this.marker.top;\r\n this.manipulationStartWidth = this.marker.width;\r\n this.manipulationStartHeight = this.marker.height;\r\n\r\n const rotatedPoint = this.marker.unrotatePoint(point);\r\n this.manipulationStartX = rotatedPoint.x;\r\n this.manipulationStartY = rotatedPoint.y;\r\n\r\n this.offsetX = rotatedPoint.x - this.marker.left;\r\n this.offsetY = rotatedPoint.y - this.marker.top;\r\n\r\n if (this.state !== 'new') {\r\n this.select(this.isMultiSelected);\r\n this.activeGrip = this.controlGrips?.findGripByVisual(\r\n target as SVGGraphicsElement,\r\n );\r\n if (this.activeGrip !== undefined) {\r\n this._state = 'resize';\r\n } else if (\r\n this.rotatorGrip !== undefined &&\r\n target !== undefined &&\r\n this.rotatorGrip.ownsTarget(target)\r\n ) {\r\n this.activeGrip = this.rotatorGrip;\r\n\r\n const rotatedCenter = this.marker.rotatePoint({\r\n x: this.marker.centerX,\r\n y: this.marker.centerY,\r\n });\r\n this.marker.left = rotatedCenter.x - this.marker.width / 2;\r\n this.marker.top = rotatedCenter.y - this.marker.height / 2;\r\n this.marker.moveVisual({ x: this.marker.left, y: this.marker.top });\r\n\r\n const rotate = this.container.transform.baseVal.getItem(0);\r\n rotate.setRotate(\r\n this.marker.rotationAngle,\r\n this.marker.centerX,\r\n this.marker.centerY,\r\n );\r\n this.container.transform.baseVal.replaceItem(rotate, 0);\r\n\r\n this.adjustControlBox();\r\n\r\n this._state = 'rotate';\r\n } else {\r\n this._state = 'move';\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * When set to true marker created event will not be triggered.\r\n */\r\n protected _suppressMarkerCreateEvent = false;\r\n\r\n public override pointerUp(point: IPoint, ev?: PointerEvent): void {\r\n const inState = this.state;\r\n super.pointerUp(point, ev);\r\n if (\r\n this.state === 'creating' &&\r\n this.marker.width < 10 &&\r\n this.marker.height < 10\r\n ) {\r\n this.marker.width = this.marker.defaultSize.width;\r\n this.marker.height = this.marker.defaultSize.height;\r\n } else {\r\n this.manipulate(point, ev);\r\n }\r\n this._state = 'select';\r\n if (\r\n inState === 'creating' &&\r\n this.onMarkerCreated &&\r\n this._suppressMarkerCreateEvent === false\r\n ) {\r\n this.onMarkerCreated(this);\r\n }\r\n this.stateChanged();\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public override manipulate(point: IPoint, ev?: PointerEvent): void {\r\n const rotatedPoint = this.marker.unrotatePoint(point);\r\n\r\n if (this.state === 'creating') {\r\n this.resize(point, ev?.shiftKey);\r\n } else if (this.state === 'move') {\r\n this.marker.left =\r\n this.manipulationStartLeft +\r\n (rotatedPoint.x - this.manipulationStartLeft) -\r\n this.offsetX;\r\n this.marker.top =\r\n this.manipulationStartTop +\r\n (rotatedPoint.y - this.manipulationStartTop) -\r\n this.offsetY;\r\n this.marker.moveVisual({ x: this.marker.left, y: this.marker.top });\r\n this.adjustControlBox();\r\n } else if (this.state === 'resize') {\r\n this.resize(rotatedPoint, ev?.shiftKey);\r\n } else if (this.state === 'rotate') {\r\n this.marker.rotate(point);\r\n }\r\n }\r\n\r\n protected resize(point: IPoint, preserveAspectRatio = false): void {\r\n let newX = this.manipulationStartLeft;\r\n let newWidth = this.manipulationStartWidth;\r\n let newY = this.manipulationStartTop;\r\n let newHeight = this.manipulationStartHeight;\r\n\r\n const deltaX = point.x - this.manipulationStartX;\r\n const deltaY = point.y - this.manipulationStartY;\r\n if (preserveAspectRatio) {\r\n const aspectRatio =\r\n this.manipulationStartWidth !== 0 && this.manipulationStartHeight !== 0\r\n ? this.manipulationStartWidth / this.manipulationStartHeight\r\n : 1;\r\n switch (this.activeGrip) {\r\n // undefined when creating a new marker\r\n case this.controlGrips.getGrip('bottomright'):\r\n case undefined: {\r\n newWidth = this.manipulationStartWidth + Math.max(deltaX, deltaY);\r\n newHeight =\r\n this.manipulationStartHeight +\r\n Math.max(deltaX, deltaY) / aspectRatio;\r\n break;\r\n }\r\n case this.controlGrips.getGrip('bottomcenter'): {\r\n newWidth = this.manipulationStartWidth + deltaY;\r\n newHeight = this.manipulationStartHeight + deltaY / aspectRatio;\r\n newX = this.manipulationStartLeft - deltaY / 2;\r\n break;\r\n }\r\n case this.controlGrips.getGrip('bottomleft'): {\r\n newWidth = this.manipulationStartWidth + Math.max(-deltaX, deltaY);\r\n newHeight =\r\n this.manipulationStartHeight +\r\n Math.max(-deltaX, deltaY) / aspectRatio;\r\n newX = this.manipulationStartLeft - Math.max(-deltaX, deltaY);\r\n break;\r\n }\r\n case this.controlGrips.getGrip('leftcenter'): {\r\n newWidth = this.manipulationStartWidth - deltaX;\r\n newHeight = this.manipulationStartHeight - deltaX / aspectRatio;\r\n newX = this.manipulationStartLeft + deltaX;\r\n newY = this.manipulationStartTop + deltaX / aspectRatio / 2;\r\n break;\r\n }\r\n case this.controlGrips.getGrip('topleft'): {\r\n newWidth = this.manipulationStartWidth + Math.max(-deltaX, -deltaY);\r\n newHeight =\r\n this.manipulationStartHeight +\r\n Math.max(-deltaX, -deltaY) / aspectRatio;\r\n newX = this.manipulationStartLeft - Math.max(-deltaX, -deltaY);\r\n newY =\r\n this.manipulationStartTop -\r\n Math.max(-deltaX, -deltaY) / aspectRatio;\r\n break;\r\n }\r\n case this.controlGrips.getGrip('topcenter'): {\r\n newWidth = this.manipulationStartWidth - deltaY;\r\n newHeight = this.manipulationStartHeight - deltaY / aspectRatio;\r\n newX = this.manipulationStartLeft + deltaY / 2;\r\n newY = this.manipulationStartTop + deltaY / aspectRatio;\r\n break;\r\n }\r\n case this.controlGrips.getGrip('topright'): {\r\n newWidth = this.manipulationStartWidth + Math.max(deltaX, -deltaY);\r\n newHeight =\r\n this.manipulationStartHeight +\r\n Math.max(deltaX, -deltaY) / aspectRatio;\r\n newY =\r\n this.manipulationStartTop - Math.max(deltaX, -deltaY) / aspectRatio;\r\n break;\r\n }\r\n case this.controlGrips.getGrip('rightcenter'): {\r\n newWidth = this.manipulationStartWidth + deltaX;\r\n newHeight = this.manipulationStartHeight + deltaX / aspectRatio;\r\n newY = this.manipulationStartTop - deltaX / aspectRatio / 2;\r\n break;\r\n }\r\n }\r\n } else {\r\n // free form resizing\r\n switch (this.activeGrip) {\r\n case this.controlGrips.getGrip('bottomleft'):\r\n case this.controlGrips.getGrip('leftcenter'):\r\n case this.controlGrips.getGrip('topleft'):\r\n newX = this.manipulationStartLeft + point.x - this.manipulationStartX;\r\n newWidth =\r\n this.manipulationStartWidth + this.manipulationStartLeft - newX;\r\n break;\r\n case this.controlGrips.getGrip('bottomright'):\r\n case this.controlGrips.getGrip('rightcenter'):\r\n case this.controlGrips.getGrip('topright'):\r\n case undefined:\r\n newWidth =\r\n this.manipulationStartWidth + point.x - this.manipulationStartX;\r\n break;\r\n }\r\n\r\n switch (this.activeGrip) {\r\n case this.controlGrips.getGrip('topcenter'):\r\n case this.controlGrips.getGrip('topleft'):\r\n case this.controlGrips.getGrip('topright'):\r\n newY = this.manipulationStartTop + point.y - this.manipulationStartY;\r\n newHeight =\r\n this.manipulationStartHeight + this.manipulationStartTop - newY;\r\n break;\r\n case this.controlGrips.getGrip('bottomcenter'):\r\n case this.controlGrips.getGrip('bottomleft'):\r\n case this.controlGrips.getGrip('bottomright'):\r\n case undefined:\r\n newHeight =\r\n this.manipulationStartHeight + point.y - this.manipulationStartY;\r\n break;\r\n }\r\n }\r\n\r\n if (newWidth >= 0) {\r\n this.marker.left = newX;\r\n this.marker.width = newWidth;\r\n } else {\r\n this.marker.left = newX + newWidth;\r\n this.marker.width = -newWidth;\r\n }\r\n if (newHeight >= 0) {\r\n this.marker.top = newY;\r\n this.marker.height = newHeight;\r\n } else {\r\n this.marker.top = newY + newHeight;\r\n this.marker.height = -newHeight;\r\n }\r\n\r\n this.setSize();\r\n }\r\n\r\n /**\r\n * Sets control box size and location.\r\n */\r\n protected setSize(): void {\r\n this.marker.setSize();\r\n this.adjustControlBox();\r\n }\r\n\r\n public select(multi = false): void {\r\n super.select(multi);\r\n this.adjustControlBox();\r\n this.manipulationBox.style.display = multi ? 'none' : '';\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n public deselect(): void {\r\n super.deselect();\r\n this.controlBox.style.display = 'none';\r\n }\r\n\r\n /**\r\n * Creates control box for manipulation controls.\r\n */\r\n protected setupControlBox() {\r\n this.controlBox = SvgHelper.createGroup();\r\n const translate = SvgHelper.createTransform();\r\n translate.setTranslate(-this.CB_DISTANCE / 2, -this.CB_DISTANCE / 2);\r\n this.controlBox.transform.baseVal.appendItem(translate);\r\n\r\n this.container.appendChild(this.controlBox);\r\n\r\n this.manipulationBox = SvgHelper.createGroup();\r\n this.controlBox.appendChild(this.manipulationBox);\r\n\r\n this.controlRect = SvgHelper.createRect(\r\n this.marker.width + this.CB_DISTANCE,\r\n this.marker.height + this.CB_DISTANCE,\r\n [\r\n ['stroke', 'black'],\r\n ['stroke-width', '1'],\r\n ['stroke-opacity', '0.5'],\r\n ['stroke-dasharray', '3, 2'],\r\n ['fill', 'transparent'],\r\n ['pointer-events', 'none'],\r\n ],\r\n );\r\n\r\n this.controlBox.appendChild(this.controlRect);\r\n\r\n if (this.disableRotation !== true) {\r\n this.rotatorGripLine = SvgHelper.createLine(\r\n (this.marker.width + this.CB_DISTANCE * 2) / 2,\r\n this.marker.top - this.CB_DISTANCE,\r\n (this.marker.width + this.CB_DISTANCE * 2) / 2,\r\n this.marker.top - this.CB_DISTANCE * 3,\r\n [\r\n ['stroke', 'black'],\r\n ['stroke-width', '1'],\r\n ['stroke-opacity', '0.5'],\r\n ['stroke-dasharray', '3, 2'],\r\n ],\r\n );\r\n this.rotatorGripLine.style.filter =\r\n 'drop-shadow(rgba(255, 255, 255, 0.7) 0px 2px 0px)';\r\n\r\n this.manipulationBox.appendChild(this.rotatorGripLine);\r\n }\r\n\r\n this.controlGrips = new RectangularBoxMarkerGrips();\r\n this.addControlGrips();\r\n\r\n this.controlBox.style.display = 'none';\r\n }\r\n\r\n /**\r\n * Adjusts control box size and location.\r\n */\r\n protected adjustControlBox() {\r\n const translate = this.controlBox.transform.baseVal.getItem(0);\r\n translate.setTranslate(\r\n this.marker.left - this.CB_DISTANCE / 2,\r\n this.marker.top - this.CB_DISTANCE / 2,\r\n );\r\n this.controlBox.transform.baseVal.replaceItem(translate, 0);\r\n this.controlRect?.setAttribute(\r\n 'width',\r\n (this.marker.width + this.CB_DISTANCE).toString(),\r\n );\r\n this.controlRect?.setAttribute(\r\n 'height',\r\n (this.marker.height + this.CB_DISTANCE).toString(),\r\n );\r\n\r\n if (this.rotatorGripLine !== undefined) {\r\n this.rotatorGripLine.setAttribute(\r\n 'x1',\r\n ((this.marker.width + this.CB_DISTANCE) / 2).toString(),\r\n );\r\n this.rotatorGripLine.setAttribute(\r\n 'y1',\r\n (-this.CB_DISTANCE / 2).toString(),\r\n );\r\n this.rotatorGripLine.setAttribute(\r\n 'x2',\r\n ((this.marker.width + this.CB_DISTANCE) / 2).toString(),\r\n );\r\n this.rotatorGripLine.setAttribute(\r\n 'y2',\r\n (-Math.max(this.CB_DISTANCE * 3, 30)).toString(),\r\n );\r\n }\r\n\r\n this.positionGrips();\r\n }\r\n\r\n /**\r\n * Adds control grips to control box.\r\n */\r\n protected addControlGrips() {\r\n for (const grip of this.controlGrips.grips.values()) {\r\n grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n this.manipulationBox.appendChild(grip.visual);\r\n\r\n this.manipulationBox.appendChild(grip.visual);\r\n }\r\n\r\n if (this.disableRotation !== true) {\r\n this.rotatorGrip = this.createRotateGrip();\r\n }\r\n\r\n this.positionGrips();\r\n }\r\n\r\n // private createResizeGrip(): ResizeGrip {\r\n // const grip = new ResizeGrip();\r\n // grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n // this.controlBox.appendChild(grip.visual);\r\n\r\n // return grip;\r\n // }\r\n\r\n private createRotateGrip(): RotateGrip {\r\n const grip = new RotateGrip();\r\n grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n this.manipulationBox.appendChild(grip.visual);\r\n\r\n return grip;\r\n }\r\n\r\n /**\r\n * Updates manipulation grip layout.\r\n */\r\n protected positionGrips() {\r\n if (this.controlGrips !== undefined) {\r\n const gripSize = this.controlGrips.getGrip('topleft').gripSize ?? 0;\r\n\r\n const left = -gripSize / 2;\r\n const top = left;\r\n const cx = (this.marker.width + this.CB_DISTANCE) / 2 - gripSize / 2;\r\n const cy = (this.marker.height + this.CB_DISTANCE) / 2 - gripSize / 2;\r\n const bottom = this.marker.height + this.CB_DISTANCE - gripSize / 2;\r\n const right = this.marker.width + this.CB_DISTANCE - gripSize / 2;\r\n\r\n this.positionGrip(this.controlGrips.getGrip('topleft').visual, left, top);\r\n this.positionGrip(this.controlGrips.getGrip('topcenter').visual, cx, top);\r\n this.positionGrip(\r\n this.controlGrips.getGrip('topright').visual,\r\n right,\r\n top,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('leftcenter').visual,\r\n left,\r\n cy,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('rightcenter').visual,\r\n right,\r\n cy,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('bottomleft').visual,\r\n left,\r\n bottom,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('bottomcenter').visual,\r\n cx,\r\n bottom,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('bottomright').visual,\r\n right,\r\n bottom,\r\n );\r\n\r\n if (this.rotatorGrip !== undefined) {\r\n const rotatorGripSize = this.rotatorGrip.gripSize ?? 0;\r\n const rtop = -rotatorGripSize / 2;\r\n const rcx =\r\n (this.marker.width + this.CB_DISTANCE) / 2 - rotatorGripSize / 2;\r\n\r\n this.positionGrip(\r\n this.rotatorGrip.visual,\r\n rcx,\r\n rtop - Math.max(this.CB_DISTANCE * 3, 30),\r\n );\r\n }\r\n }\r\n this.adjustGripVisibility();\r\n }\r\n\r\n /**\r\n * Positions specific grip.\r\n * @param grip\r\n * @param x\r\n * @param y\r\n */\r\n protected positionGrip(\r\n grip: SVGGraphicsElement | undefined,\r\n x: number,\r\n y: number,\r\n ) {\r\n if (grip !== undefined) {\r\n const translate = grip.transform.baseVal.getItem(0);\r\n translate.setTranslate(x, y);\r\n grip.transform.baseVal.replaceItem(translate, 0);\r\n }\r\n }\r\n\r\n /**\r\n * Hides marker's editing controls.\r\n */\r\n protected hideControlBox(): void {\r\n this.controlBox.style.display = 'none';\r\n }\r\n /**\r\n * Shows marker's editing controls.\r\n */\r\n protected showControlBox(): void {\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n /**\r\n * Adjusts visibility of resize grips.\r\n */\r\n protected adjustGripVisibility() {\r\n for (const location of this.disabledResizeGrips) {\r\n const grip = this.controlGrips.getGrip(location);\r\n if (grip !== undefined) {\r\n grip.visual.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.adjustControlBox();\r\n }\r\n}\r\n","import { IPoint, ShapeOutlineMarkerBase } from '../core';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { RectangularBoxMarkerBaseEditor } from './RectangularBoxMarkerBaseEditor';\r\n\r\n/**\r\n * Editor for shape outline markers.\r\n *\r\n * @summary Shape outline (unfilled shape) marker editor.\r\n * @group Editors\r\n */\r\nexport class ShapeOutlineMarkerEditor<\r\n TMarkerType extends ShapeOutlineMarkerBase = ShapeOutlineMarkerBase,\r\n> extends RectangularBoxMarkerBaseEditor<TMarkerType> {\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this._creationStyle = 'draw';\r\n }\r\n\r\n public override pointerDown(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: PointerEvent,\r\n ): void {\r\n super.pointerDown(point, target, ev);\r\n if (this.state === 'new') {\r\n this.marker.createVisual();\r\n\r\n this.marker.moveVisual(point);\r\n\r\n this._state = 'creating';\r\n }\r\n }\r\n\r\n protected resize(point: IPoint, preserveAspectRatio = false): void {\r\n super.resize(point, preserveAspectRatio);\r\n this.setSize();\r\n }\r\n\r\n public override pointerUp(point: IPoint, ev?: PointerEvent): void {\r\n super.pointerUp(point, ev);\r\n this.setSize();\r\n }\r\n}\r\n","/**\r\n * Manages undo and redo stacks.\r\n */\r\nexport class UndoRedoManager<T> {\r\n private undoStack: T[] = [];\r\n private redoStack: T[] = [];\r\n\r\n private lastRedoStep?: T;\r\n\r\n /**\r\n * Returns true if there are items in the undo stack.\r\n */\r\n public get isUndoPossible(): boolean {\r\n return this.undoStack.length > 0;\r\n }\r\n\r\n /**\r\n * Returns true if there are items in the redo stack.\r\n */\r\n public get isRedoPossible(): boolean {\r\n return this.redoStack.length > 0;\r\n }\r\n\r\n /**\r\n * Returns the number of items in the undo stack\r\n */\r\n public get undoStepCount(): number {\r\n return this.undoStack.length;\r\n }\r\n\r\n /**\r\n * Returns the number of items in the redo stack\r\n */\r\n public get redoStepCount(): number {\r\n return this.redoStack.length;\r\n }\r\n\r\n /**\r\n * Adds a step to the undo stack.\r\n * @param stepData data representing a state.\r\n */\r\n public addUndoStep(stepData: T): boolean {\r\n if (\r\n this.undoStack.length === 0 ||\r\n JSON.stringify(this.undoStack[this.undoStack.length - 1]) !==\r\n JSON.stringify(stepData)\r\n ) {\r\n this.undoStack.push(JSON.parse(JSON.stringify(stepData)));\r\n if (JSON.stringify(this.lastRedoStep) !== JSON.stringify(stepData)) {\r\n this.redoStack.splice(0, this.redoStack.length);\r\n }\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Replaces the last undo step with step data provided\r\n * @param stepData data representing a state.\r\n */\r\n public replaceLastUndoStep(stepData: T): void {\r\n if (this.undoStack.length > 0) {\r\n this.undoStack[this.undoStack.length - 1] = JSON.parse(\r\n JSON.stringify(stepData),\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Returns the last step in the undo log\r\n */\r\n public getLastUndoStep(): T | undefined {\r\n if (this.undoStack.length > 0) {\r\n return this.undoStack[this.undoStack.length - 1];\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Returns data for the previous step in the undo stack and adds last step to the redo stack.\r\n * @returns\r\n */\r\n public undo(): T | undefined {\r\n if (this.undoStack.length > 1) {\r\n const lastStep = this.undoStack.pop();\r\n if (lastStep !== undefined) {\r\n this.redoStack.push(lastStep);\r\n }\r\n return this.undoStack.length > 0\r\n ? this.undoStack[this.undoStack.length - 1]\r\n : undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Returns most recent item in the redo stack.\r\n * @returns\r\n */\r\n public redo(): T | undefined {\r\n this.lastRedoStep = this.redoStack.pop();\r\n if (this.lastRedoStep !== undefined) {\r\n this.undoStack.push(this.lastRedoStep);\r\n }\r\n return this.lastRedoStep;\r\n }\r\n}\r\n","import { FreehandMarker, IPoint, SvgHelper } from '../core';\r\nimport { MarkerBaseEditor } from './MarkerBaseEditor';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\n\r\n/**\r\n * Editor for freehand markers.\r\n *\r\n * @summary Freehand marker editor.\r\n * @group Editors\r\n */\r\nexport class FreehandMarkerEditor<\r\n TMarkerType extends FreehandMarker = FreehandMarker,\r\n> extends MarkerBaseEditor<TMarkerType> {\r\n /**\r\n * Pointer X coordinate at the start of move or resize.\r\n */\r\n protected manipulationStartX = 0;\r\n /**\r\n * Pointer Y coordinate at the start of move or resize.\r\n */\r\n protected manipulationStartY = 0;\r\n\r\n /**\r\n * Container for control elements.\r\n */\r\n protected controlBox: SVGGElement = SvgHelper.createGroup();\r\n private controlRect?: SVGRectElement;\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this._continuousCreation = true;\r\n\r\n this.ownsTarget = this.ownsTarget.bind(this);\r\n\r\n this.setupControlBox = this.setupControlBox.bind(this);\r\n this.adjustControlBox = this.adjustControlBox.bind(this);\r\n\r\n this.manipulate = this.manipulate.bind(this);\r\n this.pointerDown = this.pointerDown.bind(this);\r\n this.pointerUp = this.pointerUp.bind(this);\r\n\r\n this.setupControlBox();\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (\r\n super.ownsTarget(el) ||\r\n this.marker.ownsTarget(el) ||\r\n el === this.controlRect\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public override pointerDown(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: PointerEvent,\r\n ): void {\r\n super.pointerDown(point, target, ev);\r\n\r\n this.manipulationStartX = point.x;\r\n this.manipulationStartY = point.y;\r\n\r\n if (this.state === 'new') {\r\n this.startCreation(point);\r\n } else if (this.state !== 'move') {\r\n this.select();\r\n this._state = 'move';\r\n }\r\n }\r\n\r\n private startCreation(point: IPoint) {\r\n this.marker.stage = 'creating';\r\n this.marker.points.push(point);\r\n this.marker.createVisual();\r\n this.marker.adjustVisual();\r\n this._state = 'creating';\r\n }\r\n\r\n private addNewPointWhileCreating(point: IPoint) {\r\n this.marker.points.push(point);\r\n this.marker.adjustVisual();\r\n }\r\n\r\n private finishCreation() {\r\n this.marker.stage = 'normal';\r\n this.marker.adjustVisual();\r\n this._state = 'select';\r\n if (this.onMarkerCreated) {\r\n this.onMarkerCreated(this);\r\n }\r\n }\r\n\r\n public override pointerUp(point: IPoint, ev?: PointerEvent): void {\r\n super.pointerUp(point, ev);\r\n this.manipulate(point, ev);\r\n if (this._state === 'creating') {\r\n this.finishCreation();\r\n }\r\n this.state = 'select';\r\n this.stateChanged();\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public override manipulate(point: IPoint, ev?: PointerEvent): void {\r\n if (this.state === 'creating') {\r\n this.addNewPointWhileCreating(point);\r\n } else if (this.state === 'move') {\r\n this.marker.points.forEach((p) => {\r\n p.x += point.x - this.manipulationStartX;\r\n p.y += point.y - this.manipulationStartY;\r\n });\r\n this.manipulationStartX = point.x;\r\n this.manipulationStartY = point.y;\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n }\r\n }\r\n\r\n /**\r\n * Creates control box for manipulation controls.\r\n */\r\n protected setupControlBox(): void {\r\n this.controlBox = SvgHelper.createGroup();\r\n this.container.appendChild(this.controlBox);\r\n\r\n this.controlRect = SvgHelper.createRect(0, 0, [\r\n ['stroke', 'black'],\r\n ['stroke-width', '1'],\r\n ['stroke-opacity', '0.5'],\r\n ['stroke-dasharray', '3, 2'],\r\n ['fill', 'transparent'],\r\n ]);\r\n\r\n this.controlBox.appendChild(this.controlRect);\r\n\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n protected adjustControlBox() {\r\n const left = Math.min(...this.marker.points.map((p) => p.x));\r\n const top = Math.min(...this.marker.points.map((p) => p.y));\r\n const right = Math.max(...this.marker.points.map((p) => p.x));\r\n const bottom = Math.max(...this.marker.points.map((p) => p.y));\r\n\r\n if (this.controlRect) {\r\n SvgHelper.setAttributes(this.controlRect, [\r\n ['x', (left - this.strokeWidth).toString()],\r\n ['y', (top - this.strokeWidth).toString()],\r\n ['width', (right - left + this.strokeWidth * 2).toString()],\r\n ['height', (bottom - top + this.strokeWidth * 2).toString()],\r\n ]);\r\n }\r\n }\r\n\r\n public select(): void {\r\n super.select();\r\n this.adjustControlBox();\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n public deselect(): void {\r\n super.deselect();\r\n this.controlBox.style.display = 'none';\r\n }\r\n}\r\n","/**\r\n * Text changed event handler type.\r\n */\r\nexport type TextChangedHandler = (text: string) => void;\r\n\r\n/**\r\n * Blur event handler type.\r\n */\r\nexport type BlurHandler = () => void;\r\n\r\n/**\r\n * Represents a text block editor element.\r\n */\r\nexport class TextBlockEditor {\r\n private textEditor: HTMLDivElement;\r\n private isInFocus = false;\r\n\r\n private _width = 0;\r\n /**\r\n * Returns editor width in pixels.\r\n */\r\n public get width() {\r\n return this._width;\r\n }\r\n /**\r\n * Sets editor width in pixels.\r\n */\r\n public set width(value) {\r\n this._width = value;\r\n this.textEditor.style.width = `${this.width}px`;\r\n }\r\n\r\n private _height = 0;\r\n /**\r\n * Returns editor height in pixels.\r\n */\r\n public get height() {\r\n return this._height;\r\n }\r\n /**\r\n * Sets editor height in pixels.\r\n */\r\n public set height(value) {\r\n this._height = value;\r\n this.textEditor.style.height = `${this.height}px`;\r\n }\r\n\r\n private _left = 0;\r\n /**\r\n * Returns the horizontal (X) location of the editor's left corner (in pixels).\r\n */\r\n public get left() {\r\n return this._left;\r\n }\r\n /**\r\n * Sets the horizontal (X) location of the editor's left corner (in pixels).\r\n */\r\n public set left(value) {\r\n this._left = value;\r\n this.textEditor.style.left = `${this.left}px`;\r\n }\r\n\r\n private _top = 0;\r\n /**\r\n * Returns the vertical (Y) location of the editor's top left corner (in pixels).\r\n */\r\n public get top() {\r\n return this._top;\r\n }\r\n /**\r\n * Sets the vertical (Y) location of the editor's top left corner (in pixels).\r\n */\r\n public set top(value) {\r\n this._top = value;\r\n this.textEditor.style.top = `${this.top}px`;\r\n }\r\n\r\n private _text = '';\r\n /**\r\n * Returns the text block text.\r\n */\r\n public get text() {\r\n return this._text;\r\n }\r\n /**\r\n * Sets the text block text.\r\n */\r\n public set text(value) {\r\n this._text = value;\r\n }\r\n\r\n private _fontFamily = 'sans-serif';\r\n /**\r\n * Returns text block's font family.\r\n */\r\n public get fontFamily() {\r\n return this._fontFamily;\r\n }\r\n /**\r\n * Sets the text block's font family.\r\n */\r\n public set fontFamily(value) {\r\n this._fontFamily = value;\r\n this.textEditor.style.fontFamily = this._fontFamily;\r\n }\r\n\r\n private _fontSize = '1rem';\r\n /**\r\n * Returns text block's font size.\r\n */\r\n public get fontSize() {\r\n return this._fontSize;\r\n }\r\n /**\r\n * Sets text block's font size.\r\n */\r\n public set fontSize(value) {\r\n this._fontSize = value;\r\n this.textEditor.style.fontSize = this._fontSize;\r\n }\r\n\r\n private _textColor = '#000';\r\n /**\r\n * Returns text block's font color.\r\n */\r\n public get textColor() {\r\n return this._textColor;\r\n }\r\n /**\r\n * Returns text block's font color.\r\n */\r\n public set textColor(value) {\r\n this._textColor = value;\r\n this.textEditor.style.color = this.textColor;\r\n }\r\n\r\n private _bgColor = 'transparent';\r\n /**\r\n * Returns text block's background color.\r\n */\r\n public get bgColor() {\r\n return this._bgColor;\r\n }\r\n /**\r\n * Sets text block's background color.\r\n */\r\n public set bgColor(value) {\r\n this._bgColor = value;\r\n this.textEditor.style.backgroundColor = this.bgColor;\r\n }\r\n\r\n /**\r\n * Text changed event handler.\r\n */\r\n public onTextChanged?: TextChangedHandler;\r\n\r\n /**\r\n * Blur event handler.\r\n */\r\n public onBlur?: BlurHandler;\r\n\r\n /**\r\n * Creates a new text block editor instance.\r\n */\r\n constructor() {\r\n this.textEditor = document.createElement('div');\r\n\r\n this.getEditorUi = this.getEditorUi.bind(this);\r\n this.focus = this.focus.bind(this);\r\n this.setup = this.setup.bind(this);\r\n }\r\n\r\n private isSetupCompleted = false;\r\n private setup() {\r\n // this.textEditor.style.position = 'absolute';\r\n this.textEditor.style.pointerEvents = 'auto';\r\n this.textEditor.style.display = 'flex';\r\n this.textEditor.style.flexDirection = 'column';\r\n this.textEditor.style.alignItems = 'center';\r\n this.textEditor.style.justifyContent = 'center';\r\n this.textEditor.style.width = `${this._width}px`;\r\n this.textEditor.style.height = `${this._height}px`;\r\n this.textEditor.style.overflow = 'hidden';\r\n this.textEditor.style.textAlign = 'center';\r\n this.textEditor.style.fontFamily = this._fontFamily;\r\n this.textEditor.style.fontSize = this._fontSize;\r\n this.textEditor.style.lineHeight = '1em';\r\n if (this._text !== '') {\r\n this.textEditor.innerText = this._text;\r\n } else {\r\n this.textEditor.innerHTML = ' ';\r\n }\r\n this.textEditor.contentEditable = 'true';\r\n this.textEditor.style.outline = 'none';\r\n this.textEditor.style.color = this._textColor;\r\n this.textEditor.style.whiteSpace = 'pre';\r\n this.textEditor.addEventListener('pointerdown', (ev) => {\r\n ev.stopPropagation();\r\n });\r\n this.textEditor.addEventListener('pointerup', (ev) => {\r\n ev.stopPropagation();\r\n });\r\n this.textEditor.addEventListener('keydown', (ev) => {\r\n if (ev.key === 'Escape') {\r\n ev.preventDefault();\r\n this.textEditor.blur();\r\n }\r\n });\r\n this.textEditor.addEventListener('keyup', (ev) => {\r\n ev.cancelBubble = true;\r\n this._text = this.textEditor.innerText;\r\n if (this.onTextChanged !== undefined) {\r\n this.onTextChanged(this._text);\r\n }\r\n });\r\n this.textEditor.addEventListener('blur', () => {\r\n this._text = this.textEditor.innerText;\r\n if (this.onTextChanged !== undefined) {\r\n this.onTextChanged(this._text);\r\n }\r\n if (this.onBlur !== undefined) {\r\n this.onBlur();\r\n }\r\n });\r\n this.textEditor.addEventListener('paste', (ev) => {\r\n if (ev.clipboardData) {\r\n // paste plain text\r\n const content = ev.clipboardData.getData('text');\r\n const selection = window.getSelection();\r\n if (!selection || !selection.rangeCount) return false;\r\n selection.deleteFromDocument();\r\n selection.getRangeAt(0).insertNode(document.createTextNode(content));\r\n ev.preventDefault();\r\n }\r\n });\r\n\r\n this.isSetupCompleted = true;\r\n }\r\n\r\n /**\r\n * Returns editor's UI,\r\n * @returns UI in a div element.\r\n */\r\n public getEditorUi(): HTMLDivElement {\r\n if (!this.isSetupCompleted) {\r\n this.setup();\r\n }\r\n\r\n return this.textEditor;\r\n }\r\n\r\n /**\r\n * Focuses text editing in the editor.\r\n */\r\n public focus() {\r\n this.textEditor.focus();\r\n\r\n // position cursor at the end of the text\r\n const range = document.createRange();\r\n range.selectNodeContents(this.textEditor);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection?.removeAllRanges();\r\n selection?.addRange(range);\r\n }\r\n /**\r\n * Unfocuses the editor.\r\n */\r\n public blur() {\r\n this.textEditor.blur();\r\n }\r\n}\r\n","import { FontSize, IPoint, SvgHelper, TextMarker } from '../core';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { RectangularBoxMarkerBaseEditor } from './RectangularBoxMarkerBaseEditor';\r\nimport { TextBlockEditor } from './TextBlockEditor';\r\n\r\n/**\r\n * Editor for text markers.\r\n *\r\n * @summary Text marker editor.\r\n * @group Editors\r\n */\r\nexport class TextMarkerEditor<\r\n TMarkerType extends TextMarker = TextMarker,\r\n> extends RectangularBoxMarkerBaseEditor<TMarkerType> {\r\n /**\r\n * Container for text block editor.\r\n */\r\n protected textBlockEditorContainer: SVGForeignObjectElement =\r\n SvgHelper.createForeignObject();\r\n /**\r\n * Text block editor.\r\n */\r\n protected textBlockEditor: TextBlockEditor;\r\n\r\n /**\r\n * Text color.\r\n */\r\n public set color(color: string) {\r\n this.marker.color = color;\r\n this.stateChanged();\r\n }\r\n /**\r\n * Text color.\r\n */\r\n public get color(): string {\r\n return this.marker.color;\r\n }\r\n\r\n /**\r\n * Sets text's font family.\r\n */\r\n public set fontFamily(font: string) {\r\n this.marker.fontFamily = font;\r\n this.stateChanged();\r\n }\r\n /**\r\n * Returns text's font family.\r\n */\r\n public get fontFamily(): string {\r\n return this.marker.fontFamily;\r\n }\r\n\r\n /**\r\n * Sets text's font size.\r\n */\r\n public set fontSize(size: FontSize) {\r\n this.marker.fontSize = size;\r\n this.stateChanged();\r\n }\r\n /**\r\n * Returns text's font size.\r\n */\r\n public get fontSize(): FontSize {\r\n return this.marker.fontSize;\r\n }\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this.disabledResizeGrips = [\r\n 'topleft',\r\n 'topcenter',\r\n 'topright',\r\n 'bottomleft',\r\n 'bottomcenter',\r\n 'bottomright',\r\n 'leftcenter',\r\n 'rightcenter',\r\n ];\r\n\r\n this._creationStyle = 'drop';\r\n\r\n this.textBlockEditor = new TextBlockEditor();\r\n this.marker.onSizeChanged = this.markerSizeChanged;\r\n\r\n this.showEditor = this.showEditor.bind(this);\r\n this.hideEditor = this.hideEditor.bind(this);\r\n this.pointerDown = this.pointerDown.bind(this);\r\n this.pointerUp = this.pointerUp.bind(this);\r\n this.resize = this.resize.bind(this);\r\n this.markerSizeChanged = this.markerSizeChanged.bind(this);\r\n }\r\n\r\n private _pointerDownTime: number = Number.MAX_VALUE;\r\n private _pointerDownPoint: IPoint = { x: 0, y: 0 };\r\n\r\n public override pointerDown(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: PointerEvent,\r\n ): void {\r\n super.pointerDown(point, target, ev);\r\n\r\n this._pointerDownTime = Date.now();\r\n this._pointerDownPoint = point;\r\n\r\n if (this.state === 'new') {\r\n this.marker.createVisual();\r\n\r\n this.marker.moveVisual(point);\r\n\r\n this._state = 'creating';\r\n }\r\n }\r\n\r\n public override dblClick(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: MouseEvent,\r\n ): void {\r\n super.dblClick(point, target, ev);\r\n if (this.state !== 'edit') {\r\n this.showEditor();\r\n }\r\n }\r\n\r\n protected setSize(): void {\r\n super.setSize();\r\n this.textBlockEditorContainer.style.transform = `translate(${this.marker.left}px, ${this.marker.top}px)`;\r\n this.textBlockEditorContainer.style.width = `${this.marker.width}px`;\r\n this.textBlockEditorContainer.setAttribute('width', `${this.marker.width}`);\r\n this.textBlockEditorContainer.style.height = `${this.marker.height}px`;\r\n this.textBlockEditorContainer.setAttribute(\r\n 'height',\r\n `${this.marker.height}`,\r\n );\r\n this.textBlockEditor.width = this.marker.width;\r\n this.textBlockEditor.height = this.marker.height;\r\n }\r\n\r\n protected resize(point: IPoint, preserveAspectRatio = false): void {\r\n super.resize(point, preserveAspectRatio);\r\n this.setSize();\r\n }\r\n\r\n public override pointerUp(point: IPoint, ev?: PointerEvent): void {\r\n const inState = this.state;\r\n super.pointerUp(point, ev);\r\n this.setSize();\r\n\r\n if (\r\n inState === 'creating' ||\r\n (Date.now() - this._pointerDownTime > 500 &&\r\n Math.abs(this._pointerDownPoint.x - point.x) < 5 &&\r\n Math.abs(this._pointerDownPoint.y - point.y) < 5)\r\n ) {\r\n this.showEditor();\r\n }\r\n\r\n this.adjustControlBox();\r\n }\r\n\r\n private showEditor(): void {\r\n this.textBlockEditor.text = this.marker.text;\r\n this.textBlockEditor.textColor = this.marker.color;\r\n this.textBlockEditor.bgColor = this.marker.fillColor;\r\n this.textBlockEditor.fontFamily = this.marker.fontFamily;\r\n this.textBlockEditor.fontSize = `${this.marker.fontSize.value}${this.marker.fontSize.units}`;\r\n\r\n if (this.textBlockEditor.onTextChanged === undefined) {\r\n this.textBlockEditor.onTextChanged = (text: string) => {\r\n this.marker.text = text;\r\n };\r\n }\r\n if (this.textBlockEditor.onBlur === undefined) {\r\n this.textBlockEditor.onBlur = () => {\r\n this.hideEditor();\r\n this.deselect();\r\n };\r\n }\r\n this.textBlockEditorContainer.appendChild(\r\n this.textBlockEditor.getEditorUi(),\r\n );\r\n this.container.appendChild(this.textBlockEditorContainer);\r\n\r\n this.marker.hideVisual();\r\n this.hideControlBox();\r\n\r\n this.textBlockEditor.focus();\r\n }\r\n\r\n private hideEditor(): void {\r\n this.marker.text = this.textBlockEditor.text;\r\n this.marker.showVisual();\r\n this.showControlBox();\r\n this.state = 'select';\r\n this.container.removeChild(this.textBlockEditorContainer);\r\n }\r\n\r\n private markerSizeChanged = () => {\r\n this.setSize();\r\n };\r\n}\r\n","import { ShapeMarkerBase } from '../core';\r\nimport { ShapeOutlineMarkerEditor } from './ShapeOutlineMarkerEditor';\r\n\r\n/**\r\n * Editor for filled shape markers.\r\n *\r\n * @summary Filled shape marker editor.\r\n * @group Editors\r\n */\r\nexport class ShapeMarkerEditor<\r\n TMarkerType extends ShapeMarkerBase = ShapeMarkerBase,\r\n> extends ShapeOutlineMarkerEditor<TMarkerType> {}\r\n","import { ArrowMarker, ArrowType } from '../core';\r\nimport { LinearMarkerEditor } from './LinearMarkerEditor';\r\n\r\n/**\r\n * Editor for arrow markers.\r\n *\r\n * @summary Arrow marker editor.\r\n * @group Editors\r\n */\r\nexport class ArrowMarkerEditor<\r\n TMarkerType extends ArrowMarker = ArrowMarker,\r\n> extends LinearMarkerEditor<TMarkerType> {\r\n /**\r\n * Sets the arrow type.\r\n */\r\n public set arrowType(value: ArrowType) {\r\n this.marker.arrowType = value;\r\n }\r\n\r\n /**\r\n * Returns the arrow type.\r\n */\r\n public get arrowType(): ArrowType {\r\n return this.marker.arrowType;\r\n }\r\n}\r\n","import { CalloutMarker, IPoint, SvgHelper } from '../core';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { ResizeGrip } from './ResizeGrip';\r\nimport { TextMarkerEditor } from './TextMarkerEditor';\r\n\r\n/**\r\n * Editor for callout markers.\r\n *\r\n * @summary Callout marker editor.\r\n * @group Editors\r\n */\r\nexport class CalloutMarkerEditor<\r\n TMarkerType extends CalloutMarker = CalloutMarker,\r\n> extends TextMarkerEditor<TMarkerType> {\r\n private tipGrip?: ResizeGrip;\r\n\r\n private manipulationStartTipPositionX = 0;\r\n private manipulationStartTipPositionY = 0;\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n }\r\n\r\n protected addControlGrips(): void {\r\n this.tipGrip = this.createTipGrip();\r\n\r\n super.addControlGrips();\r\n }\r\n\r\n private createTipGrip(): ResizeGrip {\r\n const grip = new ResizeGrip();\r\n grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n this.manipulationBox.appendChild(grip.visual);\r\n\r\n return grip;\r\n }\r\n\r\n protected positionGrips() {\r\n super.positionGrips();\r\n\r\n if (this.tipGrip) {\r\n const tipGripSize = this.tipGrip.gripSize ?? 0;\r\n this.positionGrip(\r\n this.tipGrip.visual,\r\n this.marker.tipPosition.x - tipGripSize / 2,\r\n this.marker.tipPosition.y - tipGripSize / 2,\r\n );\r\n }\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this.tipGrip?.ownsTarget(el)) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public override pointerDown(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: PointerEvent,\r\n ): void {\r\n super.pointerDown(point, target, ev);\r\n\r\n this.manipulationStartTipPositionX = this.marker.tipPosition.x;\r\n this.manipulationStartTipPositionY = this.marker.tipPosition.y;\r\n\r\n if (\r\n this.tipGrip !== undefined &&\r\n target !== undefined &&\r\n this.tipGrip.ownsTarget(target)\r\n ) {\r\n this.activeGrip = this.tipGrip;\r\n this._state = 'resize';\r\n }\r\n }\r\n\r\n protected resize(point: IPoint, preserveAspectRatio = false): void {\r\n const newX =\r\n this.manipulationStartTipPositionX + point.x - this.manipulationStartX;\r\n const newY =\r\n this.manipulationStartTipPositionY + point.y - this.manipulationStartY;\r\n\r\n if (this.activeGrip === this.tipGrip) {\r\n this.marker.tipPosition = { x: newX, y: newY };\r\n this.adjustControlBox();\r\n } else {\r\n super.resize(point, preserveAspectRatio);\r\n }\r\n }\r\n}\r\n","import { ImageMarkerBase, IPoint } from '../core';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { RectangularBoxMarkerBaseEditor } from './RectangularBoxMarkerBaseEditor';\r\n\r\n/**\r\n * Editor for image markers.\r\n *\r\n * @summary Image marker editor.\r\n * @group Editors\r\n */\r\nexport class ImageMarkerEditor<\r\n TMarkerType extends ImageMarkerBase = ImageMarkerBase,\r\n> extends RectangularBoxMarkerBaseEditor<TMarkerType> {\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this._creationStyle = 'drop';\r\n\r\n this.disabledResizeGrips = [\r\n 'topcenter',\r\n 'bottomcenter',\r\n 'leftcenter',\r\n 'rightcenter',\r\n ];\r\n\r\n this.pointerDown = this.pointerDown.bind(this);\r\n this.pointerUp = this.pointerUp.bind(this);\r\n this.resize = this.resize.bind(this);\r\n }\r\n\r\n public override pointerDown(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: PointerEvent,\r\n ): void {\r\n super.pointerDown(point, target, ev);\r\n\r\n if (this.state === 'new') {\r\n this.marker.createVisual();\r\n\r\n this.marker.moveVisual(point);\r\n\r\n this._state = 'creating';\r\n }\r\n }\r\n\r\n public override pointerUp(point: IPoint, ev?: PointerEvent): void {\r\n super.pointerUp(point, ev);\r\n this.setSize();\r\n this.adjustControlBox();\r\n }\r\n}\r\n","import { CaptionFrameMarker } from '../core';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { TextMarkerEditor } from './TextMarkerEditor';\r\n\r\n/**\r\n * Editor for caption frame markers.\r\n *\r\n * @summary Caption frame marker editor.\r\n * @group Editors\r\n */\r\nexport class CaptionFrameMarkerEditor<\r\n TMarkerType extends CaptionFrameMarker = CaptionFrameMarker,\r\n> extends TextMarkerEditor<TMarkerType> {\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this.disabledResizeGrips = [];\r\n this._creationStyle = 'draw';\r\n }\r\n\r\n protected setSize(): void {\r\n super.setSize();\r\n this.textBlockEditorContainer.style.transform = `translate(${\r\n this.marker.left\r\n }px, ${this.marker.top + this.marker.strokeWidth / 2}px)`;\r\n if (this.marker.textBlock.textSize) {\r\n const height =\r\n this.marker.textBlock.textSize.height + this.marker.padding * 2;\r\n this.textBlockEditorContainer.style.width = `${this.marker.width}px`;\r\n this.textBlockEditorContainer.style.height = `${height}px`;\r\n this.textBlockEditor.width = this.marker.width;\r\n this.textBlockEditor.height = height;\r\n }\r\n }\r\n}\r\n","import { CurveMarker, IPoint, SvgHelper } from '../core';\r\nimport { LinearMarkerEditor } from './LinearMarkerEditor';\r\nimport { ResizeGrip } from './ResizeGrip';\r\n\r\nexport class CurveMarkerEditor<\r\n TMarkerType extends CurveMarker = CurveMarker,\r\n> extends LinearMarkerEditor<TMarkerType> {\r\n /**\r\n * Curve manipulation grip.\r\n */\r\n protected curveGrip?: ResizeGrip;\r\n\r\n private manipulationStartCurveX = 0;\r\n private manipulationStartCurveY = 0;\r\n\r\n private curveControlLine1?: SVGLineElement;\r\n private curveControlLine2?: SVGLineElement;\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this.curveGrip?.ownsTarget(el)) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public override pointerDown(\r\n point: IPoint,\r\n target?: EventTarget,\r\n ev?: PointerEvent,\r\n ): void {\r\n if (this.state === 'new') {\r\n this.marker.curveX = point.x;\r\n this.marker.curveY = point.y;\r\n }\r\n\r\n this.manipulationStartCurveX = this.marker.curveX;\r\n this.manipulationStartCurveY = this.marker.curveY;\r\n\r\n super.pointerDown(point, target, ev);\r\n\r\n if (this.state !== 'new' && this.state !== 'creating') {\r\n if (target && this.curveGrip?.ownsTarget(target)) {\r\n this.activeGrip = this.curveGrip;\r\n }\r\n\r\n if (this.activeGrip) {\r\n this._state = 'resize';\r\n } else {\r\n this._state = 'move';\r\n }\r\n }\r\n }\r\n\r\n protected resize(point: IPoint): void {\r\n super.resize(point);\r\n\r\n if (this.activeGrip === this.curveGrip) {\r\n this.marker.curveX = point.x;\r\n this.marker.curveY = point.y;\r\n\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n }\r\n\r\n if (this.state === 'creating') {\r\n this.marker.curveX =\r\n this.marker.x1 + (this.marker.x2 - this.marker.x1) / 2;\r\n this.marker.curveY =\r\n this.marker.y1 + (this.marker.y2 - this.marker.y1) / 2;\r\n }\r\n }\r\n\r\n public override manipulate(point: IPoint, ev?: PointerEvent): void {\r\n if (this.state === 'move') {\r\n this.marker.curveX =\r\n this.manipulationStartCurveX + point.x - this.manipulationStartX;\r\n this.marker.curveY =\r\n this.manipulationStartCurveY + point.y - this.manipulationStartY;\r\n }\r\n super.manipulate(point, ev);\r\n }\r\n\r\n protected setupControlBox(): void {\r\n super.setupControlBox();\r\n this.curveControlLine1 = SvgHelper.createLine(\r\n this.marker.x1,\r\n this.marker.y1,\r\n this.marker.curveX,\r\n this.marker.curveY,\r\n [\r\n ['stroke', 'black'],\r\n ['stroke-width', '1'],\r\n ['stroke-opacity', '0.5'],\r\n ['stroke-dasharray', '3, 2'],\r\n ['fill', 'transparent'],\r\n ['pointer-events', 'none'],\r\n ],\r\n );\r\n this.curveControlLine2 = SvgHelper.createLine(\r\n this.marker.x2,\r\n this.marker.y2,\r\n this.marker.curveX,\r\n this.marker.curveY,\r\n [\r\n ['stroke', 'black'],\r\n ['stroke-width', '1'],\r\n ['stroke-opacity', '0.5'],\r\n ['stroke-dasharray', '3, 2'],\r\n ['fill', 'transparent'],\r\n ['pointer-events', 'none'],\r\n ],\r\n );\r\n\r\n this._controlBox.insertBefore(\r\n this.curveControlLine1,\r\n this._controlBox.firstChild,\r\n );\r\n this._controlBox.insertBefore(\r\n this.curveControlLine2,\r\n this._controlBox.firstChild,\r\n );\r\n }\r\n\r\n protected adjustControlBox() {\r\n super.adjustControlBox();\r\n\r\n if (this.curveControlLine1 && this.curveControlLine2) {\r\n this.curveControlLine1.setAttribute('x1', this.marker.x1.toString());\r\n this.curveControlLine1.setAttribute('y1', this.marker.y1.toString());\r\n this.curveControlLine1.setAttribute('x2', this.marker.curveX.toString());\r\n this.curveControlLine1.setAttribute('y2', this.marker.curveY.toString());\r\n\r\n this.curveControlLine2.setAttribute('x1', this.marker.x2.toString());\r\n this.curveControlLine2.setAttribute('y1', this.marker.y2.toString());\r\n this.curveControlLine2.setAttribute('x2', this.marker.curveX.toString());\r\n this.curveControlLine2.setAttribute('y2', this.marker.curveY.toString());\r\n }\r\n }\r\n\r\n protected addControlGrips(): void {\r\n super.addControlGrips();\r\n\r\n this.curveGrip = this.createGrip();\r\n this.positionGrips();\r\n }\r\n\r\n protected positionGrips(): void {\r\n super.positionGrips();\r\n\r\n if (this.curveGrip) {\r\n const gripSize = this.curveGrip.gripSize;\r\n\r\n this.positionGrip(\r\n this.curveGrip.visual,\r\n this.marker.curveX - gripSize / 2,\r\n this.marker.curveY - gripSize / 2,\r\n );\r\n }\r\n }\r\n}\r\n","import {\r\n AnnotationState,\r\n CalloutMarker,\r\n CaptionFrameMarker,\r\n CheckImageMarker,\r\n CoverMarker,\r\n CurveMarker,\r\n CustomImageMarker,\r\n EllipseFrameMarker,\r\n EllipseMarker,\r\n FrameMarker,\r\n FreehandMarker,\r\n HighlighterMarker,\r\n HighlightMarker,\r\n IPoint,\r\n LineMarker,\r\n MarkerBase,\r\n PolygonMarker,\r\n TextMarker,\r\n XImageMarker,\r\n SvgFilters,\r\n} from './core';\r\nimport { SvgHelper } from './core/SvgHelper';\r\nimport { PolygonMarkerEditor } from './editor/PolygonMarkerEditor';\r\nimport { LinearMarkerEditor } from './editor/LinearMarkerEditor';\r\nimport { MarkerBaseEditor } from './editor/MarkerBaseEditor';\r\nimport { ShapeOutlineMarkerEditor } from './editor/ShapeOutlineMarkerEditor';\r\nimport { UndoRedoManager } from './editor/UndoRedoManager';\r\nimport { FreehandMarkerEditor } from './editor/FreehandMarkerEditor';\r\nimport { TextMarkerEditor } from './editor/TextMarkerEditor';\r\nimport { Activator } from './core/Activator';\r\n\r\nimport Logo from './assets/markerjs-logo-m.svg';\r\nimport { ShapeMarkerEditor } from './editor/ShapeMarkerEditor';\r\nimport { ArrowMarker } from './core/ArrowMarker';\r\nimport { ArrowMarkerEditor } from './editor/ArrowMarkerEditor';\r\nimport { MeasurementMarker } from './core/MeasurementMarker';\r\nimport { CalloutMarkerEditor } from './editor/CalloutMarkerEditor';\r\nimport { ImageMarkerEditor } from './editor/ImageMarkerEditor';\r\nimport { CaptionFrameMarkerEditor } from './editor/CaptionFrameMarkerEditor';\r\nimport { CurveMarkerEditor } from './editor/CurveMarkerEditor';\r\n\r\n/**\r\n * Marker area custom event types.\r\n */\r\nexport interface MarkerAreaEventMap {\r\n /**\r\n * Marker area initialized.\r\n */\r\n areainit: CustomEvent<MarkerAreaEventData>;\r\n /**\r\n * Marker area shown.\r\n */\r\n areashow: CustomEvent<MarkerAreaEventData>;\r\n /**\r\n * Marker area state restored.\r\n */\r\n arearestorestate: CustomEvent<MarkerAreaEventData>;\r\n /**\r\n * Marker area focused.\r\n */\r\n areafocus: CustomEvent<MarkerAreaEventData>;\r\n /**\r\n * Marker area lost focus.\r\n */\r\n areablur: CustomEvent<MarkerAreaEventData>;\r\n /**\r\n * Marker area state changed.\r\n */\r\n areastatechange: CustomEvent<MarkerAreaEventData>;\r\n\r\n /**\r\n * Marker selected.\r\n */\r\n markerselect: CustomEvent<MarkerEditorEventData>;\r\n /**\r\n * Marker deselected.\r\n */\r\n markerdeselect: CustomEvent<MarkerEditorEventData>;\r\n /**\r\n * Marker creating.\r\n */\r\n markercreating: CustomEvent<MarkerEditorEventData>;\r\n /**\r\n * Marker created.\r\n */\r\n markercreate: CustomEvent<MarkerEditorEventData>;\r\n /**\r\n * Marker about to be deleted.\r\n */\r\n markerbeforedelete: CustomEvent<MarkerEditorEventData>;\r\n /**\r\n * Marker deleted.\r\n */\r\n markerdelete: CustomEvent<MarkerEditorEventData>;\r\n /**\r\n * Marker changed.\r\n */\r\n markerchange: CustomEvent<MarkerEditorEventData>;\r\n}\r\n\r\n/**\r\n * Marker area custom event data.\r\n */\r\nexport interface MarkerAreaEventData {\r\n /**\r\n * {@link MarkerArea} instance.\r\n */\r\n markerArea: MarkerArea;\r\n}\r\n\r\n/**\r\n * Marker editor custom event data.\r\n */\r\nexport interface MarkerEditorEventData extends MarkerAreaEventData {\r\n markerEditor: MarkerBaseEditor;\r\n}\r\n\r\n/**\r\n * @ignore\r\n */\r\nexport type MarkerAreaMode = 'select' | 'create' | 'delete';\r\n\r\n/**\r\n * Marker area web component is the main annotation editor component.\r\n *\r\n * @summary\r\n * The main annotation editor component.\r\n *\r\n * @group Components\r\n *\r\n * @example\r\n *\r\n * Import `MarkerArea` from `@markerjs/markerjs3`:\r\n *\r\n * ```js\r\n * import { MarkerArea } from '@markerjs/markerjs3';\r\n * ```\r\n *\r\n * In the code below we assume that you have an `HTMLImageElement` as `targetImage`. It can be a reference to an image you already have on the page or you can simply create it with something like this:\r\n *\r\n * ```js\r\n * const targetImg = document.createElement('img');\r\n * targetImg.src = './sample.jpg';\r\n * ```\r\n *\r\n * Now you just need to create an instance of `MarkerArea`, set its `targetImage` property and add it to the page:\r\n *\r\n * ```js\r\n * const markerArea = new MarkerArea();\r\n * markerArea.targetImage = targetImg;\r\n * editorContainerDiv.appendChild(markerArea);\r\n * ```\r\n *\r\n * To initiate creation of a marker you just call `createMarker()` and pass it the name (or type) of the marker you want to create. So, if you have a button with id `addFrameButton` you can make it create a new `FrameMarker` with something like this:\r\n *\r\n * ```js\r\n * document.querySelector(\"#addButton\")!.addEventListener(\"click\", () => {\r\n * markerArea.createMarker(\"FrameMarker\");\r\n * });\r\n * ```\r\n *\r\n * And whenever you want to save state (current annotation) you just call `getState()`:\r\n *\r\n * ```js\r\n * document.querySelector(\"#saveStateButton\")!.addEventListener(\"click\", () => {\r\n * const state = markerArea.getState();\r\n * console.log(state);\r\n * });\r\n * ```\r\n */\r\nexport class MarkerArea extends HTMLElement {\r\n private _contentContainer?: HTMLDivElement;\r\n private _canvasContainer?: HTMLDivElement;\r\n\r\n private _overlayContainer!: HTMLDivElement;\r\n private _overlayContentContainer!: HTMLDivElement;\r\n\r\n private _mainCanvas?: SVGSVGElement;\r\n private _groupLayer?: SVGGElement;\r\n\r\n private _editingTarget?: HTMLImageElement;\r\n\r\n private width = 0;\r\n private height = 0;\r\n\r\n private _targetWidth = -1;\r\n /**\r\n * Returns the target image width.\r\n */\r\n public get targetWidth() {\r\n return this._targetWidth;\r\n }\r\n /**\r\n * Sets the target image width.\r\n */\r\n public set targetWidth(value) {\r\n this._targetWidth = value;\r\n this.setMainCanvasSize();\r\n }\r\n private _targetHeight = -1;\r\n /**\r\n * Returns the target image height.\r\n */\r\n public get targetHeight() {\r\n return this._targetHeight;\r\n }\r\n /**\r\n * Sets the target image height.\r\n */\r\n public set targetHeight(value) {\r\n this._targetHeight = value;\r\n this.setMainCanvasSize();\r\n }\r\n\r\n private mode: MarkerAreaMode = 'select';\r\n\r\n private _logoUI?: HTMLElement;\r\n\r\n private _isInitialized = false;\r\n\r\n private _currentMarkerEditor?: MarkerBaseEditor;\r\n /**\r\n * Returns the currently active marker editor.\r\n */\r\n public get currentMarkerEditor(): MarkerBaseEditor | undefined {\r\n return this._currentMarkerEditor;\r\n }\r\n private _selectedMarkerEditors: MarkerBaseEditor[] = [];\r\n /**\r\n * Returns the currently selected marker editors.\r\n */\r\n public get selectedMarkerEditors(): MarkerBaseEditor[] {\r\n return this._selectedMarkerEditors;\r\n }\r\n\r\n private _newMarkerOutline: SVGPathElement = SvgHelper.createPath('', [\r\n ['stroke', '#333'],\r\n ['stroke-width', '0.5'],\r\n ['stroke-dasharray', '2 5'],\r\n ['fill', 'rgba(200,200,200,0.5)'],\r\n ['pointer-events', 'none'],\r\n ]);\r\n\r\n private _targetImageLoaded = false;\r\n private _targetImage: HTMLImageElement | undefined;\r\n /**\r\n * Returns the target image.\r\n */\r\n public get targetImage(): HTMLImageElement | undefined {\r\n return this._targetImage;\r\n }\r\n /**\r\n * Sets the target image.\r\n */\r\n public set targetImage(value: HTMLImageElement | undefined) {\r\n this._targetImage = value;\r\n this._targetImageLoaded = false;\r\n if (value !== undefined) {\r\n this.addTargetImage();\r\n }\r\n }\r\n\r\n /**\r\n * The collection of available marker editor types.\r\n */\r\n public markerEditors: Map<\r\n typeof MarkerBase,\r\n typeof MarkerBaseEditor<MarkerBase>\r\n > = new Map();\r\n\r\n /**\r\n * The collection of marker editors in the annotation.\r\n */\r\n public editors: MarkerBaseEditor[] = [];\r\n\r\n private _zoomLevel = 1;\r\n /**\r\n * Returns the current zoom level.\r\n */\r\n public get zoomLevel(): number {\r\n return this._zoomLevel;\r\n }\r\n /**\r\n * Sets the current zoom level.\r\n */\r\n public set zoomLevel(value: number) {\r\n this._zoomLevel = value;\r\n if (\r\n this._canvasContainer &&\r\n this._contentContainer &&\r\n this._mainCanvas &&\r\n this._overlayContainer\r\n ) {\r\n // this.setMainCanvasSize();\r\n this._mainCanvas.style.transform = `scale(${this._zoomLevel})`;\r\n this.setEditingTargetSize();\r\n\r\n const scrollMultiplier = Math.max(this._zoomLevel, 1);\r\n this._canvasContainer.scrollTo({\r\n left:\r\n (this._mainCanvas.clientWidth * scrollMultiplier -\r\n this._canvasContainer.clientWidth) /\r\n 2,\r\n top:\r\n (this._mainCanvas.clientHeight * scrollMultiplier -\r\n this._canvasContainer.clientHeight) /\r\n 2,\r\n });\r\n\r\n this._overlayContainer.style.transform = `scale(${this._zoomLevel})`;\r\n }\r\n }\r\n\r\n private prevPanPoint: IPoint = { x: 0, y: 0 };\r\n private panTo(point: IPoint) {\r\n this._canvasContainer?.scrollBy({\r\n left: this.prevPanPoint.x - point.x,\r\n top: this.prevPanPoint.y - point.y,\r\n });\r\n this.prevPanPoint = point;\r\n }\r\n\r\n private undoRedoManager = new UndoRedoManager<AnnotationState>();\r\n\r\n private _defaultFilter?: string;\r\n /**\r\n * Returns the default SVG filter for the created markers.\r\n *\r\n * @since 3.2.0\r\n */\r\n public get defaultFilter(): string | undefined {\r\n return this._defaultFilter;\r\n }\r\n /**\r\n * Sets the default SVG filter for the created markers.\r\n *\r\n * @remarks\r\n * The filter should be a valid SVG filter string.\r\n *\r\n * In Chromium-based browsers and Firefox, you can use CSS filter strings\r\n * e.g. \"drop-shadow(2px 2px 2px black)\". Unfortunately, at the time of\r\n * the implementation this doesn't work in Safari (meaning any browser on iOS as well).\r\n *\r\n * For cross-browser compatibility, version 3.3 introduces a set of default filters.\r\n * These are dropShadow, outline, and glow. You can use them by setting the defaultFilter\r\n * to \"url(#dropShadow)\", \"url(#outline)\", or \"url(#glow)\" respectively.\r\n *\r\n * @since 3.2.0\r\n */\r\n public set defaultFilter(value: string | undefined) {\r\n this._defaultFilter = value;\r\n }\r\n\r\n private _defsElement?: SVGDefsElement;\r\n private _defs: (string | Node)[] = [];\r\n\r\n constructor() {\r\n super();\r\n\r\n this.markerEditors.set(FrameMarker, ShapeOutlineMarkerEditor<FrameMarker>);\r\n this.markerEditors.set(\r\n EllipseFrameMarker,\r\n ShapeOutlineMarkerEditor<FrameMarker>,\r\n );\r\n this.markerEditors.set(LineMarker, LinearMarkerEditor<LineMarker>);\r\n this.markerEditors.set(PolygonMarker, PolygonMarkerEditor<PolygonMarker>);\r\n this.markerEditors.set(\r\n FreehandMarker,\r\n FreehandMarkerEditor<FreehandMarker>,\r\n );\r\n this.markerEditors.set(TextMarker, TextMarkerEditor<TextMarker>);\r\n this.markerEditors.set(CoverMarker, ShapeMarkerEditor<CoverMarker>);\r\n this.markerEditors.set(HighlightMarker, ShapeMarkerEditor<HighlightMarker>);\r\n this.markerEditors.set(EllipseMarker, ShapeMarkerEditor<EllipseMarker>);\r\n this.markerEditors.set(ArrowMarker, ArrowMarkerEditor<ArrowMarker>);\r\n this.markerEditors.set(\r\n MeasurementMarker,\r\n LinearMarkerEditor<MeasurementMarker>,\r\n );\r\n this.markerEditors.set(CalloutMarker, CalloutMarkerEditor<CalloutMarker>);\r\n this.markerEditors.set(\r\n CustomImageMarker,\r\n ImageMarkerEditor<CustomImageMarker>,\r\n );\r\n this.markerEditors.set(\r\n CheckImageMarker,\r\n ImageMarkerEditor<CheckImageMarker>,\r\n );\r\n this.markerEditors.set(XImageMarker, ImageMarkerEditor<CheckImageMarker>);\r\n this.markerEditors.set(\r\n CaptionFrameMarker,\r\n CaptionFrameMarkerEditor<CaptionFrameMarker>,\r\n );\r\n this.markerEditors.set(CurveMarker, CurveMarkerEditor<CurveMarker>);\r\n this.markerEditors.set(\r\n HighlighterMarker,\r\n FreehandMarkerEditor<HighlighterMarker>,\r\n );\r\n\r\n this.connectedCallback = this.connectedCallback.bind(this);\r\n this.disconnectedCallback = this.disconnectedCallback.bind(this);\r\n\r\n this.createLayout = this.createLayout.bind(this);\r\n this.addMainCanvas = this.addMainCanvas.bind(this);\r\n this.setMainCanvasSize = this.setMainCanvasSize.bind(this);\r\n this.setEditingTargetSize = this.setEditingTargetSize.bind(this);\r\n this.initOverlay = this.initOverlay.bind(this);\r\n this.addTargetImage = this.addTargetImage.bind(this);\r\n\r\n this.attachEvents = this.attachEvents.bind(this);\r\n this.attachWindowEvents = this.attachWindowEvents.bind(this);\r\n this.detachEvents = this.detachEvents.bind(this);\r\n this.detachWindowEvents = this.detachWindowEvents.bind(this);\r\n\r\n this.onCanvasPointerDown = this.onCanvasPointerDown.bind(this);\r\n this.onCanvasDblClick = this.onCanvasDblClick.bind(this);\r\n this.onKeyUp = this.onKeyUp.bind(this);\r\n this.onPointerMove = this.onPointerMove.bind(this);\r\n this.onPointerOut = this.onPointerOut.bind(this);\r\n this.onPointerUp = this.onPointerUp.bind(this);\r\n\r\n this.createMarker = this.createMarker.bind(this);\r\n this.addNewMarker = this.addNewMarker.bind(this);\r\n this.markerCreated = this.markerCreated.bind(this);\r\n this.markerStateChanged = this.markerStateChanged.bind(this);\r\n this.deleteMarker = this.deleteMarker.bind(this);\r\n this.deleteSelectedMarkers = this.deleteSelectedMarkers.bind(this);\r\n\r\n this.switchToSelectMode = this.switchToSelectMode.bind(this);\r\n\r\n this.showOutline = this.showOutline.bind(this);\r\n this.hideOutline = this.hideOutline.bind(this);\r\n\r\n this.getState = this.getState.bind(this);\r\n this.restoreState = this.restoreState.bind(this);\r\n\r\n this.undo = this.undo.bind(this);\r\n this.addUndoStep = this.addUndoStep.bind(this);\r\n this.undoStep = this.undoStep.bind(this);\r\n this.redo = this.redo.bind(this);\r\n this.redoStep = this.redoStep.bind(this);\r\n\r\n this.toggleLogo = this.toggleLogo.bind(this);\r\n this.addLogo = this.addLogo.bind(this);\r\n this.removeLogo = this.removeLogo.bind(this);\r\n\r\n this.adjustMarqueeSelectOutline =\r\n this.adjustMarqueeSelectOutline.bind(this);\r\n this.hideMarqueeSelectOutline = this.hideMarqueeSelectOutline.bind(this);\r\n\r\n this.addDefs = this.addDefs.bind(this);\r\n this.addDefaultFilterDefs = this.addDefaultFilterDefs.bind(this);\r\n\r\n this.attachShadow({ mode: 'open' });\r\n }\r\n\r\n private connectedCallback() {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerAreaEventData>('areainit', {\r\n detail: { markerArea: this },\r\n }),\r\n );\r\n Activator.addKeyAddListener(this.toggleLogo);\r\n this.createLayout();\r\n this.addMainCanvas();\r\n this.initOverlay();\r\n this.attachEvents();\r\n this._isInitialized = true;\r\n if (this.targetImage !== undefined) {\r\n this.addTargetImage();\r\n }\r\n this.setMainCanvasSize();\r\n this.addDefaultFilterDefs();\r\n this.toggleLogo();\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerAreaEventData>('areashow', {\r\n detail: { markerArea: this },\r\n }),\r\n );\r\n }\r\n\r\n private disconnectedCallback() {\r\n this.detachEvents();\r\n }\r\n\r\n private createLayout() {\r\n this.style.display = 'flex';\r\n this.style.width = this.style.width !== '' ? this.style.width : '100%';\r\n this.style.height = this.style.height !== '' ? this.style.height : '100%';\r\n this.style.position = 'relative';\r\n\r\n this._contentContainer = document.createElement('div');\r\n this._contentContainer.style.display = 'flex';\r\n this._contentContainer.style.position = 'relative';\r\n this._contentContainer.style.flexGrow = '2';\r\n this._contentContainer.style.flexShrink = '1';\r\n this._contentContainer.style.overflow = 'hidden';\r\n\r\n this._canvasContainer = document.createElement('div');\r\n this._canvasContainer.style.touchAction = 'pinch-zoom';\r\n this._canvasContainer.className = 'canvas-container';\r\n this._canvasContainer.style.display = 'grid';\r\n this._canvasContainer.style.gridTemplateColumns = '1fr';\r\n this._canvasContainer.style.flexGrow = '2';\r\n this._canvasContainer.style.flexShrink = '2';\r\n this._canvasContainer.style.justifyItems = 'center';\r\n this._canvasContainer.style.alignItems = 'center';\r\n this._canvasContainer.style.overflow = 'auto';\r\n this._canvasContainer.style.userSelect = 'none';\r\n\r\n this._contentContainer.appendChild(this._canvasContainer);\r\n\r\n this.shadowRoot?.appendChild(this._contentContainer);\r\n }\r\n\r\n private addMainCanvas() {\r\n this.width = this._contentContainer?.clientWidth || 0;\r\n this.height = this._contentContainer?.clientHeight || 0;\r\n\r\n this._mainCanvas = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'svg',\r\n );\r\n this._mainCanvas.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\r\n this.setMainCanvasSize();\r\n this._mainCanvas.style.gridColumnStart = '1';\r\n this._mainCanvas.style.gridRowStart = '1';\r\n this._mainCanvas.style.pointerEvents = 'auto';\r\n // this._mainCanvas.style.backgroundColor = 'pink'; // @todo\r\n // this._mainCanvas.style.opacity = '0.3'; // @todo\r\n this._mainCanvas.style.margin = '10px';\r\n this._mainCanvas.style.transform = `scale(${this._zoomLevel})`;\r\n\r\n this.addDefsToMainCanvas();\r\n\r\n this._groupLayer = SvgHelper.createGroup();\r\n\r\n this._mainCanvas.appendChild(this._groupLayer);\r\n\r\n this._canvasContainer?.appendChild(this._mainCanvas);\r\n }\r\n\r\n private addDefsToMainCanvas() {\r\n this._defsElement = SvgHelper.createDefs();\r\n this._mainCanvas?.appendChild(this._defsElement);\r\n this._defsElement.append(...this._defs);\r\n }\r\n\r\n private setMainCanvasSize() {\r\n if (\r\n this._mainCanvas !== undefined &&\r\n this._targetHeight > 0 &&\r\n this._targetWidth > 0\r\n ) {\r\n this._mainCanvas.style.width = `${this._targetWidth * this.zoomLevel}px`;\r\n this._mainCanvas.style.height = `${\r\n this._targetHeight * this.zoomLevel\r\n }px`;\r\n this._mainCanvas.setAttribute(\r\n 'width',\r\n `${this._targetWidth * this.zoomLevel}`,\r\n );\r\n this._mainCanvas.setAttribute(\r\n 'height',\r\n `${this._targetHeight * this.zoomLevel}`,\r\n );\r\n this._mainCanvas.setAttribute(\r\n 'viewBox',\r\n '0 0 ' +\r\n this._targetWidth.toString() +\r\n ' ' +\r\n this._targetHeight.toString(),\r\n );\r\n this.setEditingTargetSize();\r\n }\r\n }\r\n\r\n private setEditingTargetSize() {\r\n if (this._editingTarget !== undefined) {\r\n this._editingTarget.width = this._targetWidth * this.zoomLevel;\r\n this._editingTarget.height = this._targetHeight * this.zoomLevel;\r\n this._editingTarget.style.width = `${\r\n this._targetWidth * this.zoomLevel\r\n }px`;\r\n this._editingTarget.style.height = `${\r\n this._targetHeight * this.zoomLevel\r\n }px`;\r\n }\r\n }\r\n\r\n private initOverlay(): void {\r\n this._overlayContainer = document.createElement('div');\r\n this._overlayContainer.style.pointerEvents = 'none';\r\n this._overlayContainer.style.display = 'flex';\r\n this._overlayContainer.style.alignItems = 'center';\r\n this._overlayContainer.style.justifyContent = 'center';\r\n this._overlayContainer.style.gridRowStart = '1';\r\n this._overlayContainer.style.gridColumnStart = '1';\r\n\r\n this._canvasContainer?.appendChild(this._overlayContainer);\r\n\r\n this._overlayContentContainer = document.createElement('div');\r\n this._overlayContentContainer.style.position = 'relative';\r\n // @todo\r\n // this._overlayContentContainer.style.width = `${this.documentWidth}px`;\r\n // this._overlayContentContainer.style.height = `${this.documentHeight}px`;\r\n this._overlayContentContainer.style.display = 'flex';\r\n this._overlayContainer.appendChild(this._overlayContentContainer);\r\n }\r\n\r\n private addTargetImage() {\r\n if (\r\n this._isInitialized &&\r\n this._editingTarget === undefined &&\r\n this.targetImage !== undefined &&\r\n this._canvasContainer !== undefined &&\r\n this._mainCanvas !== undefined\r\n ) {\r\n this._editingTarget = document.createElement('img');\r\n\r\n this._targetWidth =\r\n this._targetWidth > 0\r\n ? this._targetWidth\r\n : this.targetImage.clientWidth;\r\n this._targetHeight =\r\n this._targetHeight > 0\r\n ? this._targetHeight\r\n : this.targetImage.clientHeight;\r\n\r\n this._editingTarget.addEventListener('load', (ev) => {\r\n if (this._editingTarget !== undefined) {\r\n if (this._targetHeight <= 0 || this._targetWidth <= 0) {\r\n const img = <HTMLImageElement>ev.target;\r\n\r\n const aspectRatio = img.naturalWidth / img.naturalHeight;\r\n const calculatedWidth =\r\n this._targetWidth > 0\r\n ? this._targetWidth\r\n : this._targetHeight > 0\r\n ? this._targetHeight * aspectRatio\r\n : img.clientWidth > 0\r\n ? img.clientWidth\r\n : img.naturalWidth;\r\n const calculatedHeight =\r\n this._targetHeight > 0\r\n ? this._targetHeight\r\n : this._targetWidth > 0\r\n ? this._targetWidth / aspectRatio\r\n : img.clientHeight > 0\r\n ? img.clientHeight\r\n : img.naturalHeight;\r\n\r\n this._targetWidth = calculatedWidth;\r\n this._targetHeight = calculatedHeight;\r\n }\r\n this._editingTarget.width = this._targetWidth;\r\n this._editingTarget.height = this._targetHeight;\r\n this._editingTarget.style.width = `${this._targetWidth}px`;\r\n this._editingTarget.style.height = `${this._targetHeight}px`;\r\n this._editingTarget.style.gridColumnStart = '1';\r\n this._editingTarget.style.gridRowStart = '1';\r\n\r\n this.setMainCanvasSize();\r\n\r\n this._targetImageLoaded = true;\r\n if (this._stateToRestore !== undefined) {\r\n this.restoreState(this._stateToRestore);\r\n }\r\n }\r\n\r\n // reset zoom to scroll to center if needed\r\n this.zoomLevel = this._zoomLevel;\r\n });\r\n this._editingTarget.src = this.targetImage.src;\r\n\r\n this._canvasContainer.insertBefore(this._editingTarget, this._mainCanvas);\r\n }\r\n }\r\n\r\n private addDefaultFilterDefs() {\r\n this.addDefs(...SvgFilters.getDefaultFilterSet());\r\n }\r\n\r\n /**\r\n * Registers a marker type and its editor to be available in the marker area.\r\n * @param markerType\r\n * @param editorType\r\n */\r\n public registerMarkerType(\r\n markerType: typeof MarkerBase,\r\n editorType: typeof MarkerBaseEditor<MarkerBase>,\r\n ) {\r\n this.markerEditors.set(markerType, editorType);\r\n }\r\n\r\n /**\r\n * Creates a new marker of the specified type.\r\n * @param markerType\r\n * @returns\r\n */\r\n public createMarker(markerType: typeof MarkerBase | string) {\r\n let mType: typeof MarkerBase = FrameMarker;\r\n if (typeof markerType === 'string') {\r\n mType = this.getMarkerTypeByName(markerType) || FrameMarker;\r\n } else {\r\n mType = markerType;\r\n }\r\n const markerEditor = this.markerEditors.get(mType);\r\n if (markerEditor && this._mainCanvas) {\r\n this.setCurrentEditor();\r\n this.deselectEditor();\r\n this.addUndoStep();\r\n this._currentMarkerEditor = this.addNewMarker(markerEditor, mType);\r\n this._currentMarkerEditor.onMarkerCreated = this.markerCreated;\r\n this._currentMarkerEditor.onStateChanged = this.markerStateChanged;\r\n\r\n switch (this._currentMarkerEditor.creationStyle) {\r\n case 'drop':\r\n this._mainCanvas.style.cursor = 'move';\r\n break;\r\n case 'draw':\r\n default:\r\n this._mainCanvas.style.cursor = 'crosshair';\r\n break;\r\n }\r\n\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markercreating', {\r\n detail: {\r\n markerArea: this,\r\n markerEditor: this._currentMarkerEditor,\r\n },\r\n }),\r\n );\r\n }\r\n\r\n return this._currentMarkerEditor;\r\n }\r\n\r\n private addNewMarker(\r\n markerEditorType: typeof MarkerBaseEditor<MarkerBase>,\r\n markerType: typeof MarkerBase,\r\n ): MarkerBaseEditor {\r\n if (this._mainCanvas === undefined) {\r\n throw new Error('Main canvas is not initialized.');\r\n }\r\n\r\n const g = SvgHelper.createGroup();\r\n if (this.defaultFilter && markerType.applyDefaultFilter) {\r\n g.setAttribute('filter', this.defaultFilter);\r\n }\r\n this._mainCanvas.appendChild(g);\r\n\r\n return new markerEditorType({\r\n container: g,\r\n overlayContainer: this._overlayContentContainer,\r\n markerType: markerType,\r\n });\r\n }\r\n\r\n private markerCreated(editor: MarkerBaseEditor<MarkerBase>) {\r\n if (this._mainCanvas) {\r\n this.mode = 'select';\r\n this._mainCanvas.style.cursor = 'default';\r\n this.editors.push(editor);\r\n this.setCurrentEditor(editor);\r\n if (editor.continuousCreation) {\r\n const newMarkerEditor = this.createMarker(editor.marker.typeName);\r\n if (\r\n editor.is(FreehandMarkerEditor) &&\r\n newMarkerEditor?.is(FreehandMarkerEditor)\r\n ) {\r\n newMarkerEditor.strokeColor = editor.strokeColor;\r\n newMarkerEditor.strokeWidth = editor.strokeWidth;\r\n newMarkerEditor.strokeDasharray = editor.strokeDasharray;\r\n }\r\n }\r\n this.addUndoStep();\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markercreate', {\r\n detail: { markerArea: this, markerEditor: editor },\r\n }),\r\n );\r\n }\r\n }\r\n\r\n private markerStateChanged(markerEditor: MarkerBaseEditor): void {\r\n this.addUndoStep();\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markerchange', {\r\n detail: { markerArea: this, markerEditor: markerEditor },\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Deletes a marker represented by the specified editor.\r\n * @param markerEditor\r\n */\r\n public deleteMarker(markerEditor: MarkerBaseEditor): void {\r\n if (this.editors.indexOf(markerEditor) >= 0) {\r\n this.addUndoStep();\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markerbeforedelete', {\r\n detail: { markerArea: this, markerEditor: markerEditor },\r\n }),\r\n );\r\n this._mainCanvas?.removeChild(markerEditor.container);\r\n markerEditor.dispose();\r\n this.editors.splice(this.editors.indexOf(markerEditor), 1);\r\n this._selectedMarkerEditors.splice(\r\n this._selectedMarkerEditors.indexOf(markerEditor),\r\n 1,\r\n );\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markerdelete', {\r\n detail: { markerArea: this, markerEditor: markerEditor },\r\n }),\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Deselects all markers.\r\n */\r\n public deleteSelectedMarkers() {\r\n const markersToDelete = [...this._selectedMarkerEditors];\r\n // this._selectedMarkerEditors.splice(0);\r\n markersToDelete.forEach((m) => this.deleteMarker(m));\r\n this.hideMarqueeSelectOutline();\r\n }\r\n\r\n /**\r\n * Sets the current editor and selects it.\r\n *\r\n * If `editor` is not supplied the current editor is unselected.\r\n *\r\n * @param editor\r\n */\r\n public setCurrentEditor(editor?: MarkerBaseEditor): void {\r\n if (this._currentMarkerEditor !== editor) {\r\n // no need to deselect if not changed\r\n if (this._currentMarkerEditor !== undefined) {\r\n this.deselectEditor(this._currentMarkerEditor);\r\n }\r\n }\r\n this._currentMarkerEditor = editor;\r\n if (\r\n this._currentMarkerEditor !== undefined &&\r\n !this._currentMarkerEditor.isSelected\r\n ) {\r\n if (this._currentMarkerEditor.state !== 'new') {\r\n this.selectEditor(this._currentMarkerEditor);\r\n this._currentMarkerEditor.select(false);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Selects the specified editor without setting it as the current editor.\r\n * @param editor\r\n */\r\n public selectEditor(editor: MarkerBaseEditor): void {\r\n if (this._selectedMarkerEditors.indexOf(editor) < 0) {\r\n if (this._selectedMarkerEditors.length > 0) {\r\n this._selectedMarkerEditors[0].select(true);\r\n }\r\n this._selectedMarkerEditors.push(editor);\r\n editor.select(true);\r\n\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markerselect', {\r\n detail: { markerArea: this, markerEditor: editor },\r\n }),\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Deselects the specified editor (or all editors if not specified).\r\n * @param editor\r\n */\r\n public deselectEditor(editor?: MarkerBaseEditor): void {\r\n const selectedCountOnEntry = this._selectedMarkerEditors.length;\r\n\r\n if (selectedCountOnEntry > 0) {\r\n const eventEditor =\r\n editor ??\r\n this._selectedMarkerEditors[this._selectedMarkerEditors.length - 1];\r\n\r\n if (editor === undefined) {\r\n this._selectedMarkerEditors.forEach((m) => m.deselect());\r\n this._selectedMarkerEditors.splice(0);\r\n } else {\r\n const index = this._selectedMarkerEditors.indexOf(editor);\r\n if (index >= 0) {\r\n this._selectedMarkerEditors.splice(index, 1);\r\n editor.deselect();\r\n }\r\n }\r\n\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markerdeselect', {\r\n detail: { markerArea: this, markerEditor: eventEditor },\r\n }),\r\n );\r\n }\r\n }\r\n\r\n private touchPoints = 0;\r\n private leadPointerId?: number;\r\n private isDragging = false;\r\n private isSelecting = false;\r\n private isPanning = false;\r\n\r\n private _marqueeSelectOutline: SVGRectElement = SvgHelper.createRect(0, 0, [\r\n ['stroke', 'rgb(35, 35, 255)'],\r\n ['stroke-width', '1'],\r\n ['fill', 'rgba(129, 129, 255, 0.3)'],\r\n ['pointer-events', 'none'],\r\n ['cursor', 'move'],\r\n ]);\r\n private _marqueeSelectRect = new DOMRect(0, 0, 0, 0);\r\n\r\n private _manipulationStartX = 0;\r\n private _manipulationStartY = 0;\r\n\r\n private onCanvasPointerDown(ev: PointerEvent) {\r\n // @todo ?\r\n // if (!this._isFocused) {\r\n // this.focus();\r\n // }\r\n\r\n this._manipulationStartX = ev.clientX;\r\n this._manipulationStartY = ev.clientY;\r\n\r\n this.touchPoints++;\r\n if (this.touchPoints === 1) {\r\n this.leadPointerId = ev.pointerId;\r\n }\r\n\r\n if (\r\n (ev.pointerType === 'touch' && this.touchPoints === 1) ||\r\n (ev.pointerType !== 'touch' && ev.button === 0 && !ev.altKey)\r\n ) {\r\n if (\r\n this._currentMarkerEditor !== undefined &&\r\n (this._currentMarkerEditor.state === 'new' ||\r\n this._currentMarkerEditor.state === 'creating')\r\n ) {\r\n this.isDragging = true;\r\n this._currentMarkerEditor.pointerDown(\r\n SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n ev.clientX,\r\n ev.clientY,\r\n this.zoomLevel,\r\n ),\r\n ev.target ?? undefined,\r\n ev,\r\n );\r\n } else if (this.mode === 'select') {\r\n const localPoint = SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n ev.clientX,\r\n ev.clientY,\r\n this.zoomLevel,\r\n );\r\n const hitMarker = this.editors.find((m) => m.ownsTarget(ev.target));\r\n if (hitMarker !== undefined) {\r\n this.isDragging = true;\r\n if (ev.shiftKey) {\r\n this.selectEditor(hitMarker);\r\n this.initializeMarqueeSelection(localPoint);\r\n } else if (!hitMarker.isSelected) {\r\n this.deselectEditor();\r\n this.setCurrentEditor(hitMarker);\r\n }\r\n this._selectedMarkerEditors.forEach((m) =>\r\n m.pointerDown(localPoint, ev.target ?? undefined, ev),\r\n );\r\n } else if (\r\n ev.target === this._marqueeSelectOutline &&\r\n this._selectedMarkerEditors.length > 1\r\n ) {\r\n this.isDragging = true;\r\n this._selectedMarkerEditors.forEach((m) =>\r\n m.pointerDown(localPoint, ev.target ?? undefined, ev),\r\n );\r\n } else {\r\n this.setCurrentEditor();\r\n this.deselectEditor();\r\n this.isSelecting = true;\r\n this.isDragging = true;\r\n\r\n // marquee select\r\n this.initializeMarqueeSelection(localPoint);\r\n\r\n this.prevPanPoint = { x: ev.clientX, y: ev.clientY };\r\n }\r\n }\r\n } else if (\r\n (ev.pointerType !== 'touch' &&\r\n ((ev.button === 0 && ev.altKey) || ev.button === 1)) || // left button + alt or middle button\r\n (ev.pointerType === 'touch' &&\r\n this.touchPoints === 2 &&\r\n ev.pointerId === this.leadPointerId)\r\n ) {\r\n this.isDragging = true;\r\n this.isPanning = true;\r\n this.prevPanPoint = { x: ev.clientX, y: ev.clientY };\r\n\r\n if (this._mainCanvas) {\r\n this._mainCanvas.style.cursor = 'grabbing';\r\n }\r\n }\r\n }\r\n\r\n private initializeMarqueeSelection(localPoint: IPoint) {\r\n this._marqueeSelectRect.x = localPoint.x;\r\n this._marqueeSelectRect.y = localPoint.y;\r\n this._marqueeSelectRect.width = 0;\r\n this._marqueeSelectRect.height = 0;\r\n SvgHelper.setAttributes(this._marqueeSelectOutline, [\r\n ['x', localPoint.x.toString()],\r\n ['y', localPoint.y.toString()],\r\n ['width', '0'],\r\n ['height', '0'],\r\n ]);\r\n if (\r\n this._groupLayer &&\r\n !this._groupLayer.contains(this._marqueeSelectOutline)\r\n ) {\r\n this._groupLayer.appendChild(this._marqueeSelectOutline);\r\n }\r\n }\r\n\r\n private onCanvasDblClick(ev: MouseEvent) {\r\n // @todo ?\r\n // if (!this._isFocused) {\r\n // this.focus();\r\n // }\r\n\r\n if (this.mode === 'select') {\r\n const hitMarker = this.editors.find((m) => m.ownsTarget(ev.target));\r\n if (hitMarker !== undefined && hitMarker !== this._currentMarkerEditor) {\r\n this.setCurrentEditor(hitMarker);\r\n }\r\n if (this._currentMarkerEditor !== undefined) {\r\n this._currentMarkerEditor.dblClick(\r\n SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n ev.clientX,\r\n ev.clientY,\r\n this.zoomLevel,\r\n ),\r\n ev.target ?? undefined,\r\n ev,\r\n );\r\n } else {\r\n this.setCurrentEditor();\r\n }\r\n }\r\n }\r\n\r\n private onPointerMove(ev: PointerEvent) {\r\n if (\r\n (ev.pointerType === 'touch' && this.touchPoints === 1) ||\r\n (ev.pointerType !== 'touch' && this.isDragging && !ev.altKey)\r\n ) {\r\n const localPoint = SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n ev.clientX,\r\n ev.clientY,\r\n this.zoomLevel,\r\n );\r\n\r\n if (\r\n this._currentMarkerEditor !== undefined ||\r\n this._selectedMarkerEditors.length > 0\r\n ) {\r\n // don't swallow the event when editing text markers\r\n if (\r\n this._currentMarkerEditor === undefined ||\r\n this._currentMarkerEditor.state !== 'edit'\r\n ) {\r\n ev.preventDefault();\r\n }\r\n\r\n if (\r\n this._currentMarkerEditor !== undefined ||\r\n this._selectedMarkerEditors.length > 0\r\n ) {\r\n this.showOutline(localPoint);\r\n\r\n if (this._selectedMarkerEditors.length > 0) {\r\n this._selectedMarkerEditors.forEach((m) =>\r\n m.manipulate(localPoint, ev),\r\n );\r\n } else {\r\n this._currentMarkerEditor?.manipulate(localPoint, ev);\r\n }\r\n } else if (this.zoomLevel > 1) {\r\n this.panTo({ x: ev.clientX, y: ev.clientY });\r\n }\r\n\r\n this.adjustMarqueeSelectOutline();\r\n } else if (this.isSelecting) {\r\n // adjust marquee\r\n const localManipulationStart = SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n this._manipulationStartX,\r\n this._manipulationStartY,\r\n this.zoomLevel,\r\n );\r\n\r\n this._marqueeSelectRect.x = Math.min(\r\n localPoint.x,\r\n localManipulationStart.x,\r\n );\r\n this._marqueeSelectRect.y = Math.min(\r\n localPoint.y,\r\n localManipulationStart.y,\r\n );\r\n this._marqueeSelectRect.width =\r\n Math.abs(ev.clientX - this._manipulationStartX) / this.zoomLevel;\r\n this._marqueeSelectRect.height =\r\n Math.abs(ev.clientY - this._manipulationStartY) / this.zoomLevel;\r\n\r\n SvgHelper.setAttributes(this._marqueeSelectOutline, [\r\n ['x', `${this._marqueeSelectRect.x}`],\r\n ['y', `${this._marqueeSelectRect.y}`],\r\n ['width', `${this._marqueeSelectRect.width}`],\r\n ['height', `${this._marqueeSelectRect.height}`],\r\n ]);\r\n }\r\n } else if (\r\n (ev.pointerType !== 'touch' && this.isPanning) ||\r\n (ev.pointerType === 'touch' &&\r\n this.touchPoints === 2 &&\r\n ev.pointerId === this.leadPointerId)\r\n ) {\r\n this.panTo({ x: ev.clientX, y: ev.clientY });\r\n }\r\n }\r\n\r\n private showOutline(localPoint: IPoint) {\r\n if (\r\n this._currentMarkerEditor &&\r\n this._currentMarkerEditor.creationStyle === 'drop' &&\r\n this._currentMarkerEditor.state === 'new'\r\n ) {\r\n if (\r\n this._mainCanvas !== undefined &&\r\n !this._mainCanvas.contains(this._newMarkerOutline)\r\n ) {\r\n this._mainCanvas.appendChild(this._newMarkerOutline);\r\n }\r\n const size = this._currentMarkerEditor.marker.defaultSize;\r\n SvgHelper.setAttributes(this._newMarkerOutline, [\r\n ['d', this._currentMarkerEditor.marker.getOutline()],\r\n ]);\r\n this._newMarkerOutline.style.transform = `translate(${\r\n localPoint.x - size.width / 2\r\n }px, ${localPoint.y - size.height / 2}px)`;\r\n }\r\n }\r\n\r\n private hideOutline() {\r\n if (this._mainCanvas?.contains(this._newMarkerOutline)) {\r\n this._mainCanvas.removeChild(this._newMarkerOutline);\r\n }\r\n }\r\n\r\n private onPointerUp(ev: PointerEvent) {\r\n if (this.touchPoints > 0) {\r\n this.touchPoints--;\r\n if (this.touchPoints === 0) {\r\n this.leadPointerId = undefined;\r\n }\r\n }\r\n if (this.touchPoints === 0) {\r\n if (\r\n this.isDragging &&\r\n (this._currentMarkerEditor !== undefined ||\r\n this._selectedMarkerEditors.length > 0)\r\n ) {\r\n const localPoint = SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n ev.clientX,\r\n ev.clientY,\r\n this.zoomLevel,\r\n );\r\n\r\n if (this._selectedMarkerEditors.length > 1) {\r\n this._selectedMarkerEditors.forEach((m) =>\r\n m.pointerUp(localPoint, ev),\r\n );\r\n this.adjustMarqueeSelectOutline();\r\n } else {\r\n this._currentMarkerEditor?.pointerUp(localPoint, ev);\r\n }\r\n\r\n this.hideOutline();\r\n\r\n this.addUndoStep();\r\n } else if (this.isSelecting) {\r\n // finish marquee selection\r\n this.finishMarqueeSelection();\r\n if (this._selectedMarkerEditors.length < 2) {\r\n this.hideMarqueeSelectOutline();\r\n if (this._selectedMarkerEditors.length === 1) {\r\n // revert to single selection\r\n const onlySelected = this._selectedMarkerEditors[0];\r\n this.deselectEditor();\r\n this.setCurrentEditor(onlySelected);\r\n }\r\n }\r\n }\r\n }\r\n this.isDragging = false;\r\n this.isSelecting = false;\r\n this.isPanning = false;\r\n if (this._mainCanvas) {\r\n this._mainCanvas.style.cursor = 'default';\r\n }\r\n }\r\n\r\n private finishMarqueeSelection() {\r\n this.deselectEditor();\r\n\r\n this.editors.forEach((m) => {\r\n const markerRect = m.marker.getBBox();\r\n if (\r\n markerRect.x <\r\n this._marqueeSelectRect.x + this._marqueeSelectRect.width &&\r\n markerRect.x + markerRect.width > this._marqueeSelectRect.x &&\r\n markerRect.y <\r\n this._marqueeSelectRect.y + this._marqueeSelectRect.height &&\r\n markerRect.y + markerRect.height > this._marqueeSelectRect.y\r\n ) {\r\n this.selectEditor(m);\r\n }\r\n });\r\n\r\n this.adjustMarqueeSelectOutline();\r\n }\r\n\r\n private adjustMarqueeSelectOutline() {\r\n let x = Number.MAX_VALUE;\r\n let y = Number.MAX_VALUE;\r\n let width = 0;\r\n let height = 0;\r\n\r\n this._selectedMarkerEditors.forEach((m) => {\r\n const markerRect = m.marker.getBBox();\r\n\r\n x = Math.min(x, markerRect.x);\r\n y = Math.min(y, markerRect.y);\r\n width = Math.max(width, markerRect.x + markerRect.width);\r\n height = Math.max(height, markerRect.y + markerRect.height);\r\n });\r\n\r\n if (this._selectedMarkerEditors.length > 1) {\r\n this._marqueeSelectRect.x = x;\r\n this._marqueeSelectRect.y = y;\r\n this._marqueeSelectRect.width = width - x;\r\n this._marqueeSelectRect.height = height - y;\r\n\r\n SvgHelper.setAttributes(this._marqueeSelectOutline, [\r\n ['x', `${this._marqueeSelectRect.x}`],\r\n ['y', `${this._marqueeSelectRect.y}`],\r\n ['width', `${this._marqueeSelectRect.width}`],\r\n ['height', `${this._marqueeSelectRect.height}`],\r\n ['pointer-events', ''],\r\n ]);\r\n } else {\r\n this.hideMarqueeSelectOutline();\r\n }\r\n }\r\n\r\n private hideMarqueeSelectOutline() {\r\n if (\r\n this._groupLayer &&\r\n this._groupLayer.contains(this._marqueeSelectOutline)\r\n ) {\r\n this._groupLayer.removeChild(this._marqueeSelectOutline);\r\n }\r\n }\r\n\r\n private onPointerOut(/*ev: PointerEvent*/) {\r\n if (this.touchPoints > 0) {\r\n this.touchPoints--;\r\n }\r\n this.hideOutline();\r\n }\r\n\r\n private onKeyUp(ev: KeyboardEvent) {\r\n if (\r\n this._currentMarkerEditor !== undefined &&\r\n (ev.key === 'Delete' || ev.key === 'Backspace')\r\n ) {\r\n // @todo\r\n // this.deleteSelectedMarker();\r\n }\r\n }\r\n\r\n private attachEvents() {\r\n // needed to distinguish when the element is in focus (active)\r\n if (!this.hasAttribute('tabindex')) {\r\n this.setAttribute('tabindex', '0');\r\n }\r\n\r\n // @todo\r\n // this.setupResizeObserver();\r\n this._mainCanvas?.addEventListener('pointerdown', this.onCanvasPointerDown);\r\n // workaround to prevent a bug with Apple Pencil\r\n // https://bugs.webkit.org/show_bug.cgi?id=217430\r\n this._mainCanvas?.addEventListener('touchmove', (ev) =>\r\n ev.preventDefault(),\r\n );\r\n this._mainCanvas?.addEventListener('dblclick', this.onCanvasDblClick);\r\n\r\n this._marqueeSelectOutline.addEventListener('dblclick', (ev) => {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.deselectEditor();\r\n this.hideMarqueeSelectOutline();\r\n });\r\n\r\n // @todo - using these in Diagrams but not in mjs2 - why?\r\n // this._mainCanvas?.addEventListener('pointermove', this.onCanvasPointerMove);\r\n // this._mainCanvas?.addEventListener('pointerup', this.onCanvasPointerUp);\r\n // this._mainCanvas?.addEventListener('pointerout', this.onCanvasPointerOut);\r\n this.attachWindowEvents();\r\n }\r\n\r\n private attachWindowEvents() {\r\n window.addEventListener('pointermove', this.onPointerMove);\r\n window.addEventListener('pointerup', this.onPointerUp);\r\n window.addEventListener('pointerleave', this.onPointerUp);\r\n window.addEventListener('pointercancel', this.onPointerOut);\r\n window.addEventListener('pointerout', this.onPointerOut);\r\n window.addEventListener('keyup', this.onKeyUp);\r\n }\r\n\r\n private detachEvents() {\r\n // @todo\r\n // if (this._resizeObserver && this._container) {\r\n // this._resizeObserver.unobserve(this._container);\r\n // }\r\n\r\n // this._mainCanvas?.removeEventListener(\r\n // 'pointerdown',\r\n // this.onCanvasPointerDown\r\n // );\r\n // this._mainCanvas?.removeEventListener(\r\n // 'pointerdown',\r\n // this.onCanvasPointerUp\r\n // );\r\n // this._mainCanvas?.removeEventListener('dblclick', this.onDblClick);\r\n this.detachWindowEvents();\r\n }\r\n\r\n private detachWindowEvents() {\r\n // @todo\r\n // window.removeEventListener('pointermove', this.onPointerMove);\r\n // window.removeEventListener('pointerup', this.onPointerUp);\r\n // window.removeEventListener('pointercancel', this.onPointerOut);\r\n // window.removeEventListener('pointerout', this.onPointerOut);\r\n // window.removeEventListener('pointerleave', this.onPointerUp);\r\n // window.removeEventListener('keyup', this.onKeyUp);\r\n }\r\n\r\n private getMarkerTypeByName(typeName: string): typeof MarkerBase | undefined {\r\n let result: typeof MarkerBase | undefined;\r\n this.markerEditors.forEach((value, key) => {\r\n if (key.typeName === typeName) {\r\n result = key;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Switches the marker area to select mode and deselects all the selected markers.\r\n */\r\n public switchToSelectMode() {\r\n this.setCurrentEditor();\r\n if (this._mainCanvas) {\r\n this._mainCanvas.style.cursor = 'default';\r\n }\r\n }\r\n\r\n /**\r\n * Returns the annotation state.\r\n * @returns\r\n */\r\n public getState(): AnnotationState {\r\n const result: AnnotationState = {\r\n version: 3,\r\n width: this.targetWidth,\r\n height: this.targetHeight,\r\n defaultFilter: this.defaultFilter,\r\n\r\n markers: this.editors.map((editor) => {\r\n return editor.getState();\r\n }),\r\n };\r\n\r\n return JSON.parse(JSON.stringify(result));\r\n }\r\n\r\n private _stateToRestore: AnnotationState | undefined;\r\n /**\r\n * Restores the annotation from the previously saved state.\r\n * @param state\r\n * @param addUndoStep if true (default) or omitted, an undo step is added after restoring the state\r\n */\r\n public restoreState(state: AnnotationState, addUndoStep = true): void {\r\n // can't restore if image is not loaded yet\r\n if (!this._targetImageLoaded) {\r\n this._stateToRestore = state;\r\n return;\r\n }\r\n this._stateToRestore = undefined;\r\n\r\n const stateCopy: AnnotationState = JSON.parse(JSON.stringify(state));\r\n this.editors.splice(0);\r\n\r\n if (this._mainCanvas && this._groupLayer) {\r\n // deselect everything\r\n this.hideMarqueeSelectOutline();\r\n this.deselectEditor();\r\n // remove all markers\r\n while (this._mainCanvas.lastChild) {\r\n this._mainCanvas.removeChild(this._mainCanvas.lastChild);\r\n }\r\n // re-add defs\r\n this.addDefsToMainCanvas();\r\n // re-add group layer\r\n this._mainCanvas.appendChild(this._groupLayer);\r\n }\r\n\r\n if (this.defaultFilter === undefined && stateCopy.defaultFilter) {\r\n this.defaultFilter = stateCopy.defaultFilter;\r\n }\r\n\r\n stateCopy.markers.forEach((markerState) => {\r\n const markerType = this.getMarkerTypeByName(markerState.typeName);\r\n if (markerType !== undefined) {\r\n const editorType = this.markerEditors.get(markerType);\r\n if (editorType !== undefined) {\r\n const markerEditor = this.addNewMarker(editorType, markerType);\r\n markerEditor.restoreState(markerState);\r\n this.editors.push(markerEditor);\r\n }\r\n }\r\n });\r\n\r\n if (\r\n stateCopy.width &&\r\n stateCopy.height &&\r\n (stateCopy.width !== this.targetWidth ||\r\n stateCopy.height !== this.targetHeight)\r\n ) {\r\n this.scaleMarkers(\r\n this.targetWidth / stateCopy.width,\r\n this.targetHeight / stateCopy.height,\r\n );\r\n }\r\n\r\n if (addUndoStep) {\r\n this.addUndoStep();\r\n }\r\n\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerAreaEventData>('arearestorestate', {\r\n detail: { markerArea: this },\r\n }),\r\n );\r\n }\r\n\r\n private scaleMarkers(scaleX: number, scaleY: number) {\r\n let preScaleSelectedMarker: MarkerBaseEditor | undefined;\r\n // @todo\r\n // if (!(this._currentMarker && this._currentMarker instanceof TextMarker)) {\r\n // can't unselect text marker as it would hide keyboard on mobile\r\n // eslint-disable-next-line prefer-const\r\n preScaleSelectedMarker = this._currentMarkerEditor;\r\n this.setCurrentEditor();\r\n // } else {\r\n // this._currentMarker.scale(scaleX, scaleY);\r\n // }\r\n this.editors.forEach((editor) => {\r\n if (editor !== this._currentMarkerEditor) {\r\n editor.scale(scaleX, scaleY);\r\n }\r\n });\r\n if (preScaleSelectedMarker !== undefined) {\r\n this.setCurrentEditor(preScaleSelectedMarker);\r\n }\r\n }\r\n\r\n /**\r\n * NOTE:\r\n *\r\n * before removing or modifying this method please consider supporting marker.js\r\n * by visiting https://markerjs.com/ for details\r\n *\r\n * thank you!\r\n */\r\n private toggleLogo() {\r\n if (!Activator.isLicensed('MJS3E') && !Activator.isLicensed('MJS3')) {\r\n // NOTE:\r\n // before removing this call please consider supporting marker.js\r\n // by visiting https://markerjs.com/ for details\r\n // thank you!\r\n this.addLogo();\r\n } else {\r\n this.removeLogo();\r\n }\r\n }\r\n\r\n private addLogo() {\r\n if (this._logoUI !== undefined) {\r\n this._contentContainer?.removeChild(this._logoUI);\r\n }\r\n this._logoUI = document.createElement('div');\r\n this._logoUI.style.display = 'inline-block';\r\n this._logoUI.style.margin = '0px';\r\n this._logoUI.style.padding = '0px';\r\n this._logoUI.style.fill = '#333333';\r\n this._logoUI.style.opacity = '0.5';\r\n const logoUI = this._logoUI;\r\n this._logoUI.addEventListener('mouseenter', () => {\r\n logoUI.style.opacity = '1';\r\n });\r\n this._logoUI.addEventListener('mouseleave', () => {\r\n logoUI.style.opacity = '0.5';\r\n });\r\n\r\n const link = document.createElement('a');\r\n link.href = 'https://markerjs.com/';\r\n link.target = '_blank';\r\n link.innerHTML = Logo;\r\n link.title = 'Powered by marker.js';\r\n\r\n link.style.display = 'grid';\r\n link.style.alignItems = 'center';\r\n link.style.justifyItems = 'center';\r\n link.style.padding = '3px';\r\n link.style.width = '20px';\r\n link.style.height = '20px';\r\n link.style.cursor = 'pointer';\r\n\r\n this._logoUI.appendChild(link);\r\n\r\n this._contentContainer?.appendChild(this._logoUI);\r\n\r\n this._logoUI.style.position = 'absolute';\r\n this._logoUI.style.pointerEvents = 'all';\r\n this.positionLogo();\r\n }\r\n\r\n private removeLogo() {\r\n if (\r\n this._contentContainer &&\r\n this._logoUI !== undefined &&\r\n this._contentContainer.contains(this._logoUI)\r\n ) {\r\n this._contentContainer.removeChild(this._logoUI);\r\n }\r\n }\r\n\r\n private positionLogo() {\r\n if (this._logoUI && this._contentContainer) {\r\n this._logoUI.style.left = `20px`;\r\n this._logoUI.style.bottom = `20px`;\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if undo operation can be performed (undo stack is not empty).\r\n */\r\n public get isUndoPossible(): boolean {\r\n if (this.undoRedoManager && this.undoRedoManager.isUndoPossible) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if redo operation can be performed (redo stack is not empty).\r\n */\r\n public get isRedoPossible(): boolean {\r\n if (this.undoRedoManager && this.undoRedoManager.isRedoPossible) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n private addUndoStep() {\r\n if (\r\n this._currentMarkerEditor === undefined ||\r\n this._currentMarkerEditor.state !== 'edit'\r\n ) {\r\n const currentState = this.getState();\r\n const lastUndoState = this.undoRedoManager.getLastUndoStep();\r\n if (\r\n lastUndoState &&\r\n (lastUndoState.width !== currentState.width ||\r\n lastUndoState.height !== currentState.height)\r\n ) {\r\n // if the size changed just replace the last step with a resized one\r\n this.undoRedoManager.replaceLastUndoStep(currentState);\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerAreaEventData>('areastatechange', {\r\n detail: { markerArea: this },\r\n }),\r\n );\r\n } else {\r\n const stepAdded = this.undoRedoManager.addUndoStep(currentState);\r\n if (stepAdded) {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerAreaEventData>('areastatechange', {\r\n detail: { markerArea: this },\r\n }),\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Undo last action.\r\n */\r\n public undo(): void {\r\n // this.addUndoStep(); // this seems illogical, but it was here for some reason, commenting for now in case regressions occur\r\n this.undoStep();\r\n }\r\n\r\n private undoStep(): void {\r\n const stepData = this.undoRedoManager.undo();\r\n if (stepData !== undefined) {\r\n this.restoreState(stepData, false);\r\n }\r\n }\r\n\r\n /**\r\n * Redo previously undone action.\r\n */\r\n public redo(): void {\r\n this.redoStep();\r\n }\r\n\r\n private redoStep(): void {\r\n const stepData = this.undoRedoManager.redo();\r\n if (stepData !== undefined) {\r\n this.restoreState(stepData, false);\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerAreaEventData>('areastatechange', {\r\n detail: { markerArea: this },\r\n }),\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Adds \"defs\" to main canvas SVG.\r\n * Useful for filters, custom fonts and potentially other scenarios.\r\n *\r\n * @param nodes\r\n * @since 3.3.0\r\n */\r\n public addDefs(...nodes: (string | Node)[]): void {\r\n this._defs.push(...nodes);\r\n\r\n if (this._defsElement) {\r\n this._defsElement.append(...nodes);\r\n }\r\n }\r\n\r\n addEventListener<T extends keyof MarkerAreaEventMap>(\r\n // the event name, a key of MarkerAreaEventMap\r\n type: T,\r\n\r\n // the listener, using a value of MarkerAreaEventMap\r\n listener: (this: MarkerArea, ev: MarkerAreaEventMap[T]) => void,\r\n\r\n // any options\r\n options?: boolean | AddEventListenerOptions,\r\n ): void;\r\n addEventListener<K extends keyof HTMLElementEventMap>(\r\n type: K,\r\n listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => void,\r\n options?: boolean | AddEventListenerOptions | undefined,\r\n ): void;\r\n addEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject,\r\n options?: boolean | AddEventListenerOptions | undefined,\r\n ): void {\r\n super.addEventListener(type, listener, options);\r\n }\r\n\r\n removeEventListener<T extends keyof MarkerAreaEventMap>(\r\n // the event name, a key of MarkerAreaEventMap\r\n type: T,\r\n\r\n // the listener, using a value of MarkerAreaEventMap\r\n listener: (this: MarkerArea, ev: MarkerAreaEventMap[T]) => void,\r\n\r\n // any options\r\n options?: boolean | EventListenerOptions,\r\n ): void;\r\n removeEventListener<K extends keyof HTMLElementEventMap>(\r\n type: K,\r\n listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => void,\r\n options?: boolean | EventListenerOptions | undefined,\r\n ): void;\r\n removeEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject,\r\n options?: boolean | EventListenerOptions | undefined,\r\n ): void {\r\n super.removeEventListener(type, listener, options);\r\n }\r\n}\r\n","/**\r\n * @module Editor\r\n * @category API Reference\r\n */\r\nimport { MarkerArea } from './MarkerArea';\r\n\r\nexport {\r\n MarkerArea,\r\n MarkerAreaEventData,\r\n MarkerEditorEventData,\r\n MarkerAreaMode,\r\n MarkerAreaEventMap,\r\n} from './MarkerArea';\r\nexport {\r\n MarkerBaseEditor,\r\n MarkerEditorState,\r\n MarkerCreationStyle,\r\n} from './editor/MarkerBaseEditor';\r\nexport { MarkerEditorProperties } from './editor/MarkerEditorProperties';\r\nexport { Grip, GripLocation } from './editor/Grip';\r\nexport { ResizeGrip } from './editor/ResizeGrip';\r\nexport { RotateGrip } from './editor/RotateGrip';\r\nexport { ShapeOutlineMarkerEditor } from './editor/ShapeOutlineMarkerEditor';\r\nexport { ShapeMarkerEditor } from './editor/ShapeMarkerEditor';\r\nexport { LinearMarkerEditor } from './editor/LinearMarkerEditor';\r\nexport { PolygonMarkerEditor } from './editor/PolygonMarkerEditor';\r\nexport { FreehandMarkerEditor } from './editor/FreehandMarkerEditor';\r\nexport {\r\n TextBlockEditor,\r\n BlurHandler,\r\n TextChangedHandler,\r\n} from './editor/TextBlockEditor';\r\nexport { TextMarkerEditor } from './editor/TextMarkerEditor';\r\nexport { ArrowMarkerEditor } from './editor/ArrowMarkerEditor';\r\nexport { CalloutMarkerEditor } from './editor/CalloutMarkerEditor';\r\nexport { ImageMarkerEditor } from './editor/ImageMarkerEditor';\r\nexport { CaptionFrameMarkerEditor } from './editor/CaptionFrameMarkerEditor';\r\nexport { CurveMarkerEditor } from './editor/CurveMarkerEditor';\r\n\r\nif (\r\n window &&\r\n window.customElements &&\r\n window.customElements.get('mjs-marker-area') === undefined\r\n) {\r\n window.customElements.define('mjs-marker-area', MarkerArea);\r\n}\r\n","import {\r\n AnnotationState,\r\n CoverMarker,\r\n FrameMarker,\r\n FreehandMarker,\r\n HighlightMarker,\r\n MarkerBase,\r\n PolygonMarker,\r\n SvgHelper,\r\n TextMarker,\r\n LineMarker,\r\n MeasurementMarker,\r\n ArrowMarker,\r\n EllipseFrameMarker,\r\n EllipseMarker,\r\n CustomImageMarker,\r\n CheckImageMarker,\r\n XImageMarker,\r\n CaptionFrameMarker,\r\n CalloutMarker,\r\n CurveMarker,\r\n HighlighterMarker,\r\n SvgFilters,\r\n IPoint,\r\n} from './core';\r\nimport { Activator } from './core/Activator';\r\n\r\nimport Logo from './assets/markerjs-logo-m.svg';\r\n\r\n/**\r\n * Event map for {@link MarkerView}.\r\n */\r\nexport interface MarkerViewEventMap {\r\n /**\r\n * Viewer initialized.\r\n */\r\n viewinit: CustomEvent<MarkerViewEventData>;\r\n\r\n /**\r\n * Viewer shown.\r\n */\r\n viewshow: CustomEvent<MarkerViewEventData>;\r\n\r\n /**\r\n * Viewer state restored.\r\n */\r\n viewrestorestate: CustomEvent<MarkerViewEventData>;\r\n\r\n /**\r\n * Marker clicked.\r\n */\r\n markerclick: CustomEvent<MarkerEventData>;\r\n /**\r\n * Marker mouse over.\r\n */\r\n markerover: CustomEvent<MarkerEventData>;\r\n /**\r\n * Marker pointer down.\r\n */\r\n markerpointerdown: CustomEvent<MarkerEventData>;\r\n /**\r\n * Marker pointer move.\r\n */\r\n markerpointermove: CustomEvent<MarkerEventData>;\r\n /**\r\n * Marker pointer up.\r\n */\r\n markerpointerup: CustomEvent<MarkerEventData>;\r\n /**\r\n * Marker pointer enter.\r\n */\r\n markerpointerenter: CustomEvent<MarkerEventData>;\r\n /**\r\n * Marker pointer leave.\r\n */\r\n markerpointerleave: CustomEvent<MarkerEventData>;\r\n}\r\n\r\n/**\r\n * Event data for {@link MarkerView}.\r\n */\r\nexport interface MarkerViewEventData {\r\n /**\r\n * {@link MarkerView} instance.\r\n */\r\n markerView: MarkerView;\r\n}\r\n\r\n/**\r\n * Marker custom event data.\r\n */\r\nexport interface MarkerEventData extends MarkerViewEventData {\r\n /**\r\n * Marker instance.\r\n */\r\n marker: MarkerBase;\r\n}\r\n\r\n/**\r\n * MarkerView is the main annotation viewer web component.\r\n *\r\n * @summary\r\n * The main annotation viewer web component.\r\n *\r\n * @group Components\r\n *\r\n * @example\r\n * To show dynamic annotation overlays on top of the original image you use `MarkerView`.\r\n * ```js\r\n * import { MarkerView } from '@markerjs/markerjs3';\r\n *\r\n * const markerView = new MarkerView();\r\n * markerView.targetImage = targetImg;\r\n * viewerContainer.appendChild(markerView);\r\n *\r\n * markerView.show(savedState);\r\n * ```\r\n */\r\nexport class MarkerView extends HTMLElement {\r\n private _contentContainer?: HTMLDivElement;\r\n private _canvasContainer?: HTMLDivElement;\r\n\r\n private _mainCanvas?: SVGSVGElement;\r\n private _groupLayer?: SVGGElement;\r\n\r\n private _editingTarget?: HTMLImageElement;\r\n\r\n private width = 0;\r\n private height = 0;\r\n\r\n private _targetWidth = -1;\r\n /**\r\n * Returns the target image width.\r\n */\r\n public get targetWidth() {\r\n return this._targetWidth;\r\n }\r\n /**\r\n * Sets the target image width.\r\n */\r\n public set targetWidth(value) {\r\n this._targetWidth = value;\r\n this.setMainCanvasSize();\r\n }\r\n private _targetHeight = -1;\r\n /**\r\n * Returns the target image height.\r\n */\r\n public get targetHeight() {\r\n return this._targetHeight;\r\n }\r\n /**\r\n * Sets the target image height.\r\n */\r\n public set targetHeight(value) {\r\n this._targetHeight = value;\r\n this.setMainCanvasSize();\r\n }\r\n\r\n private _targetImageLoaded = false;\r\n private _targetImage: HTMLImageElement | undefined;\r\n /**\r\n * Returns the target image.\r\n */\r\n public get targetImage(): HTMLImageElement | undefined {\r\n return this._targetImage;\r\n }\r\n /**\r\n * Sets the target image.\r\n */\r\n public set targetImage(value: HTMLImageElement | undefined) {\r\n this._targetImage = value;\r\n this._targetImageLoaded = false;\r\n if (value !== undefined) {\r\n this.addTargetImage();\r\n }\r\n }\r\n\r\n /**\r\n * Marker types available for the viewer.\r\n */\r\n public markerTypes: Array<typeof MarkerBase> = [];\r\n\r\n /**\r\n * Collection of markers currently displayed on the viewer.\r\n */\r\n public markers: MarkerBase[] = [];\r\n\r\n private _logoUI?: HTMLElement;\r\n\r\n private _zoomLevel = 1;\r\n /**\r\n * Returns the current zoom level.\r\n */\r\n public get zoomLevel(): number {\r\n return this._zoomLevel;\r\n }\r\n /**\r\n * Sets the current zoom level.\r\n */\r\n public set zoomLevel(value: number) {\r\n this._zoomLevel = value;\r\n if (this._canvasContainer && this._contentContainer && this._mainCanvas) {\r\n this._mainCanvas.style.transform = `scale(${this._zoomLevel})`;\r\n this.setEditingTargetSize();\r\n\r\n const scrollMultiplier = Math.max(this._zoomLevel, 1);\r\n this._canvasContainer.scrollTo({\r\n left:\r\n (this._mainCanvas.clientWidth * scrollMultiplier -\r\n this._canvasContainer.clientWidth) /\r\n 2,\r\n top:\r\n (this._mainCanvas.clientHeight * scrollMultiplier -\r\n this._canvasContainer.clientHeight) /\r\n 2,\r\n });\r\n }\r\n }\r\n\r\n private _defaultFilter?: string;\r\n /**\r\n * Returns the default SVG filter for the created markers.\r\n *\r\n * @since 3.2.0\r\n */\r\n public get defaultFilter(): string | undefined {\r\n return this._defaultFilter;\r\n }\r\n /**\r\n * Sets the default SVG filter for the created markers\r\n * (e.g. \"drop-shadow(2px 2px 2px black)\").\r\n *\r\n * @since 3.2.0\r\n */\r\n public set defaultFilter(value: string | undefined) {\r\n this._defaultFilter = value;\r\n }\r\n\r\n private _isInitialized = false;\r\n\r\n private _defsElement?: SVGDefsElement;\r\n private _defs: (string | Node)[] = [];\r\n\r\n private prevPanPoint: IPoint = { x: 0, y: 0 };\r\n\r\n constructor() {\r\n super();\r\n\r\n this.markerTypes = [\r\n FrameMarker,\r\n LineMarker,\r\n ArrowMarker,\r\n MeasurementMarker,\r\n PolygonMarker,\r\n FreehandMarker,\r\n TextMarker,\r\n CoverMarker,\r\n HighlightMarker,\r\n CalloutMarker,\r\n EllipseFrameMarker,\r\n EllipseMarker,\r\n CustomImageMarker,\r\n CheckImageMarker,\r\n XImageMarker,\r\n CaptionFrameMarker,\r\n CurveMarker,\r\n HighlighterMarker,\r\n ];\r\n\r\n this.connectedCallback = this.connectedCallback.bind(this);\r\n this.disconnectedCallback = this.disconnectedCallback.bind(this);\r\n\r\n this.createLayout = this.createLayout.bind(this);\r\n this.addMainCanvas = this.addMainCanvas.bind(this);\r\n this.setMainCanvasSize = this.setMainCanvasSize.bind(this);\r\n this.setEditingTargetSize = this.setEditingTargetSize.bind(this);\r\n this.addTargetImage = this.addTargetImage.bind(this);\r\n\r\n this.attachMarkerEvents = this.attachMarkerEvents.bind(this);\r\n this.attachEvents = this.attachEvents.bind(this);\r\n this.attachWindowEvents = this.attachWindowEvents.bind(this);\r\n this.detachEvents = this.detachEvents.bind(this);\r\n this.detachWindowEvents = this.detachWindowEvents.bind(this);\r\n\r\n this.onCanvasPointerDown = this.onCanvasPointerDown.bind(this);\r\n this.onPointerMove = this.onPointerMove.bind(this);\r\n this.onPointerUp = this.onPointerUp.bind(this);\r\n this.onPointerOut = this.onPointerOut.bind(this);\r\n\r\n this.addNewMarker = this.addNewMarker.bind(this);\r\n\r\n this.show = this.show.bind(this);\r\n this.scaleMarkers = this.scaleMarkers.bind(this);\r\n\r\n this.toggleLogo = this.toggleLogo.bind(this);\r\n this.addLogo = this.addLogo.bind(this);\r\n this.removeLogo = this.removeLogo.bind(this);\r\n\r\n this.addDefs = this.addDefs.bind(this);\r\n this.addDefaultFilterDefs = this.addDefaultFilterDefs.bind(this);\r\n\r\n this.attachShadow({ mode: 'open' });\r\n }\r\n\r\n private connectedCallback() {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerViewEventData>('viewinit', {\r\n detail: { markerView: this },\r\n }),\r\n );\r\n Activator.addKeyAddListener(this.toggleLogo);\r\n this.createLayout();\r\n this.addMainCanvas();\r\n this.attachEvents();\r\n this._isInitialized = true;\r\n if (this.targetImage !== undefined) {\r\n this.addTargetImage();\r\n }\r\n this.setMainCanvasSize();\r\n this.addDefaultFilterDefs();\r\n this.toggleLogo();\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerViewEventData>('viewshow', {\r\n detail: { markerView: this },\r\n }),\r\n );\r\n }\r\n\r\n private disconnectedCallback() {\r\n this.detachEvents();\r\n }\r\n\r\n private createLayout() {\r\n this.style.display = 'flex';\r\n this.style.width = this.style.width !== '' ? this.style.width : '100%';\r\n this.style.height = this.style.height !== '' ? this.style.height : '100%';\r\n this.style.position = 'relative';\r\n\r\n this._contentContainer = document.createElement('div');\r\n this._contentContainer.style.display = 'flex';\r\n this._contentContainer.style.position = 'relative';\r\n this._contentContainer.style.flexGrow = '2';\r\n this._contentContainer.style.flexShrink = '1';\r\n this._contentContainer.style.overflow = 'hidden';\r\n\r\n this._canvasContainer = document.createElement('div');\r\n this._canvasContainer.style.touchAction = 'pinch-zoom';\r\n this._canvasContainer.className = 'canvas-container';\r\n this._canvasContainer.style.display = 'grid';\r\n this._canvasContainer.style.gridTemplateColumns = '1fr';\r\n this._canvasContainer.style.flexGrow = '2';\r\n this._canvasContainer.style.flexShrink = '2';\r\n this._canvasContainer.style.justifyItems = 'center';\r\n this._canvasContainer.style.alignItems = 'center';\r\n this._canvasContainer.style.overflow = 'auto';\r\n this._contentContainer.appendChild(this._canvasContainer);\r\n\r\n this.shadowRoot?.appendChild(this._contentContainer);\r\n }\r\n\r\n private addMainCanvas() {\r\n this.width = this._contentContainer?.clientWidth || 0;\r\n this.height = this._contentContainer?.clientHeight || 0;\r\n\r\n this._mainCanvas = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'svg',\r\n );\r\n this._mainCanvas.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\r\n this.setMainCanvasSize();\r\n this._mainCanvas.style.gridColumnStart = '1';\r\n this._mainCanvas.style.gridRowStart = '1';\r\n this._mainCanvas.style.pointerEvents = 'auto';\r\n // this._mainCanvas.style.backgroundColor = 'pink'; // @todo\r\n // this._mainCanvas.style.opacity = '0.3'; // @todo\r\n this._mainCanvas.style.margin = '10px';\r\n this._mainCanvas.style.transform = `scale(${this._zoomLevel})`;\r\n\r\n this.addDefsToMainCanvas();\r\n\r\n this._groupLayer = SvgHelper.createGroup();\r\n\r\n this._mainCanvas.appendChild(this._groupLayer);\r\n\r\n this._canvasContainer?.appendChild(this._mainCanvas);\r\n }\r\n\r\n private addDefsToMainCanvas() {\r\n this._defsElement = SvgHelper.createDefs();\r\n this._mainCanvas?.appendChild(this._defsElement);\r\n this._defsElement.append(...this._defs);\r\n }\r\n\r\n private setMainCanvasSize() {\r\n if (\r\n this._mainCanvas !== undefined &&\r\n this._targetHeight > 0 &&\r\n this._targetWidth > 0\r\n ) {\r\n this._mainCanvas.style.width = `${this._targetWidth * this.zoomLevel}px`;\r\n this._mainCanvas.style.height = `${\r\n this._targetHeight * this.zoomLevel\r\n }px`;\r\n this._mainCanvas.setAttribute(\r\n 'width',\r\n `${this._targetWidth * this.zoomLevel}`,\r\n );\r\n this._mainCanvas.setAttribute(\r\n 'height',\r\n `${this._targetHeight * this.zoomLevel}`,\r\n );\r\n this._mainCanvas.setAttribute(\r\n 'viewBox',\r\n '0 0 ' +\r\n this._targetWidth.toString() +\r\n ' ' +\r\n this._targetHeight.toString(),\r\n );\r\n this.setEditingTargetSize();\r\n }\r\n }\r\n\r\n private setEditingTargetSize() {\r\n if (this._editingTarget !== undefined) {\r\n this._editingTarget.width = this._targetWidth * this.zoomLevel;\r\n this._editingTarget.height = this._targetHeight * this.zoomLevel;\r\n this._editingTarget.style.width = `${\r\n this._targetWidth * this.zoomLevel\r\n }px`;\r\n this._editingTarget.style.height = `${\r\n this._targetHeight * this.zoomLevel\r\n }px`;\r\n }\r\n }\r\n\r\n private addTargetImage() {\r\n if (\r\n this._isInitialized &&\r\n this._editingTarget === undefined &&\r\n this.targetImage !== undefined &&\r\n this._canvasContainer !== undefined &&\r\n this._mainCanvas !== undefined\r\n ) {\r\n this._editingTarget = document.createElement('img');\r\n\r\n this._targetWidth =\r\n this._targetWidth > 0\r\n ? this._targetWidth\r\n : this.targetImage.clientWidth;\r\n this._targetHeight =\r\n this._targetHeight > 0\r\n ? this._targetHeight\r\n : this.targetImage.clientHeight;\r\n\r\n this._editingTarget.addEventListener('load', (ev) => {\r\n if (this._editingTarget !== undefined) {\r\n if (this._targetHeight <= 0 || this._targetWidth <= 0) {\r\n const img = <HTMLImageElement>ev.target;\r\n\r\n const aspectRatio = img.naturalWidth / img.naturalHeight;\r\n const calculatedWidth =\r\n this._targetWidth > 0\r\n ? this._targetWidth\r\n : this._targetHeight > 0\r\n ? this._targetHeight * aspectRatio\r\n : img.clientWidth > 0\r\n ? img.clientWidth\r\n : img.naturalWidth;\r\n const calculatedHeight =\r\n this._targetHeight > 0\r\n ? this._targetHeight\r\n : this._targetWidth > 0\r\n ? this._targetWidth / aspectRatio\r\n : img.clientHeight > 0\r\n ? img.clientHeight\r\n : img.naturalHeight;\r\n\r\n this._targetWidth = calculatedWidth;\r\n this._targetHeight = calculatedHeight;\r\n }\r\n this._editingTarget.width = this._targetWidth;\r\n this._editingTarget.height = this._targetHeight;\r\n this._editingTarget.style.width = `${this._targetWidth}px`;\r\n this._editingTarget.style.height = `${this._targetHeight}px`;\r\n this._editingTarget.style.gridColumnStart = '1';\r\n this._editingTarget.style.gridRowStart = '1';\r\n\r\n this.setMainCanvasSize();\r\n\r\n this._targetImageLoaded = true;\r\n if (this._stateToRestore !== undefined) {\r\n this.show(this._stateToRestore);\r\n }\r\n }\r\n\r\n // reset zoom to scroll to center if needed\r\n this.zoomLevel = this._zoomLevel;\r\n });\r\n this._editingTarget.src = this.targetImage.src;\r\n\r\n this._canvasContainer.insertBefore(this._editingTarget, this._mainCanvas);\r\n }\r\n }\r\n\r\n private addDefaultFilterDefs() {\r\n this.addDefs(...SvgFilters.getDefaultFilterSet());\r\n }\r\n\r\n private addNewMarker(markerType: typeof MarkerBase): MarkerBase {\r\n if (this._mainCanvas === undefined) {\r\n throw new Error('Main canvas is not initialized.');\r\n }\r\n\r\n const g = SvgHelper.createGroup();\r\n if (this.defaultFilter && markerType.applyDefaultFilter) {\r\n g.setAttribute('filter', this.defaultFilter);\r\n }\r\n this._mainCanvas.appendChild(g);\r\n\r\n const newMarker = new markerType(g);\r\n\r\n this.attachMarkerEvents(newMarker);\r\n\r\n return newMarker;\r\n }\r\n\r\n private attachMarkerEvents(marker: MarkerBase) {\r\n marker.container.addEventListener('click', () => {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEventData>('markerclick', {\r\n detail: { marker: marker, markerView: this },\r\n }),\r\n );\r\n });\r\n marker.container.addEventListener('pointerover', () => {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEventData>('markerover', {\r\n detail: { marker: marker, markerView: this },\r\n }),\r\n );\r\n });\r\n marker.container.addEventListener('pointerdown', () => {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEventData>('markerpointerdown', {\r\n detail: { marker: marker, markerView: this },\r\n }),\r\n );\r\n });\r\n marker.container.addEventListener('pointermove', () => {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEventData>('markerpointermove', {\r\n detail: { marker: marker, markerView: this },\r\n }),\r\n );\r\n });\r\n marker.container.addEventListener('pointerup', () => {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEventData>('markerpointerup', {\r\n detail: { marker: marker, markerView: this },\r\n }),\r\n );\r\n });\r\n marker.container.addEventListener('pointerenter', () => {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEventData>('markerpointerenter', {\r\n detail: { marker: marker, markerView: this },\r\n }),\r\n );\r\n });\r\n marker.container.addEventListener('pointerleave', () => {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEventData>('markerpointerleave', {\r\n detail: { marker: marker, markerView: this },\r\n }),\r\n );\r\n });\r\n }\r\n\r\n private attachEvents() {\r\n // needed to distinguish when the element is in focus (active)\r\n if (!this.hasAttribute('tabindex')) {\r\n this.setAttribute('tabindex', '0');\r\n }\r\n\r\n // @todo\r\n // this.setupResizeObserver();\r\n\r\n this._mainCanvas?.addEventListener('pointerdown', this.onCanvasPointerDown);\r\n // workaround to prevent a bug with Apple Pencil\r\n // https://bugs.webkit.org/show_bug.cgi?id=217430\r\n this._mainCanvas?.addEventListener('touchmove', (ev) =>\r\n ev.preventDefault(),\r\n );\r\n\r\n this.attachWindowEvents();\r\n }\r\n\r\n private attachWindowEvents() {\r\n window.addEventListener('pointermove', this.onPointerMove);\r\n window.addEventListener('pointerup', this.onPointerUp);\r\n window.addEventListener('pointerleave', this.onPointerUp);\r\n window.addEventListener('pointercancel', this.onPointerOut);\r\n window.addEventListener('pointerout', this.onPointerOut);\r\n }\r\n\r\n private detachEvents() {\r\n // @todo\r\n // if (this._resizeObserver && this._container) {\r\n // this._resizeObserver.unobserve(this._container);\r\n // }\r\n // this._mainCanvas?.removeEventListener('pointerdown', this.onPointerDown);\r\n // this._mainCanvas?.removeEventListener(\r\n // 'pointerdown',\r\n // this.onStencilPointerUp\r\n // );\r\n this.detachWindowEvents();\r\n }\r\n\r\n private detachWindowEvents() {\r\n // @todo\r\n // window.removeEventListener('pointermove', this.onPointerMove);\r\n // window.removeEventListener('pointerup', this.onPointerUp);\r\n // window.removeEventListener('pointercancel', this.onPointerOut);\r\n // window.removeEventListener('pointerout', this.onPointerOut);\r\n // window.removeEventListener('pointerleave', this.onPointerUp);\r\n }\r\n\r\n private touchPoints = 0;\r\n private leadPointerId?: number;\r\n\r\n private onCanvasPointerDown(ev: PointerEvent) {\r\n // @todo ?\r\n // if (!this._isFocused) {\r\n // this.focus();\r\n // }\r\n\r\n this.touchPoints++;\r\n if (this.touchPoints === 1) {\r\n this.leadPointerId = ev.pointerId;\r\n this.prevPanPoint = { x: ev.clientX, y: ev.clientY };\r\n if (this._mainCanvas) {\r\n this._mainCanvas.style.cursor = 'grabbing';\r\n }\r\n }\r\n }\r\n\r\n private onPointerMove(ev: PointerEvent) {\r\n if (this.touchPoints > 0 && this.leadPointerId === ev.pointerId) {\r\n this.panTo({ x: ev.clientX, y: ev.clientY });\r\n }\r\n }\r\n\r\n private onPointerUp() {\r\n if (this.touchPoints > 0) {\r\n this.touchPoints--;\r\n if (this.touchPoints === 0) {\r\n this.leadPointerId = undefined;\r\n }\r\n\r\n if (this._mainCanvas) {\r\n this._mainCanvas.style.cursor = 'default';\r\n }\r\n }\r\n }\r\n\r\n private onPointerOut(/*ev: PointerEvent*/) {\r\n if (this.touchPoints > 0) {\r\n this.touchPoints--;\r\n }\r\n }\r\n\r\n private getMarkerTypeByName(typeName: string): typeof MarkerBase | undefined {\r\n let result: typeof MarkerBase | undefined;\r\n this.markerTypes.forEach((mType) => {\r\n if (mType.typeName === typeName) {\r\n result = mType;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Adds a new marker type to be available in the viewer.\r\n * @param markerType\r\n */\r\n public registerMarkerType(markerType: typeof MarkerBase): void {\r\n if (this.markerTypes.indexOf(markerType) < 0) {\r\n this.markerTypes.push(markerType);\r\n }\r\n }\r\n\r\n private _stateToRestore: AnnotationState | undefined;\r\n /**\r\n * Loads and shows previously saved annotation state.\r\n * @param state\r\n */\r\n public show(state: AnnotationState): void {\r\n // can't restore if image is not loaded yet\r\n if (!this._targetImageLoaded) {\r\n this._stateToRestore = state;\r\n return;\r\n }\r\n this._stateToRestore = undefined;\r\n\r\n const stateCopy: AnnotationState = JSON.parse(JSON.stringify(state));\r\n this.markers.splice(0);\r\n\r\n while (this._mainCanvas?.lastChild) {\r\n this._mainCanvas.removeChild(this._mainCanvas.lastChild);\r\n }\r\n\r\n // re-add defs\r\n this.addDefsToMainCanvas();\r\n\r\n if (this.defaultFilter === undefined && stateCopy.defaultFilter) {\r\n this.defaultFilter = stateCopy.defaultFilter;\r\n }\r\n\r\n stateCopy.markers.forEach((markerState) => {\r\n const markerType = this.getMarkerTypeByName(markerState.typeName);\r\n if (markerType !== undefined) {\r\n const marker = this.addNewMarker(markerType);\r\n marker.restoreState(markerState);\r\n this.markers.push(marker);\r\n }\r\n });\r\n\r\n if (\r\n stateCopy.width &&\r\n stateCopy.height &&\r\n (stateCopy.width !== this.targetWidth ||\r\n stateCopy.height !== this.targetHeight)\r\n ) {\r\n this.scaleMarkers(\r\n this.targetWidth / stateCopy.width,\r\n this.targetHeight / stateCopy.height,\r\n );\r\n }\r\n\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerViewEventData>('viewrestorestate', {\r\n detail: { markerView: this },\r\n }),\r\n );\r\n }\r\n\r\n private scaleMarkers(scaleX: number, scaleY: number) {\r\n this.markers.forEach((marker) => {\r\n marker.scale(scaleX, scaleY);\r\n });\r\n }\r\n\r\n private panTo(point: IPoint) {\r\n this._canvasContainer?.scrollBy({\r\n left: this.prevPanPoint.x - point.x,\r\n top: this.prevPanPoint.y - point.y,\r\n });\r\n this.prevPanPoint = point;\r\n }\r\n\r\n /**\r\n * NOTE:\r\n *\r\n * before removing or modifying this method please consider supporting marker.js\r\n * by visiting https://markerjs.com/buy for details\r\n *\r\n * thank you!\r\n */\r\n private toggleLogo() {\r\n if (!Activator.isLicensed('MJS3V') && !Activator.isLicensed('MJS3')) {\r\n // NOTE:\r\n // before removing this call please consider supporting marker.js\r\n // by visiting https://markerjs.com/ for details\r\n // thank you!\r\n this.addLogo();\r\n } else {\r\n this.removeLogo();\r\n }\r\n }\r\n\r\n private addLogo() {\r\n if (this._logoUI !== undefined) {\r\n this._contentContainer?.removeChild(this._logoUI);\r\n }\r\n this._logoUI = document.createElement('div');\r\n this._logoUI.style.display = 'inline-block';\r\n this._logoUI.style.margin = '0px';\r\n this._logoUI.style.padding = '0px';\r\n this._logoUI.style.fill = '#333333';\r\n this._logoUI.style.opacity = '0.5';\r\n const logoUI = this._logoUI;\r\n this._logoUI.addEventListener('mouseenter', () => {\r\n logoUI.style.opacity = '1';\r\n });\r\n this._logoUI.addEventListener('mouseleave', () => {\r\n logoUI.style.opacity = '0.5';\r\n });\r\n\r\n const link = document.createElement('a');\r\n link.href = 'https://markerjs.com/';\r\n link.target = '_blank';\r\n link.innerHTML = Logo;\r\n link.title = 'Powered by marker.js';\r\n\r\n link.style.display = 'grid';\r\n link.style.alignItems = 'center';\r\n link.style.justifyItems = 'center';\r\n link.style.padding = '3px';\r\n link.style.width = '20px';\r\n link.style.height = '20px';\r\n link.style.cursor = 'pointer';\r\n\r\n this._logoUI.appendChild(link);\r\n\r\n this._contentContainer?.appendChild(this._logoUI);\r\n\r\n this._logoUI.style.position = 'absolute';\r\n this._logoUI.style.pointerEvents = 'all';\r\n this.positionLogo();\r\n }\r\n\r\n private removeLogo() {\r\n if (\r\n this._contentContainer &&\r\n this._logoUI !== undefined &&\r\n this._contentContainer.contains(this._logoUI)\r\n ) {\r\n this._contentContainer.removeChild(this._logoUI);\r\n }\r\n }\r\n\r\n private positionLogo() {\r\n if (this._logoUI && this._contentContainer) {\r\n this._logoUI.style.left = `20px`;\r\n this._logoUI.style.bottom = `20px`;\r\n }\r\n }\r\n\r\n /**\r\n * Adds \"defs\" to main canvas SVG.\r\n * Useful for filters, custom fonts and potentially other scenarios.\r\n * @since 3.3.0\r\n */\r\n public addDefs(...nodes: (string | Node)[]): void {\r\n this._defs.push(...nodes);\r\n\r\n if (this._defsElement) {\r\n this._defsElement.append(...nodes);\r\n }\r\n }\r\n\r\n addEventListener<T extends keyof MarkerViewEventMap>(\r\n // the event name, a key of MarkerViewEventMap\r\n type: T,\r\n\r\n // the listener, using a value of MarkerViewEventMap\r\n listener: (this: MarkerView, ev: MarkerViewEventMap[T]) => void,\r\n\r\n // any options\r\n options?: boolean | AddEventListenerOptions,\r\n ): void;\r\n addEventListener<K extends keyof HTMLElementEventMap>(\r\n type: K,\r\n listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => void,\r\n options?: boolean | AddEventListenerOptions | undefined,\r\n ): void;\r\n addEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject,\r\n options?: boolean | AddEventListenerOptions | undefined,\r\n ): void {\r\n super.addEventListener(type, listener, options);\r\n }\r\n\r\n removeEventListener<T extends keyof MarkerViewEventMap>(\r\n // the event name, a key of MarkerViewEventMap\r\n type: T,\r\n\r\n // the listener, using a value of MarkerViewEventMap\r\n listener: (this: MarkerView, ev: MarkerViewEventMap[T]) => void,\r\n\r\n // any options\r\n options?: boolean | EventListenerOptions,\r\n ): void;\r\n removeEventListener<K extends keyof HTMLElementEventMap>(\r\n type: K,\r\n listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => void,\r\n options?: boolean | EventListenerOptions | undefined,\r\n ): void;\r\n removeEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject,\r\n options?: boolean | EventListenerOptions | undefined,\r\n ): void {\r\n super.removeEventListener(type, listener, options);\r\n }\r\n}\r\n","/**\r\n * @module Viewer\r\n * @category API Reference\r\n */\r\nimport { MarkerView } from './MarkerView';\r\n\r\nexport {\r\n MarkerView,\r\n MarkerViewEventData,\r\n MarkerEventData,\r\n MarkerViewEventMap,\r\n} from './MarkerView';\r\n\r\nif (\r\n window &&\r\n window.customElements &&\r\n window.customElements.get('mjs-marker-view') === undefined\r\n) {\r\n window.customElements.define('mjs-marker-view', MarkerView);\r\n}\r\n","/**\r\n * @module Renderer\r\n * @category API Reference\r\n */\r\nimport {\r\n AnnotationState,\r\n CoverMarker,\r\n FrameMarker,\r\n FreehandMarker,\r\n HighlightMarker,\r\n MarkerBase,\r\n PolygonMarker,\r\n SvgHelper,\r\n TextMarker,\r\n LineMarker,\r\n ArrowMarker,\r\n MeasurementMarker,\r\n EllipseFrameMarker,\r\n EllipseMarker,\r\n CalloutMarker,\r\n CustomImageMarker,\r\n CheckImageMarker,\r\n XImageMarker,\r\n CaptionFrameMarker,\r\n CurveMarker,\r\n HighlighterMarker,\r\n SvgFilters,\r\n} from './core';\r\n\r\n/**\r\n * Renderer is used to rasterize annotations.\r\n *\r\n * @example\r\n * To render the annotation as a static image you use `Renderer`.\r\n *\r\n * ```js\r\n * import { MarkerArea, Renderer } from '@markerjs/markerjs3';\r\n * ```\r\n *\r\n * Just create an instance of it and pass the annotation state to the `rasterize()` method:\r\n *\r\n * ```js\r\n * const renderer = new Renderer();\r\n * renderer.targetImage = targetImg;\r\n * const dataUrl = await renderer.rasterize(markerArea.getState());\r\n *\r\n * const img = document.createElement('img');\r\n * img.src = dataUrl;\r\n *\r\n * someDiv.appendChild(img);\r\n * ```\r\n */\r\nexport class Renderer {\r\n private _mainCanvas?: SVGSVGElement;\r\n\r\n private _editingTarget?: HTMLImageElement;\r\n\r\n private _renderHelperContainer?: HTMLDivElement;\r\n\r\n private _targetWidth = -1;\r\n /**\r\n * Width of the target image.\r\n */\r\n public get targetWidth() {\r\n return this._targetWidth;\r\n }\r\n /**\r\n * Width of the target image.\r\n */\r\n public set targetWidth(value) {\r\n this._targetWidth = value;\r\n this.setMainCanvasSize();\r\n }\r\n private _targetHeight = -1;\r\n /**\r\n * Height of the target image.\r\n */\r\n public get targetHeight() {\r\n return this._targetHeight;\r\n }\r\n /**\r\n * Height of the target image.\r\n */\r\n public set targetHeight(value) {\r\n this._targetHeight = value;\r\n this.setMainCanvasSize();\r\n }\r\n\r\n private _targetImageLoaded = false;\r\n\r\n private _targetImage: HTMLImageElement | undefined;\r\n /**\r\n * Target image to render annotations on.\r\n */\r\n public get targetImage(): HTMLImageElement | undefined {\r\n return this._targetImage;\r\n }\r\n /**\r\n * Target image to render annotations on.\r\n */\r\n public set targetImage(value: HTMLImageElement | undefined) {\r\n this._targetImageLoaded = false;\r\n this._targetImage = value;\r\n if (value !== undefined) {\r\n this.addTargetImage();\r\n }\r\n }\r\n\r\n /**\r\n * Marker types available for rendering.\r\n */\r\n public markerTypes: Array<typeof MarkerBase> = [];\r\n\r\n /**\r\n * Array of markers to render.\r\n */\r\n public markers: MarkerBase[] = [];\r\n\r\n private _isInitialized = false;\r\n\r\n /**\r\n * Whether the image should be rendered at the original (natural) target image size.\r\n */\r\n public naturalSize = false;\r\n /**\r\n * Rendered image type (`image/png`, `image/jpeg`, etc.).\r\n */\r\n public imageType = 'image/png';\r\n /**\r\n * For formats that support it, specifies rendering quality.\r\n *\r\n * In the case of `image/jpeg` you can specify a value between 0 and 1 (lowest to highest quality).\r\n *\r\n * @type {number} - image rendering quality (0..1)\r\n */\r\n public imageQuality?: number;\r\n /**\r\n * When set to true, only the marker layer without the original image will be rendered.\r\n */\r\n public markersOnly = false;\r\n\r\n /**\r\n * When set and {@linkcode naturalSize} is `false` sets the width of the rendered image.\r\n *\r\n * Both `width` and `height` have to be set for this to take effect.\r\n */\r\n public width?: number;\r\n /**\r\n * When set and {@linkcode naturalSize} is `false` sets the height of the rendered image.\r\n *\r\n * Both `width` and `height` have to be set for this to take effect.\r\n */\r\n public height?: number;\r\n\r\n private _defaultFilter?: string;\r\n /**\r\n * Returns the default SVG filter for the created markers.\r\n *\r\n * @since 3.2.0\r\n */\r\n public get defaultFilter(): string | undefined {\r\n return this._defaultFilter;\r\n }\r\n /**\r\n * Sets the default SVG filter for the created markers\r\n * (e.g. \"drop-shadow(2px 2px 2px black)\").\r\n *\r\n * @since 3.2.0\r\n */\r\n public set defaultFilter(value: string | undefined) {\r\n this._defaultFilter = value;\r\n }\r\n\r\n private _defsElement?: SVGDefsElement;\r\n private _defs: (string | Node)[] = [];\r\n\r\n constructor() {\r\n this.markerTypes = [\r\n FrameMarker,\r\n LineMarker,\r\n ArrowMarker,\r\n MeasurementMarker,\r\n PolygonMarker,\r\n FreehandMarker,\r\n TextMarker,\r\n CoverMarker,\r\n HighlightMarker,\r\n CalloutMarker,\r\n EllipseFrameMarker,\r\n EllipseMarker,\r\n CustomImageMarker,\r\n CheckImageMarker,\r\n XImageMarker,\r\n CaptionFrameMarker,\r\n CurveMarker,\r\n HighlighterMarker,\r\n ];\r\n\r\n this.init = this.init.bind(this);\r\n\r\n this.addMainCanvas = this.addMainCanvas.bind(this);\r\n this.setMainCanvasSize = this.setMainCanvasSize.bind(this);\r\n this.setEditingTargetSize = this.setEditingTargetSize.bind(this);\r\n this.addTargetImage = this.addTargetImage.bind(this);\r\n\r\n this.addNewMarker = this.addNewMarker.bind(this);\r\n\r\n this.restoreState = this.restoreState.bind(this);\r\n this.scaleMarkers = this.scaleMarkers.bind(this);\r\n\r\n this.addDefs = this.addDefs.bind(this);\r\n this.addDefaultFilterDefs = this.addDefaultFilterDefs.bind(this);\r\n }\r\n\r\n private init() {\r\n this.addMainCanvas();\r\n this._isInitialized = true;\r\n if (this.targetImage !== undefined) {\r\n this.addTargetImage();\r\n }\r\n this.setMainCanvasSize();\r\n this.addDefaultFilterDefs();\r\n }\r\n\r\n private addMainCanvas() {\r\n this._mainCanvas = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'svg',\r\n );\r\n this._mainCanvas.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\r\n this.setMainCanvasSize();\r\n this._mainCanvas.style.gridColumnStart = '1';\r\n this._mainCanvas.style.gridRowStart = '1';\r\n this._mainCanvas.style.pointerEvents = 'auto';\r\n\r\n // text isn't sized correctly without adding to the DOM\r\n this._mainCanvas.style.visibility = 'hidden';\r\n\r\n this.addDefsToMainCanvas();\r\n\r\n this._renderHelperContainer = document.createElement('div');\r\n this._renderHelperContainer.style.position = 'absolute';\r\n this._renderHelperContainer.style.top = '0px';\r\n this._renderHelperContainer.style.left = '0px';\r\n this._renderHelperContainer.style.width = '10px';\r\n this._renderHelperContainer.style.height = '10px';\r\n this._renderHelperContainer.style.overflow = 'hidden';\r\n this._renderHelperContainer.style.visibility = 'hidden';\r\n\r\n this._renderHelperContainer.appendChild(this._mainCanvas);\r\n\r\n document.body.appendChild(this._renderHelperContainer);\r\n }\r\n\r\n private addDefsToMainCanvas() {\r\n this._defsElement = SvgHelper.createDefs();\r\n this._mainCanvas?.appendChild(this._defsElement);\r\n this._defsElement.append(...this._defs);\r\n }\r\n\r\n private setMainCanvasSize() {\r\n if (\r\n this._mainCanvas !== undefined &&\r\n this._targetHeight > 0 &&\r\n this._targetWidth > 0\r\n ) {\r\n this._mainCanvas.style.width = `${this._targetWidth}px`;\r\n this._mainCanvas.style.height = `${this._targetHeight}px`;\r\n this._mainCanvas.setAttribute('width', `${this._targetWidth}`);\r\n this._mainCanvas.setAttribute('height', `${this._targetHeight}`);\r\n this._mainCanvas.setAttribute(\r\n 'viewBox',\r\n '0 0 ' +\r\n this._targetWidth.toString() +\r\n ' ' +\r\n this._targetHeight.toString(),\r\n );\r\n this.setEditingTargetSize();\r\n }\r\n }\r\n\r\n private setEditingTargetSize() {\r\n if (this._editingTarget !== undefined) {\r\n this._editingTarget.width = this._targetWidth;\r\n this._editingTarget.height = this._targetHeight;\r\n this._editingTarget.style.width = `${this._targetWidth}px`;\r\n this._editingTarget.style.height = `${this._targetHeight}px`;\r\n }\r\n }\r\n\r\n private addTargetImage() {\r\n if (\r\n this._isInitialized &&\r\n this._editingTarget === undefined &&\r\n this.targetImage !== undefined &&\r\n this._mainCanvas !== undefined\r\n ) {\r\n this._editingTarget = document.createElement('img');\r\n\r\n this._targetWidth =\r\n this._targetWidth > 0\r\n ? this._targetWidth\r\n : this.targetImage.clientWidth;\r\n this._targetHeight =\r\n this._targetHeight > 0\r\n ? this._targetHeight\r\n : this.targetImage.clientHeight;\r\n\r\n this._editingTarget.addEventListener('load', (ev) => {\r\n if (this._editingTarget !== undefined) {\r\n if (this._targetHeight <= 0 || this._targetWidth <= 0) {\r\n const img = <HTMLImageElement>ev.target;\r\n\r\n const aspectRatio = img.naturalWidth / img.naturalHeight;\r\n const calculatedWidth =\r\n this._targetWidth > 0\r\n ? this._targetWidth\r\n : this._targetHeight > 0\r\n ? this._targetHeight * aspectRatio\r\n : img.naturalWidth;\r\n const calculatedHeight =\r\n this._targetHeight > 0\r\n ? this._targetHeight\r\n : this._targetWidth > 0\r\n ? this._targetWidth / aspectRatio\r\n : img.naturalHeight;\r\n\r\n this._targetWidth = calculatedWidth;\r\n this._targetHeight = calculatedHeight;\r\n }\r\n this._editingTarget.width = this._targetWidth;\r\n this._editingTarget.height = this._targetHeight;\r\n this._editingTarget.style.width = `${this._targetWidth}px`;\r\n this._editingTarget.style.height = `${this._targetHeight}px`;\r\n this._editingTarget.style.gridColumnStart = '1';\r\n this._editingTarget.style.gridRowStart = '1';\r\n\r\n this._targetImageLoaded = true;\r\n\r\n this.setMainCanvasSize();\r\n }\r\n });\r\n this._editingTarget.style.visibility = 'hidden';\r\n this._editingTarget.src = this.targetImage.src;\r\n\r\n this._renderHelperContainer?.insertBefore(\r\n this._editingTarget,\r\n this._mainCanvas,\r\n );\r\n // document.body.appendChild(this._editingTarget);\r\n }\r\n }\r\n\r\n private addDefaultFilterDefs() {\r\n this.addDefs(...SvgFilters.getDefaultFilterSet());\r\n }\r\n\r\n private addNewMarker(markerType: typeof MarkerBase): MarkerBase {\r\n if (this._mainCanvas === undefined) {\r\n throw new Error('Main canvas is not initialized.');\r\n }\r\n\r\n const g = SvgHelper.createGroup();\r\n if (this.defaultFilter && markerType.applyDefaultFilter) {\r\n g.setAttribute('filter', this.defaultFilter);\r\n }\r\n this._mainCanvas.appendChild(g);\r\n\r\n return new markerType(g);\r\n }\r\n\r\n private getMarkerTypeByName(typeName: string): typeof MarkerBase | undefined {\r\n let result: typeof MarkerBase | undefined;\r\n this.markerTypes.forEach((mType) => {\r\n if (mType.typeName === typeName) {\r\n result = mType;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Adds a new marker type to the list of available marker types.\r\n * @param markerType - Marker type to register.\r\n */\r\n public registerMarkerType(markerType: typeof MarkerBase) {\r\n if (this.markerTypes.indexOf(markerType) < 0) {\r\n this.markerTypes.push(markerType);\r\n }\r\n }\r\n\r\n /**\r\n * Restores the annotation state.\r\n * @param state - Annotation state to restore.\r\n */\r\n public restoreState(state: AnnotationState): void {\r\n const stateCopy: AnnotationState = JSON.parse(JSON.stringify(state));\r\n this.markers.splice(0);\r\n\r\n while (this._mainCanvas?.lastChild) {\r\n this._mainCanvas.removeChild(this._mainCanvas.lastChild);\r\n }\r\n\r\n // re-add defs\r\n this.addDefsToMainCanvas();\r\n\r\n if (this.defaultFilter === undefined && stateCopy.defaultFilter) {\r\n this.defaultFilter = stateCopy.defaultFilter;\r\n }\r\n\r\n stateCopy.markers.forEach((markerState) => {\r\n const markerType = this.getMarkerTypeByName(markerState.typeName);\r\n if (markerType !== undefined) {\r\n const marker = this.addNewMarker(markerType);\r\n marker.restoreState(markerState);\r\n this.markers.push(marker);\r\n }\r\n });\r\n\r\n if (\r\n stateCopy.width &&\r\n stateCopy.height &&\r\n (stateCopy.width !== this.targetWidth ||\r\n stateCopy.height !== this.targetHeight)\r\n ) {\r\n this.scaleMarkers(\r\n this.targetWidth / stateCopy.width,\r\n this.targetHeight / stateCopy.height,\r\n );\r\n }\r\n }\r\n\r\n private scaleMarkers(scaleX: number, scaleY: number) {\r\n this.markers.forEach((marker) => {\r\n marker.scale(scaleX, scaleY);\r\n });\r\n }\r\n\r\n /**\r\n * Rasterizes the annotation.\r\n * @param state - annotation state to render.\r\n * @param targetCanvas - optional target canvas to render the annotation on.\r\n * @returns\r\n */\r\n public async rasterize(\r\n state: AnnotationState,\r\n targetCanvas?: HTMLCanvasElement,\r\n ): Promise<string> {\r\n if (!this.naturalSize && this.targetWidth <= 0 && this.targetHeight <= 0) {\r\n this._targetWidth = state.width;\r\n this._targetHeight = state.height;\r\n }\r\n\r\n this.init();\r\n\r\n if (this._mainCanvas === undefined || this.targetImage === undefined) {\r\n throw new Error('Not properly initialized.');\r\n }\r\n\r\n let counter = 0;\r\n while (!this._targetImageLoaded && counter++ < 100) {\r\n // wait for the target image to load\r\n await new Promise((r) => setTimeout(r, 100));\r\n }\r\n\r\n this.restoreState(state);\r\n\r\n const canvas =\r\n targetCanvas !== undefined\r\n ? targetCanvas\r\n : document.createElement('canvas');\r\n\r\n if (this.targetImage === null) {\r\n this.markersOnly = true;\r\n this.naturalSize = false;\r\n }\r\n\r\n const markerImageCopy = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'svg',\r\n );\r\n markerImageCopy.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\r\n markerImageCopy.setAttribute(\r\n 'width',\r\n this._mainCanvas.width.baseVal.valueAsString,\r\n );\r\n markerImageCopy.setAttribute(\r\n 'height',\r\n this._mainCanvas.height.baseVal.valueAsString,\r\n );\r\n markerImageCopy.setAttribute(\r\n 'viewBox',\r\n '0 0 ' +\r\n this._mainCanvas.viewBox.baseVal.width.toString() +\r\n ' ' +\r\n this._mainCanvas.viewBox.baseVal.height.toString(),\r\n );\r\n\r\n // workaround for text positioning delay\r\n await new Promise((r) => setTimeout(r, 200));\r\n\r\n markerImageCopy.innerHTML = this._mainCanvas.innerHTML;\r\n\r\n if (this.naturalSize === true) {\r\n // scale to full image size\r\n markerImageCopy.width.baseVal.value = this.targetImage.naturalWidth;\r\n markerImageCopy.height.baseVal.value = this.targetImage.naturalHeight;\r\n } else if (this.width !== undefined && this.height !== undefined) {\r\n // scale to specific dimensions\r\n markerImageCopy.width.baseVal.value = this.width;\r\n markerImageCopy.height.baseVal.value = this.height;\r\n }\r\n\r\n canvas.width = markerImageCopy.width.baseVal.value;\r\n canvas.height = markerImageCopy.height.baseVal.value;\r\n\r\n const data = markerImageCopy.outerHTML;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (ctx === null) {\r\n throw new Error('Canvas 2D context is not available.');\r\n }\r\n\r\n if (this.markersOnly !== true) {\r\n ctx.drawImage(this.targetImage, 0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n const DOMURL = window.URL; // || window.webkitURL || window;\r\n\r\n const img = new Image(canvas.width, canvas.height);\r\n img.setAttribute('crossOrigin', 'anonymous');\r\n\r\n const blob = new Blob([data], { type: 'image/svg+xml' });\r\n\r\n const url = DOMURL.createObjectURL(blob);\r\n\r\n let result = '';\r\n img.onload = () => {\r\n ctx.drawImage(img, 0, 0);\r\n DOMURL.revokeObjectURL(url);\r\n\r\n result = canvas.toDataURL(this.imageType, this.imageQuality);\r\n };\r\n\r\n img.src = url;\r\n\r\n counter = 0;\r\n while (!result && counter++ < 100) {\r\n // wait for the image to load\r\n await new Promise((r) => setTimeout(r, 100));\r\n }\r\n\r\n if (this._editingTarget) {\r\n this._renderHelperContainer?.removeChild(this._editingTarget);\r\n }\r\n\r\n // remove the helper main canvas from the page\r\n this._renderHelperContainer?.removeChild(this._mainCanvas);\r\n document.body.removeChild(this._renderHelperContainer!);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Adds \"defs\" to main canvas SVG.\r\n * Useful for filters, custom fonts and potentially other scenarios.\r\n * @since 3.3.0\r\n */\r\n public addDefs(...nodes: (string | Node)[]): void {\r\n this._defs.push(...nodes);\r\n\r\n if (this._defsElement) {\r\n this._defsElement.append(...nodes);\r\n }\r\n }\r\n}\r\n"],"names":["SvgHelper","createDefs","document","createElementNS","setAttributes","el","attributes","attr","value","setAttribute","createRect","width","height","rect","toString","createLine","x1","y1","x2","y2","line","createPolygon","points","polygon","createCircle","radius","circle","createEllipse","rx","ry","ellipse","createGroup","g","createTransform","createSVGTransform","createMarker","id","orient","markerWidth","markerHeight","refX","refY","markerElement","marker","appendChild","createText","text","createTSpan","tspan","textContent","createImage","image","createPoint","x","y","svgPoint","createSVGPoint","createPath","d","path","createForeignObject","obj","clientToLocalCoordinates","localRoot","zoomLevel","clientRect","getBoundingClientRect","left","top","createSvgFromString","stringSvg","svg","innerHTML","createFilter","filter","Activator","addKey","product","key","keys","set","keyAddListeners","forEach","listener","addKeyAddListener","push","removeKeyAddListener","li","indexOf","splice","isLicensed","has","keyRegex","RegExp","get","undefined","test","Map","Array","MarkerBase","typeName","Object","getPrototypeOf","this","constructor","container","_container","strokeColor","_strokeColor","color","applyStrokeColor","fillColor","_fillColor","applyFillColor","strokeWidth","_strokeWidth","applyStrokeWidth","strokeDasharray","_strokeDasharray","applyStrokeDasharray","opacity","_opacity","applyOpacity","defaultSize","stage","bind","getBBox","ownsTarget","dispose","addMarkerVisualToContainer","element","childNodes","length","insertBefore","getOutline","getState","notes","restoreState","state","_a","_b","_c","_d","scale","scaleX","scaleY","applyDefaultFilter","TransformMatrix","toITransformMatrix","matrix","a","b","c","e","f","toSVGMatrix","currentMatrix","newMatrix","RectangularBoxMarkerBase","centerX","centerY","visual","_visual","translate","transform","baseVal","appendItem","super","rotationAngle","rotatePoint","unrotatePoint","moveVisual","point","style","setSize","rotate","Math","abs","sign","atan","PI","applyRotation","getItem","setRotate","replaceItem","getCTM","matrixTransform","inverse","assign","visualTransformMatrix","containerTransformMatrix","rbmState","setMatrix","rPoint","rotatedTL","rotatedTR","rotatedBL","rotatedBR","absTL","min","absBR","max","DOMRect","ShapeOutlineMarkerBase","createVisual","getPath","adjustVisual","title","ShapeMarkerBase","rectState","FrameMarker","LinearMarkerBase","lineVisual","startTerminatorVisual","endTerminatorVisual","selectorVisual","visibleVisual","getStartTerminatorPath","getEndTerminatorPath","lmbState","LineMarker","ArrowMarker","arrowType","_arrowType","getArrowProperties","arrowHeight","arrowWidth","dx","dy","arrowDipFactor","angle","atan2","startArrowBasePoint","cos","sin","startArrowTipBasePoint","startArrowSide1","startArrowSide2","endArrowBasePoint","endArrowTipBasePoint","endArrowSide1","endArrowSide2","result","arrowState","MeasurementMarker","tipLength","getTerminatorProperties","PolygonMarker","selectorVisualLines","some","l","map","p","i","join","createSelectorVisual","addSelectorLine","adjustSelectorVisual","missingLines","removeChild","pop","pmState","FreehandMarker","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","done","then","apply","SuppressedError","TextBlock","_text","renderText","boundingBox","_boundingBox","labelBackground","_labelBackground","textElement","_textElement","_color","fontFamily","_fontFamily","positionText","fontSize","_fontSize","units","offsetX","offsetY","wordWrap","prevWrappedText","setupTextElement","show","hide","showControlBox","hideControlBox","applyFontStyles","wrapText","found","span","textAnchor","userSelect","stroke","strokeOpacity","getTextAspectRatio","textLines","longestLineChars","lines","split","boxAspectRatio","processedLines","textAspectRatio","maxLineLength","Number","MAX_VALUE","longestLine","lastIndexOf","reminderLine","maxEnd","substring","trim","processedText","lastChild","lineno","requestAnimationFrame","ts","textSize","_textSize","textBlock","self","noOfLines","lineHeight","autoOffset","bgPadding","onTextSizeChanged","display","TextMarker","getDefaultText","DEFAULT_TEXT","padding","setColor","setFont","setFontSize","textSizeChanged","setSizeFromTextSize","textBoundingBox","setTextBoundingBox","prevWidth","prevHeight","onSizeChanged","font","hideVisual","visibility","showVisual","textState","newFontSize","CoverMarker","HighlightMarker","CalloutMarker","tipPosition","_tipPosition","tipBase1Position","tipBase2Position","_calloutVisual","setTipPoints","offset","baseWidth","cornerAngle","calloutState","EllipseFrameMarker","EllipseMarker","ImageMarkerBase","svgString","_svgString","SVGImage","imageType","outerHTML","imageSrc","_imageSrc","naturalWidth","naturalHeight","adjustImage","DOMParser","parseFromString","documentElement","SVGSVGElement","Error","svgElement","ownerDocument","importNode","isDescendant","parent","target","children","imgState","CustomImageMarker","CheckImageMarker","XImageMarker","CaptionFrameMarker","_outerFrameVisual","_captionFrameVisual","_frameVisual","adjustFrameVisual","getPaths","adjustTextPosition","frame","caption","paths","captionState","CurveMarker","curveX","curveY","HighlighterMarker","SvgFilters","getDefaultFilterSet","MarkerBaseEditor","creationStyle","_creationStyle","is","cls","_marker","overlayContainer","_overlayContainer","_state","isSelected","_isSelected","continuousCreation","_continuousCreation","adjustControlBox","stateChanged","dashes","properties","_controlBox","isMultiSelected","_markerType","markerType","select","deselect","pointerDown","pointerUp","manipulate","dblClick","multi","cursor","manipulationStartState","JSON","stringify","ev","onStateChanged","currentState","Grip","gripSize","fill","child","ResizeGrip","PolygonMarkerEditor","defaultLength","manipulationStartX","manipulationStartY","controlBox","manipulationBox","grips","setupControlBox","adjustControlGrips","createGrip","positionGrip","positionGrips","resize","grip","startCreation","finishCreation","addNewPointWhileCreating","activeGrip","find","at","pointerEvents","onMarkerCreated","activeGripIndex","selectorLineIndex","findIndex","gripIndex","noOfMissingGrips","setTranslate","LinearMarkerEditor","manipulationStartX1","manipulationStartY1","manipulationStartX2","manipulationStartY2","addControlGrips","grip1","grip2","inState","RectangularBoxMarkerGrips","findGripByVisual","gripVisual","values","getGrip","location","RotateGrip","oldFill","RectangularBoxMarkerBaseEditor","manipulationStartLeft","manipulationStartTop","manipulationStartWidth","manipulationStartHeight","CB_DISTANCE","controlGrips","disabledResizeGrips","disableRotation","_suppressMarkerCreateEvent","rotatorGrip","rotatedPoint","rotatedCenter","shiftKey","preserveAspectRatio","newX","newWidth","newY","newHeight","deltaX","deltaY","aspectRatio","controlRect","rotatorGripLine","createRotateGrip","cx","cy","bottom","right","rotatorGripSize","rtop","rcx","adjustGripVisibility","ShapeOutlineMarkerEditor","UndoRedoManager","undoStack","redoStack","isUndoPossible","isRedoPossible","undoStepCount","redoStepCount","addUndoStep","stepData","parse","lastRedoStep","replaceLastUndoStep","getLastUndoStep","undo","lastStep","redo","FreehandMarkerEditor","TextBlockEditor","_width","textEditor","_height","_left","_top","textColor","_textColor","bgColor","_bgColor","backgroundColor","isInFocus","isSetupCompleted","createElement","getEditorUi","focus","setup","flexDirection","alignItems","justifyContent","overflow","textAlign","innerText","contentEditable","outline","whiteSpace","addEventListener","stopPropagation","preventDefault","blur","cancelBubble","onTextChanged","onBlur","clipboardData","content","getData","selection","window","getSelection","rangeCount","deleteFromDocument","getRangeAt","insertNode","createTextNode","range","createRange","selectNodeContents","collapse","removeAllRanges","addRange","TextMarkerEditor","size","textBlockEditorContainer","_pointerDownTime","_pointerDownPoint","markerSizeChanged","textBlockEditor","showEditor","hideEditor","Date","now","ShapeMarkerEditor","ArrowMarkerEditor","CalloutMarkerEditor","manipulationStartTipPositionX","manipulationStartTipPositionY","tipGrip","createTipGrip","tipGripSize","ImageMarkerEditor","CaptionFrameMarkerEditor","CurveMarkerEditor","manipulationStartCurveX","manipulationStartCurveY","curveGrip","curveControlLine1","curveControlLine2","firstChild","MarkerArea","HTMLElement","targetWidth","_targetWidth","setMainCanvasSize","targetHeight","_targetHeight","currentMarkerEditor","_currentMarkerEditor","selectedMarkerEditors","_selectedMarkerEditors","targetImage","_targetImage","_targetImageLoaded","addTargetImage","_zoomLevel","_canvasContainer","_contentContainer","_mainCanvas","setEditingTargetSize","scrollMultiplier","scrollTo","clientWidth","clientHeight","panTo","scrollBy","prevPanPoint","defaultFilter","_defaultFilter","mode","_isInitialized","_newMarkerOutline","markerEditors","editors","undoRedoManager","_defs","touchPoints","isDragging","isSelecting","isPanning","_marqueeSelectOutline","_marqueeSelectRect","_manipulationStartX","_manipulationStartY","connectedCallback","disconnectedCallback","createLayout","addMainCanvas","initOverlay","attachEvents","attachWindowEvents","detachEvents","detachWindowEvents","onCanvasPointerDown","onCanvasDblClick","onKeyUp","onPointerMove","onPointerOut","onPointerUp","addNewMarker","markerCreated","markerStateChanged","deleteMarker","deleteSelectedMarkers","switchToSelectMode","showOutline","hideOutline","undoStep","redoStep","toggleLogo","addLogo","removeLogo","adjustMarqueeSelectOutline","hideMarqueeSelectOutline","addDefs","addDefaultFilterDefs","attachShadow","dispatchEvent","CustomEvent","detail","markerArea","position","flexGrow","flexShrink","touchAction","className","gridTemplateColumns","justifyItems","shadowRoot","gridColumnStart","gridRowStart","margin","addDefsToMainCanvas","_groupLayer","_defsElement","append","_editingTarget","_overlayContentContainer","img","calculatedWidth","calculatedHeight","_stateToRestore","src","registerMarkerType","editorType","mType","getMarkerTypeByName","markerEditor","setCurrentEditor","deselectEditor","markerEditorType","editor","newMarkerEditor","m","selectEditor","eventEditor","index","clientX","clientY","leadPointerId","pointerId","pointerType","button","altKey","localPoint","hitMarker","initializeMarqueeSelection","contains","localManipulationStart","finishMarqueeSelection","onlySelected","markerRect","hasAttribute","version","markers","stateCopy","markerState","scaleMarkers","preScaleSelectedMarker","_logoUI","logoUI","link","href","Logo","positionLogo","lastUndoState","nodes","type","options","removeEventListener","customElements","define","MarkerView","markerTypes","attachMarkerEvents","markerView","newMarker","naturalSize","markersOnly","init","_renderHelperContainer","body","rasterize","targetCanvas","counter","r","setTimeout","canvas","markerImageCopy","valueAsString","viewBox","data","ctx","getContext","drawImage","DOMURL","URL","Image","blob","Blob","url","createObjectURL","onload","revokeObjectURL","toDataURL","imageQuality"],"mappings":"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","x_google_ignoreList":[14]}
|