{"version":3,"file":"HSLCanvas.js","sourceRoot":"","sources":["../../TS/HSLCanvas.ts"],"names":[],"mappings":"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","sourcesContent":["import { IJSModule } from \"./IJSModule.js\";\r\nimport { HttpClient } from \"./HttpClient.js\";\r\nimport { JSOpResult, JSOpResultVoid, OpResult } from \"./OpResult.js\";\r\nimport { UIHelpers } from \"./UIHelpers.js\";\r\n\r\ndeclare global {\r\n interface SVGElement {\r\n getViewBoxInfo(): ViewBoxInfo;\r\n toImageAsync(): Promise;\r\n fromSVGString(svgString: string): OpResult;\r\n }\r\n}\r\n\r\nSVGElement.prototype.fromSVGString = function (svgString: string): OpResult {\r\n let svgDoc = new DOMParser().parseFromString(svgString, 'image/svg+xml');\r\n\r\n let svgElements = svgDoc.getElementsByTagNameNS('http://www.w3.org/2000/svg', 'svg');\r\n\r\n if (svgElements.length == 0) {\r\n return OpResult.Fail('Item image is not an SVG');\r\n }\r\n\r\n let svg: SVGElement = svgElements[0];\r\n\r\n return OpResult.OK(svg);\r\n}\r\n\r\nSVGElement.prototype.toImageAsync = async function () {\r\n return new Promise((resolve, reject) => {\r\n let svgString = new XMLSerializer().serializeToString(this);\r\n let svgSource = `data:image/svg+xml;base64,${btoa(svgString)}`;\r\n\r\n let img = new Image();\r\n img.onload = () => resolve(img);\r\n img.onerror = reject\r\n\r\n img.src = svgSource;\r\n })\r\n}\r\n\r\nSVGElement.prototype.getViewBoxInfo = function () {\r\n let attr = this.getAttribute('viewBox');\r\n return ViewBoxInfo.parseAttributeString(attr);\r\n}\r\n\r\n// CJ - NOTES - this looks good - https://www.sitepoint.com/how-to-translate-from-dom-to-svg-coordinates-and-back-again/\r\n\r\nexport class HSLCanvasService implements IJSModule {\r\n public serviceName: string;\r\n\r\n public initialize(): boolean {\r\n this.serviceName = 'HSLCanvasService';\r\n window['HSLCanvasService'] = this;\r\n return true;\r\n }\r\n\r\n public async CreateCanvasAsync(componentRef: IDotNetReference,\r\n canvasId: string,\r\n containerId: string,\r\n hslImageUrl: string,\r\n hslPosX: number,\r\n hslPosY: number): Promise {\r\n\r\n try {\r\n let ci = new HSLCanvasInstance();\r\n\r\n let cr = await ci.initializeAsync(componentRef, canvasId, containerId, hslImageUrl, hslPosX, hslPosY);\r\n\r\n if (cr.IsNotOK) {\r\n return cr.AsJSOpResult;\r\n }\r\n\r\n return JSOpResult.OK(ci);\r\n } catch (e) {\r\n return JSOpResult.Error(e);\r\n }\r\n }\r\n}\r\n\r\nexport class HSLCanvasInstance {\r\n private static hslCached: HTMLImageElement;\r\n private static initialHSLCachedImageWidth: number;\r\n private static initialHSLCachedImageHeight: number;\r\n\r\n private canvas: HTMLCanvasElement;\r\n private canvasCtx: CanvasRenderingContext2D;\r\n\r\n private offsetX;\r\n private offsetY;\r\n\r\n private isDragging = false;\r\n\r\n private padding = 0; //VM - used for setting initial padding of the container\r\n\r\n private paddingX: number = 10;\r\n private paddingY: number = 10;\r\n private sizeCoef;\r\n\r\n private initialPositionX;\r\n private initialPositionY;\r\n\r\n private currPositionX;\r\n private currPositionY;\r\n private currRotationAngle;\r\n\r\n private hslSvgUrl: string;\r\n\r\n private img: HTMLImageElement;\r\n private imgWidth: number;\r\n private imgHeight: number;\r\n\r\n private initialHSLImageWidth: number;\r\n private initialHSLImageHeight: number;\r\n\r\n private hsBaseAngle;\r\n\r\n private points = [];\r\n\r\n private svgPaths: HTMLCollectionOf;\r\n private svgWidth: number = 0;\r\n private svgHeight: number = 0;\r\n\r\n private backgroundImgCalcWidth: number;\r\n private backgroundImgCalcHeight: number;\r\n\r\n private dotNetComponentRef: IDotNetReference;\r\n\r\n private containerID: string;\r\n\r\n public async initializeAsync(componentRef: IDotNetReference,\r\n canvasId: string,\r\n containerId: string,\r\n hslImageUrl: string,\r\n hslPosX: number = null,\r\n hslPosY: number = null): Promise {\r\n\r\n try {\r\n let element = document.getElementById(canvasId);\r\n\r\n // get HSL metadata info\r\n if (element != null) {\r\n this.dotNetComponentRef = componentRef;\r\n\r\n this.containerID = containerId;\r\n\r\n this.canvas = element as HTMLCanvasElement;\r\n\r\n this.canvasCtx = this.canvas.getContext('2d');\r\n\r\n this.offsetX = this.canvas.offsetLeft;\r\n this.offsetY = this.canvas.offsetTop;\r\n\r\n this.isDragging = false;\r\n\r\n this.hslSvgUrl = hslImageUrl;\r\n\r\n this.currPositionX = 0;\r\n this.currPositionY = 0;\r\n this.currRotationAngle = undefined;\r\n\r\n this.initialPositionX = hslPosX;\r\n this.initialPositionY = hslPosY;\r\n\r\n this.points = [];\r\n\r\n await this.setBackgroundSVGDataAsync();\r\n\r\n await this.setHeatSealSVGDataAsync();\r\n\r\n this.subscribeToMouseAndTouchEvents();\r\n\r\n // CJ - I wonder what TS closures do...\r\n let UI: UIHelpers = window['PlatformHelpers'];\r\n\r\n UI.subscribeOnContainerResizeY(this.containerID, async () => {\r\n this.setCanvasSize();\r\n\r\n this.calculateBackgroundImgSize();\r\n\r\n this.calculateAndSetPaddings();\r\n\r\n this.sizeCoef = this.backgroundImgCalcHeight / this.svgHeight;\r\n\r\n this.updateSVGPoints();\r\n\r\n this.setHSLPosition();\r\n\r\n await this.drawHeatSealAsync();\r\n\r\n console.log(`CONTAINER RESIZE ${this.canvas.width} ${this.canvas.height}`);\r\n }, 50);\r\n\r\n return JSOpResultVoid.OK;\r\n }\r\n } catch (e) {\r\n return JSOpResultVoid.Error(e);\r\n }\r\n\r\n return JSOpResultVoid.Fail(`Canvas element with ID ${canvasId} not found`);\r\n }\r\n\r\n private async setBackgroundSVGDataAsync() {\r\n // get modified SVG from the Blazor component\r\n let svgHtml: string = await this.dotNetComponentRef.invokeMethodAsync('GetItemSVGAsync');\r\n\r\n let bsr = SVGElement.prototype.fromSVGString(svgHtml);\r\n\r\n if (bsr.IsNotOK) {\r\n return bsr.AsJSOpResultVoid;\r\n }\r\n\r\n let svg: SVGElement = bsr.Result;\r\n\r\n // CJ - why does TS SVGElement not contain a viewbox?\r\n // let viewbox: string = svg.getAttribute('viewBox');\r\n // console.log(`SVG VIEWBOX ${viewbox}`);\r\n\r\n // let vbc = ViewBoxInfo.FromElement(svg);\r\n let vbc = svg.getViewBoxInfo();\r\n\r\n this.svgWidth = vbc.width;\r\n this.svgHeight = vbc.height;\r\n\r\n // get info for nearest-point and angle computations\r\n\r\n this.svgPaths = svg.getElementsByTagName('path');\r\n }\r\n\r\n private async setHeatSealSVGDataAsync() {\r\n if (HSLCanvasInstance.hslCached == null) {\r\n let ir = await HttpClient.fetchStringAsync(this.hslSvgUrl);\r\n\r\n if (ir.IsNotOK) {\r\n return ir.AsJSOpResultVoid;\r\n }\r\n\r\n let hslSVGString = ir.Result;\r\n\r\n let sr = SVGElement.prototype.fromSVGString(hslSVGString);\r\n\r\n if (sr.IsNotOK) {\r\n return sr.AsJSOpResultVoid;\r\n }\r\n\r\n let hslSVG = sr.Result;\r\n\r\n let imgInfo = ViewBoxInfo.FromElement(hslSVG);\r\n\r\n // CJ - use viewBox info for proportions\r\n this.initialHSLImageWidth = imgInfo.width;\r\n this.initialHSLImageHeight = imgInfo.height;\r\n\r\n this.img = await hslSVG.toImageAsync();\r\n\r\n HSLCanvasInstance.hslCached = this.img;\r\n HSLCanvasInstance.initialHSLCachedImageHeight = this.initialHSLImageHeight;\r\n HSLCanvasInstance.initialHSLCachedImageWidth = this.initialHSLImageWidth;\r\n }\r\n else {\r\n console.log('HSL VALUES FROM CACHE');\r\n\r\n this.img = HSLCanvasInstance.hslCached;\r\n this.initialHSLImageHeight = HSLCanvasInstance.initialHSLCachedImageHeight;\r\n this.initialHSLImageWidth = HSLCanvasInstance.initialHSLCachedImageWidth;\r\n }\r\n }\r\n\r\n private subscribeToMouseAndTouchEvents() {\r\n // remove listeners\r\n this.canvas.removeEventListener('mousedown', (e) => this.handleStart(e));\r\n this.canvas.removeEventListener('touchstart', (e) => this.handleStart(e));\r\n\r\n this.canvas.removeEventListener('mouseup', (e) => this.handleEnd(e));\r\n this.canvas.removeEventListener('touchend', (e) => this.handleEnd(e));\r\n\r\n this.canvas.removeEventListener('mouseout', (e) => this.handleCancel(e));\r\n this.canvas.removeEventListener('touchcancel', (e) => this.handleCancel(e));\r\n\r\n this.canvas.removeEventListener('mousemove', (e) => this.handleMove(e));\r\n this.canvas.removeEventListener('touchmove', (e) => this.handleMove(e));\r\n\r\n //add listeners\r\n this.canvas.addEventListener('mousedown', (e) => this.handleStart(e));\r\n this.canvas.addEventListener('touchstart', (e) => this.handleStart(e));\r\n\r\n this.canvas.addEventListener('mouseup', (e) => this.handleEnd(e));\r\n this.canvas.addEventListener('touchend', (e) => this.handleEnd(e));\r\n\r\n this.canvas.addEventListener('mouseout', (e) => this.handleCancel(e));\r\n this.canvas.addEventListener('touchcancel', (e) => this.handleCancel(e));\r\n\r\n this.canvas.addEventListener('mousemove', (e) => this.handleMove(e));\r\n this.canvas.addEventListener('touchmove', (e) => this.handleMove(e));\r\n }\r\n\r\n private calculateAndSetPaddings() {\r\n this.paddingX = (this.canvas.width - this.backgroundImgCalcWidth) / 2;\r\n this.paddingY = (this.canvas.height - this.backgroundImgCalcHeight) / 2;\r\n\r\n document.getElementById(this.containerID).style.padding = `${this.paddingY}px ${this.paddingX}px`;\r\n }\r\n\r\n private setCanvasSize() {\r\n let UI: UIHelpers = window['PlatformHelpers'];\r\n\r\n let cw = UI.getElementWidth(this.containerID);\r\n let ch = UI.getElementHeight(this.containerID);\r\n\r\n // set canvas width/height\r\n this.canvas.width = cw;\r\n this.canvas.height = ch;\r\n\r\n }\r\n\r\n private calculateBackgroundImgSize() {\r\n //VM - stretched image approx size is needed to calculate Heat Seal img size (includes previous padding value to get better result)\r\n let bScaleCoef = Math.min((this.canvas.width - this.padding * 2) / this.svgWidth, (this.canvas.height - this.padding * 2) / this.svgHeight);\r\n this.backgroundImgCalcWidth = this.svgWidth * bScaleCoef;\r\n this.backgroundImgCalcHeight = this.svgHeight * bScaleCoef;\r\n\r\n this.setHSLSize();\r\n\r\n this.padding = Math.sqrt(Math.pow(this.imgWidth, 2) + Math.pow(this.imgHeight, 2)) / 2;\r\n\r\n //VM - calculation of stretched image size with allowances to fit the barcode without cutting if it's placed on the edge\r\n bScaleCoef = Math.min((this.canvas.width - this.padding * 2) / this.svgWidth, (this.canvas.height - this.padding * 2) / this.svgHeight);\r\n this.backgroundImgCalcWidth = this.svgWidth * bScaleCoef;\r\n this.backgroundImgCalcHeight = this.svgHeight * bScaleCoef;\r\n }\r\n\r\n private setHSLPosition() {\r\n if (this.currPositionX == 0 && this.currPositionY == 0) {\r\n if (this.initialPositionX > 0 && this.initialPositionY > 0) {\r\n this.currPositionX = this.initialPositionX * this.sizeCoef + this.paddingX;\r\n this.currPositionY = this.initialPositionY * this.sizeCoef + this.paddingY;\r\n } else {\r\n //VM - just place somewhere in the left bottom corner of canvas\r\n this.currPositionX = this.paddingX;\r\n this.currPositionY = this.backgroundImgCalcHeight * 0.8 + this.paddingY;\r\n }\r\n }\r\n\r\n this.calcCurrentPosition(this.currPositionX, this.currPositionY);\r\n }\r\n\r\n private setHSLSize() {\r\n let hsHorizontalAlignment = this.initialHSLImageWidth > this.initialHSLImageHeight;\r\n\r\n this.hsBaseAngle = hsHorizontalAlignment ? 1.5708 : 0; //VM - rotate 90\r\n\r\n // VM - barcode height / t-shirt height = approx 0.17 in figma (4/1/2021)\r\n let coef = 0.17 * this.svgWidth / this.svgHeight / 2; //VM - dividing by 2 is not needed for mirroring mode. Replace with Real img sizes in case of mirroring mode\r\n\r\n // VM - min height is needed for very tall images like a tie or so\r\n let minHeight = this.canvas.height * 0.1;\r\n\r\n if (hsHorizontalAlignment) {\r\n this.imgWidth = Math.max(this.backgroundImgCalcHeight * coef, minHeight);\r\n this.imgHeight = this.imgWidth / this.initialHSLImageWidth * this.initialHSLImageHeight;\r\n }\r\n else {\r\n this.imgWidth = this.imgHeight / this.initialHSLImageHeight * this.initialHSLImageWidth;\r\n this.imgHeight = Math.max(this.backgroundImgCalcHeight * coef, minHeight);\r\n }\r\n }\r\n\r\n private updateSVGPoints() {\r\n this.points = [];\r\n\r\n for (let p = 0; p < this.svgPaths.length; p++) {\r\n let path = this.svgPaths[p];\r\n\r\n for (let i = 0; i < this.svgWidth; i++) {\r\n let point = path.getPointAtLength(i / this.svgHeight * path.getTotalLength());\r\n\r\n let getCalcCoordVal = (coordVal: number) => Math.round((coordVal + Number.EPSILON) * 100) / 100;\r\n\r\n this.points.push({ x: getCalcCoordVal(point.x * this.sizeCoef + this.paddingX), y: getCalcCoordVal(point.y * this.sizeCoef + this.paddingY) });\r\n }\r\n }\r\n }\r\n\r\n public Dispose() {\r\n try {\r\n let UI: UIHelpers = window['PlatformHelpers'];\r\n\r\n UI.unsubscribeOnContainerResize(this.containerID);\r\n } catch (e) {\r\n // CJ - what to log...\r\n }\r\n }\r\n\r\n private handleStart(e: MouseEvent | TouchEvent,) {\r\n e.preventDefault();\r\n // set the drag flag\r\n this.isDragging = true;\r\n };\r\n\r\n private handleEnd(e: MouseEvent | TouchEvent,) {\r\n e.preventDefault();\r\n // clear the drag flag\r\n this.isDragging = false;\r\n }\r\n\r\n private handleCancel(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n }\r\n\r\n private async handleMove(e: MouseEvent | TouchEvent,) {\r\n if (this.isDragging) {\r\n e.preventDefault();\r\n\r\n this.setCurrPosition(e);\r\n\r\n await this.drawHeatSealAsync();\r\n }\r\n }\r\n\r\n /* CJ - ATTRIBUTED TO https://www.meziantou.net/debouncing-throttling-javascript-events-in-a-blazor-application.htm */\r\n private debounce(handler: (e: MouseEvent) => void, debounceMS: number) {\r\n let timer;\r\n\r\n return (...args) => {\r\n clearTimeout(timer);\r\n\r\n timer = setTimeout(() => { handler.apply(this, args); }, debounceMS);\r\n }\r\n }\r\n\r\n private async drawHeatSealAsync() {\r\n this.canvasCtx.save();\r\n\r\n this.canvasCtx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n\r\n this.canvasCtx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n\r\n let tmpAngle = (this.currRotationAngle || 0) + this.hsBaseAngle;\r\n\r\n this.canvasCtx.translate(this.currPositionX, this.currPositionY);\r\n this.canvasCtx.rotate(-tmpAngle);\r\n this.canvasCtx.drawImage(this.img, -this.imgWidth / 2, -this.imgHeight / 2, this.imgWidth, this.imgHeight);\r\n this.canvasCtx.rotate(tmpAngle);\r\n this.canvasCtx.translate(-this.currPositionX, -this.currPositionY);\r\n\r\n //VM - uncomment the following code if it's needed to enable mirroring of the barcode\r\n\r\n //let x1 = this.canvasWidth - this.currPositionX;\r\n\r\n //this.canvasCtx.translate(x1, this.currPositionY);\r\n //this.canvasCtx.rotate(tmpAngle);\r\n //this.canvasCtx.drawImage(this.img, -this.imgWidth / 2, -this.imgHeight / 2, this.imgWidth, this.imgHeight);\r\n //this.canvasCtx.rotate(-tmpAngle);\r\n //this.canvasCtx.translate(-x1, -this.currPositionY);\r\n\r\n let x = (this.currPositionX - this.paddingX) / this.sizeCoef;\r\n let y = (this.currPositionY - this.paddingY) / this.sizeCoef;\r\n let angle = this.currRotationAngle;\r\n\r\n this.canvasCtx.restore();\r\n\r\n if (x != null && x != undefined && y != null && y != undefined && angle != null && angle != undefined) {\r\n await this.dotNetComponentRef.invokeMethodAsync('HeatSealSetPosition', x, y, angle);\r\n }\r\n }\r\n\r\n private setCurrPosition(e: MouseEvent | TouchEvent,) {\r\n let x, y;\r\n\r\n if (e instanceof TouchEvent) {\r\n let touches = e.changedTouches;\r\n\r\n let rect = this.canvas.getBoundingClientRect();\r\n if (touches != null && touches.length > 0) {\r\n x = touches[0].clientX - rect.left;\r\n y = touches[0].clientY - rect.top;\r\n\r\n }\r\n } else {\r\n x = e.offsetX;\r\n y = e.offsetY;\r\n }\r\n\r\n this.calcCurrentPosition(x, y);\r\n };\r\n\r\n private calcCurrentPosition(x: number, y: number,) {\r\n let getDist = (point, orig) => Math.sqrt(Math.pow(point.x - orig.x, 2) + Math.pow(point.y - orig.y, 2));\r\n\r\n let origPoint = { x: x - this.offsetX, y: y - this.offsetY };\r\n\r\n let closest = { point: this.points[0], dist: getDist(this.points[0], origPoint), angle: null };\r\n\r\n for (let i = 1; i < this.points.length; i++) {\r\n let dist = getDist(this.points[i], origPoint);\r\n\r\n if (dist < closest.dist) {\r\n closest.point = this.points[i];\r\n closest.dist = dist;\r\n\r\n let p1 = this.points[i - 1];\r\n let p2 = i < this.points.length - 1 ? this.points[i + 1] : this.points[i];\r\n\r\n closest.angle = Math.atan2(p2.x - p1.x, p2.y - p1.y);\r\n }\r\n }\r\n\r\n this.currPositionX = closest.point.x;\r\n this.currPositionY = closest.point.y;\r\n this.currRotationAngle = closest.angle;\r\n };\r\n}\r\n\r\nexport class ViewBoxInfo {\r\n min_x: number;\r\n min_y: number;\r\n width: number;\r\n height: number\r\n\r\n public constructor(init?: Partial) { Object.assign(this, init); }\r\n\r\n public static parseAttributeString(attrValue: string): ViewBoxInfo {\r\n if (attrValue && attrValue.trim()) {\r\n let values: string[] = attrValue.split(/[ ,]/).filter(Boolean); // filter removes empty strings\r\n\r\n let nv = values.map(Number);\r\n\r\n return new ViewBoxInfo({ min_x: nv[0], min_y: nv[1], width: nv[2], height: nv[3] });\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n public static FromElement(svg: SVGElement): ViewBoxInfo {\r\n let attr = svg.getAttribute('viewBox');\r\n return ViewBoxInfo.parseAttributeString(attr);\r\n }\r\n}\r\n"]}