UNPKG

29.4 kBJavaScriptView Raw
1!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Qratch={})}(this,(function(e){"use strict";class t{constructor(e){this.canvas=e;const t=this.canvas.getContext("2d");if(!t)throw new TypeError("Could not get CanvasRenderingContext2D.");this.context=t}get width(){return this.canvas.width}get height(){return this.canvas.height}center(){return{x:this.width/2,y:this.height/2}}fill(e){this.fillRect(0,0,this.width,this.height,e)}fillRect(e,t,r,i,n){this.context.fillStyle=n,this.context.fillRect(e,t,r,i)}strokeRect(e,t,r,i,n,o){this.context.lineWidth=n,this.context.strokeStyle=o,this.context.strokeRect(e,t,r,i)}line(e,t,r,i,n,o,s){this.context.lineWidth=n,this.context.strokeStyle=s,this.context.lineCap=o,this.context.beginPath(),this.context.moveTo(e,t),this.context.lineTo(r,i),this.context.stroke()}fillArc(e,t,r,i,n,o,s){this.context.fillStyle=o,this.context.beginPath(),this.context.arc(e,t,r,i,n,s),this.context.fill()}strokeArc(e,t,r,i,n,o,s,h){this.context.strokeStyle=s,this.context.lineWidth=o,this.context.beginPath(),this.context.arc(e,t,r,i,n,h),this.context.stroke()}fillEllipse(e,t,r,i,n,o,s,h,f){this.context.fillStyle=h,this.context.beginPath(),this.context.ellipse(e,t,r,i,n,o,s,f),this.context.fill()}strokeEllipse(e,t,r,i,n,o,s,h,f,y){this.context.lineWidth=h,this.context.strokeStyle=f,this.context.beginPath(),this.context.ellipse(e,t,r,i,n,o,s,y),this.context.stroke()}fillPolygon(e,t){this.context.fillStyle=t,this.polygon(e),this.context.fill()}strokePolygon(e,t,r){this.context.lineWidth=t,this.context.fillStyle=r,this.polygon(e),this.context.fill()}polygon([e,...t]){this.context.beginPath(),this.context.moveTo(e[0],e[1]);for(const e of t)this.context.lineTo(e[0],e[1]);this.context.closePath()}fillText(e,t,r,i,n,o,s,h){this.context.fillStyle=i,this.context.textAlign=null!=s?s:this.context.textAlign,this.context.textBaseline=null!=h?h:this.context.textBaseline,this.context.font=null!=o?o:this.context.font,this.context.fillText(e,t,r,n)}strokeText(e,t,r,i,n,o,s,h,f){this.context.lineWidth=i,this.context.strokeStyle=n,this.context.textAlign=null!=h?h:this.context.textAlign,this.context.textBaseline=null!=f?f:this.context.textBaseline,this.context.font=null!=s?s:this.context.font,this.context.strokeText(e,t,r,o)}img(e,t,r,i,n){"number"!=typeof i||"number"!=typeof n?this.context.drawImage(e,t,r):this.context.drawImage(e,t,r,i,n)}}const r=e=>{if(void 0===e)return!1;const t="number"==typeof e.r&&e.r>0&&e.r<=1,r="number"==typeof e.g&&e.g>0&&e.g<=1,i="number"==typeof e.b&&e.b>0&&e.b<=1;return t&&r&&i};class i{constructor(){this.components=[]}install(e){this.components.push(e),e.onInstall&&e.onInstall()}call(e){for(const t of this.components){const r=t[e];r&&r.call(t)}}}const n=e=>"number"==typeof e?`${e}px`:e,o=e=>{var t,r,i;const o=null!==(t=e.font)&&void 0!==t?t:"",s=void 0===e.size?"":n(e.size);return[null!==(r=e.style)&&void 0!==r?r:"",null!==(i=e.weight)&&void 0!==i?i:"",s,o].join(" ")},s=e=>"number"==typeof e||"string"==typeof e,h=["normal","italic"],f=e=>h.includes(e),y=["normal","bold","lighter","bolder"],u=e=>"number"==typeof e||y.includes(e),l=e=>{if(void 0===e)return!1;const t=void 0===e.font||"string"==typeof e.font,r=void 0===e.size||s(e.size),i=void 0===e.style||f(e.style),n=void 0===e.weight||u(e.weight);return t&&r&&i&&n},p=e=>void 0!==e&&("number"==typeof e.x&&"number"==typeof e.y),m=e=>e instanceof Image||e instanceof HTMLCanvasElement||e instanceof HTMLVideoElement||e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas,d=e=>void 0!==e&&"function"==typeof e.toRenderStyle,b=e=>void 0!==e&&("number"==typeof e.width&&"number"==typeof e.height);class a{constructor(e){this.renderer=e}fillRect(...e){if(p(e[0])&&b(e[1])&&"string"==typeof e[2])this.renderer.fillRect(e[0].x,e[0].y,e[1].width,e[1].height,e[2]);else if(p(e[0])&&b(e[1])&&d(e[2]))this.renderer.fillRect(e[0].x,e[0].y,e[1].width,e[1].height,e[2].toRenderStyle());else if(p(e[0])&&"number"==typeof e[1]&&"number"==typeof e[2]&&"string"==typeof e[3])this.renderer.fillRect(e[0].x,e[0].y,e[1],e[2],e[3]);else if(p(e[0])&&"number"==typeof e[1]&&"number"==typeof e[2]&&d(e[3]))this.renderer.fillRect(e[0].x,e[0].y,e[1],e[2],e[3].toRenderStyle());else if("number"==typeof e[0]&&"number"==typeof e[1]&&b(e[2])&&"string"==typeof e[3])this.renderer.fillRect(e[0],e[1],e[2].width,e[2].height,e[3]);else if("number"==typeof e[0]&&"number"==typeof e[1]&&b(e[2])&&d(e[3]))this.renderer.fillRect(e[0],e[1],e[2].width,e[2].height,e[3].toRenderStyle());else if("number"!=typeof e[0]||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"string"!=typeof e[4]){if("number"!=typeof e[0]||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||!d(e[4]))throw new TypeError(this.constructor.name+".fillRect: invalid arguments.");this.renderer.fillRect(e[0],e[1],e[2],e[3],e[4].toRenderStyle())}else this.renderer.fillRect(e[0],e[1],e[2],e[3],e[4])}strokeRect(...e){if(p(e[0])&&b(e[1])&&"number"==typeof e[2]&&"string"==typeof e[3])this.renderer.strokeRect(e[0].x,e[0].y,e[1].width,e[1].height,e[2],e[3]);else if(p(e[0])&&b(e[1])&&"number"==typeof e[2]&&d(e[3]))this.renderer.strokeRect(e[0].x,e[0].y,e[1].width,e[1].height,e[2],e[3].toRenderStyle());else if(p(e[0])&&"number"==typeof e[1]&&"number"==typeof e[2]&&"number"==typeof e[3]&&"string"==typeof e[4])this.renderer.strokeRect(e[0].x,e[0].y,e[1],e[2],e[3],e[4]);else if(p(e[0])&&"number"==typeof e[1]&&"number"==typeof e[2]&&"number"==typeof e[3]&&d(e[4]))this.renderer.strokeRect(e[0].x,e[0].y,e[1],e[2],e[3],e[4].toRenderStyle());else if("number"==typeof e[0]&&"number"==typeof e[1]&&b(e[2])&&"number"==typeof e[3]&&"string"==typeof e[4])this.renderer.strokeRect(e[0],e[1],e[2].width,e[2].height,e[3],e[4]);else if("number"==typeof e[0]&&"number"==typeof e[1]&&b(e[2])&&"number"==typeof e[3]&&d(e[4]))this.renderer.strokeRect(e[0],e[1],e[2].width,e[2].height,e[3],e[4].toRenderStyle());else if("number"!=typeof e[0]||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"number"!=typeof e[4]||"string"!=typeof e[5]){if("number"!=typeof e[0]||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"number"!=typeof e[4]||!d(e[5]))throw new TypeError(this.constructor.name+".strokeRect: invalid arguments.");this.renderer.strokeRect(e[0],e[1],e[2],e[3],e[4],e[5].toRenderStyle())}else this.renderer.strokeRect(e[0],e[1],e[2],e[3],e[4],e[5])}line(...e){if(p(e[0])&&p(e[1])&&"number"==typeof e[2]&&"string"==typeof e[3]&&"string"==typeof e[4])this.renderer.line(e[0].x,e[0].y,e[1].x,e[1].y,e[2],e[3],e[4]);else if(p(e[0])&&p(e[1])&&"number"==typeof e[2]&&"string"==typeof e[3]&&d(e[4]))this.renderer.line(e[0].x,e[0].y,e[1].x,e[1].y,e[2],e[3],e[4].toRenderStyle());else if(p(e[0])&&"number"==typeof e[1]&&"number"==typeof e[2]&&"number"==typeof e[3]&&"string"==typeof e[4]&&"string"==typeof e[5])this.renderer.line(e[0].x,e[0].y,e[1],e[2],e[3],e[4],e[5]);else if(p(e[0])&&"number"==typeof e[1]&&"number"==typeof e[2]&&"number"==typeof e[3]&&"string"==typeof e[4]&&d(e[5]))this.renderer.line(e[0].x,e[0].y,e[1],e[2],e[3],e[4],e[5].toRenderStyle());else if("number"==typeof e[0]&&"number"==typeof e[1]&&p(e[2])&&"number"==typeof e[3]&&"string"==typeof e[4]&&"string"==typeof e[5])this.renderer.line(e[0],e[1],e[2].x,e[2].y,e[3],e[4],e[5]);else if("number"==typeof e[0]&&"number"==typeof e[1]&&p(e[2])&&"number"==typeof e[3]&&"string"==typeof e[4]&&d(e[5]))this.renderer.line(e[0],e[1],e[2].x,e[2].y,e[3],e[4],e[5].toRenderStyle());else if("number"!=typeof e[0]||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"number"!=typeof e[4]||"string"!=typeof e[5]||"string"!=typeof e[6]){if("number"!=typeof e[0]||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"number"!=typeof e[4]||"string"!=typeof e[5]||!d(e[6]))throw new TypeError(this.constructor.name+".line: invalid arguments.");this.renderer.line(e[0],e[1],e[2],e[3],e[4],e[5],e[6].toRenderStyle())}else this.renderer.line(e[0],e[1],e[2],e[3],e[4],e[5],e[6])}fillArc(...e){if(!p(e[0])||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"string"!=typeof e[4]||"boolean"!=typeof e[5]&&void 0!==e[5])if(!p(e[0])||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||!d(e[4])||"boolean"!=typeof e[5]&&void 0!==e[5])if("number"!=typeof e[0]||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"number"!=typeof e[4]||"string"!=typeof e[5]||"boolean"!=typeof e[6]&&void 0!==e[6]){if("number"!=typeof e[0]||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"number"!=typeof e[4]||!d(e[5])||"boolean"!=typeof e[6]&&void 0!==e[6])throw new TypeError(this.constructor.name+".fillArc: invalid arguments.");this.renderer.fillArc(e[0],e[1],e[2],e[3],e[4],e[5].toRenderStyle(),e[6])}else this.renderer.fillArc(e[0],e[1],e[2],e[3],e[4],e[5],e[6]);else this.renderer.fillArc(e[0].x,e[0].y,e[1],e[2],e[3],e[4].toRenderStyle(),e[5]);else this.renderer.fillArc(e[0].x,e[0].y,e[1],e[2],e[3],e[4],e[5])}strokeArc(...e){if(!p(e[0])||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"number"!=typeof e[4]||"string"!=typeof e[5]||"boolean"!=typeof e[6]&&void 0!==e[6])if(!p(e[0])||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"number"!=typeof e[4]||!d(e[5])||"boolean"!=typeof e[6]&&void 0!==e[6])if("number"!=typeof e[0]||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"number"!=typeof e[4]||"number"!=typeof e[5]||"string"!=typeof e[6]||"boolean"!=typeof e[7]&&void 0!==e[7]){if("number"!=typeof e[0]||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"number"!=typeof e[4]||"number"!=typeof e[5]||!d(e[6])||"boolean"!=typeof e[7]&&void 0!==e[7])throw new TypeError(this.constructor.name+".strokeArc: invalid arguments.");this.renderer.strokeArc(e[0],e[1],e[2],e[3],e[4],e[5],e[6].toRenderStyle(),e[7])}else this.renderer.strokeArc(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7]);else this.renderer.strokeArc(e[0].x,e[0].y,e[1],e[2],e[3],e[4],e[5].toRenderStyle(),e[6]);else this.renderer.strokeArc(e[0].x,e[0].y,e[1],e[2],e[3],e[4],e[5],e[6])}fillEllipse(...e){if(!p(e[0])||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"number"!=typeof e[4]||"number"!=typeof e[5]||"string"!=typeof e[6]||"boolean"!=typeof e[7]&&void 0!==e[7])if(!p(e[0])||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"number"!=typeof e[4]||"number"!=typeof e[5]||!d(e[6])||"boolean"!=typeof e[7]&&void 0!==e[7])if("number"!=typeof e[0]||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"number"!=typeof e[4]||"number"!=typeof e[5]||"number"!=typeof e[6]||"string"!=typeof e[7]||"boolean"!=typeof e[8]&&void 0!==e[8]){if("number"!=typeof e[0]||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"number"!=typeof e[4]||"number"!=typeof e[5]||"number"!=typeof e[6]||!d(e[7])||"boolean"!=typeof e[8]&&void 0!==e[8])throw new TypeError(this.constructor.name+".fillEllipse: invalid arguments.");this.renderer.fillEllipse(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7].toRenderStyle(),e[8])}else this.renderer.fillEllipse(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8]);else this.renderer.fillEllipse(e[0].x,e[0].y,e[1],e[2],e[3],e[4],e[5],e[6].toRenderStyle(),e[7]);else this.renderer.fillEllipse(e[0].x,e[0].y,e[1],e[2],e[3],e[4],e[5],e[6],e[7])}strokeEllipse(...e){if(!p(e[0])||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"number"!=typeof e[4]||"number"!=typeof e[5]||"number"!=typeof e[6]||"string"!=typeof e[7]||"boolean"!=typeof e[8]&&void 0!==e[8])if(!p(e[0])||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"number"!=typeof e[4]||"number"!=typeof e[5]||"number"!=typeof e[6]||!d(e[7])||"boolean"!=typeof e[8]&&void 0!==e[8])if("number"!=typeof e[0]||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"number"!=typeof e[4]||"number"!=typeof e[5]||"number"!=typeof e[6]||"number"!=typeof e[7]||"string"!=typeof e[8]||"boolean"!=typeof e[9]&&void 0!==e[9]){if("number"!=typeof e[0]||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"number"!=typeof e[4]||"number"!=typeof e[5]||"number"!=typeof e[6]||"number"!=typeof e[7]||!d(e[8])||"boolean"!=typeof e[9]&&void 0!==e[9])throw new TypeError(this.constructor.name+".strokeEllipse: invalid arguments.");this.renderer.strokeEllipse(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8].toRenderStyle(),e[9])}else this.renderer.strokeEllipse(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9]);else this.renderer.strokeEllipse(e[0].x,e[0].y,e[1],e[2],e[3],e[4],e[5],e[6],e[7].toRenderStyle(),e[8]);else this.renderer.strokeEllipse(e[0].x,e[0].y,e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8])}fillPolygon(...e){if(Array.isArray(e[0])&&"string"==typeof e[1])this.renderer.fillPolygon(e[0].map((e=>p(e)?[e.x,e.y]:e)),e[1]);else{if(!Array.isArray(e[0])||!d(e[1]))throw new TypeError(this.constructor.name+".fillPolygon: invalid arguments.");this.renderer.fillPolygon(e[0].map((e=>p(e)?[e.x,e.y]:e)),e[1].toRenderStyle())}}strokePolygon(...e){if(Array.isArray(e[0])&&"number"==typeof e[1]&&"string"==typeof e[2])this.renderer.strokePolygon(e[0].map((e=>p(e)?[e.x,e.y]:e)),e[1],e[2]);else{if(!Array.isArray(e[0])||"number"!=typeof e[1]||!d(e[2]))throw new TypeError(this.constructor.name+".strokePolygon: invalid arguments.");this.renderer.strokePolygon(e[0].map((e=>p(e)?[e.x,e.y]:e)),e[1],e[2].toRenderStyle())}}fillText(...e){if("string"!=typeof e[0]||!p(e[1])||"string"!=typeof e[2]||"number"!=typeof e[3]&&void 0!==e[3]||!l(e[4])&&void 0!==e[4]||"string"!=typeof e[5]&&void 0!==e[5]||"string"!=typeof e[6]&&void 0!==e[6])if("string"!=typeof e[0]||!p(e[1])||!d(e[2])||"number"!=typeof e[3]&&void 0!==e[3]||!l(e[4])&&void 0!==e[4]||"string"!=typeof e[5]&&void 0!==e[5]||"string"!=typeof e[6]&&void 0!==e[6])if("string"!=typeof e[0]||"number"!=typeof e[1]||"number"!=typeof e[2]||"string"!=typeof e[3]||"number"!=typeof e[4]&&void 0!==e[4]||!l(e[5])&&void 0!==e[5]||"string"!=typeof e[6]&&void 0!==e[6]||"string"!=typeof e[7]&&void 0!==e[7]){if("string"!=typeof e[0]||"number"!=typeof e[1]||"number"!=typeof e[2]||!d(e[3])||"number"!=typeof e[4]&&void 0!==e[4]||!l(e[5])&&void 0!==e[5]||"string"!=typeof e[6]&&void 0!==e[6]||"string"!=typeof e[7]&&void 0!==e[7])throw new TypeError(this.constructor.name+".fillText: invalid arguments.");this.renderer.fillText(e[0],e[1],e[2],e[3].toRenderStyle(),e[4],e[5]?o(e[5]):void 0,e[6],e[7])}else this.renderer.fillText(e[0],e[1],e[2],e[3],e[4],e[5]?o(e[5]):void 0,e[6],e[7]);else this.renderer.fillText(e[0],e[1].x,e[1].y,e[2].toRenderStyle(),e[3],e[4]?o(e[4]):void 0,e[5],e[6]);else this.renderer.fillText(e[0],e[1].x,e[1].y,e[2],e[3],e[4]?o(e[4]):void 0,e[5],e[6])}strokeText(...e){if("string"!=typeof e[0]||!p(e[1])||"number"!=typeof e[2]||"string"!=typeof e[3]||"number"!=typeof e[4]&&void 0!==e[4]||!l(e[5])&&void 0!==e[5]||"string"!=typeof e[6]&&void 0!==e[6]||"string"!=typeof e[7]&&void 0!==e[7])if("string"!=typeof e[0]||!p(e[1])||"number"!=typeof e[2]||!d(e[3])||"number"!=typeof e[4]&&void 0!==e[4]||!l(e[5])&&void 0!==e[5]||"string"!=typeof e[6]&&void 0!==e[6]||"string"!=typeof e[7]&&void 0!==e[7])if("string"!=typeof e[0]||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||"string"!=typeof e[4]||"number"!=typeof e[5]&&void 0!==e[5]||!l(e[6])&&void 0!==e[6]||"string"!=typeof e[7]&&void 0!==e[7]||"string"!=typeof e[8]&&void 0!==e[8]){if("string"!=typeof e[0]||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]||!d(e[4])||"number"!=typeof e[5]&&void 0!==e[5]||!l(e[6])&&void 0!==e[6]||"string"!=typeof e[7]&&void 0!==e[7]||"string"!=typeof e[8]&&void 0!==e[8])throw new TypeError(this.constructor.name+".strokeText: invalid arguments.");this.renderer.strokeText(e[0],e[1],e[2],e[3],e[4].toRenderStyle(),e[5],e[6]?o(e[6]):void 0,e[7],e[8])}else this.renderer.strokeText(e[0],e[1],e[2],e[3],e[4],e[5],e[6]?o(e[6]):void 0,e[7],e[8]);else this.renderer.strokeText(e[0],e[1].x,e[1].y,e[2],e[3].toRenderStyle(),e[4],e[5]?o(e[5]):void 0,e[6],e[7]);else this.renderer.strokeText(e[0],e[1].x,e[1].y,e[2],e[3],e[4],e[5]?o(e[5]):void 0,e[6],e[7])}img(...e){var t,r,i,n;if(m(e[0])&&p(e[1])&&(b(e[2])||void 0===e[2]))this.renderer.img(e[0],e[1].x,e[1].y,null===(t=e[2])||void 0===t?void 0:t.width,null===(r=e[2])||void 0===r?void 0:r.height);else if(!m(e[0])||!p(e[1])||"number"!=typeof e[2]&&void 0!==e[2]||"number"!=typeof e[3]&&void 0!==e[3])if(!m(e[0])||"number"!=typeof e[1]||"number"!=typeof e[2]||!b(e[3])&&void 0!==e[3]){if(!m(e[0])||"number"!=typeof e[1]||"number"!=typeof e[2]||"number"!=typeof e[3]&&void 0!==e[3]||"number"!=typeof e[4]&&void 0!==e[4])throw new TypeError(this.constructor.name+".img: invalid arguments.");this.renderer.img(e[0],e[1],e[2],e[3],e[4])}else this.renderer.img(e[0],e[1],e[2],null===(i=e[3])||void 0===i?void 0:i.width,null===(n=e[3])||void 0===n?void 0:n.height);else this.renderer.img(e[0],e[1].x,e[1].y,e[2],e[3])}}class c{constructor(e){this.element=e,this.dx=0,this.dy=0,this.mx=0,this.my=0,e.addEventListener("mousemove",(t=>{const r=e.getBoundingClientRect();this.dx=this.mx,this.dy=this.my,this.mx=t.clientX-r.left,this.my=t.clientY-r.top}))}get x(){return this.mx}get y(){return this.my}delta(){return{x:this.mx-this.dx,y:this.my-this.dy}}setStyle(e){return this.element.style.cursor=e,this}getStyle(){return this.element.style||"auto"}onFrameEnd(){this.dx=this.mx,this.dy=this.my}}const g=[..."abcdefghijklmnopqrstuvwxyz","Alt","CapsLock","Control","Fn","NumLock","ScrollLock","Shift","Enter","Tab","Space","ArrowDown","ArrowLeft","ArrowRight","ArrowUp","Backsapce","Escape"];class x{constructor(e){this.element=e,this.keyStates={};for(const e of g)this.keyStates[e]={isPressed:!1,isUp:!1,isDown:!1};const t=e=>" "===e?"Space":e;e.addEventListener("keydown",(e=>{if(!e.key)return;const r=t(e.key);this.keyStates[r].isDown=!e.repeat,this.keyStates[r].isUp=!1,this.keyStates[r].isPressed=!0})),e.addEventListener("keyup",(e=>{if(!e.key)return;const r=t(e.key);this.keyStates[r].isDown=!1,this.keyStates[r].isUp=!0,this.keyStates[r].isPressed=!1}))}pressed(e){var t;return null!==(t=this.keyStates[e].isPressed)&&void 0!==t&&t}up(e){var t;return null!==(t=this.keyStates[e].isUp)&&void 0!==t&&t}down(e){var t;return null!==(t=this.keyStates[e].isDown)&&void 0!==t&&t}onFrameEnd(){for(const e of g)this.keyStates[e]=Object.assign(Object.assign({},this.keyStates[e]),{isUp:!1})}}const w=["Left","Middle","Right"];class v{constructor(e){this.element=e,this.buttonStates={Left:{isPressed:!1,isUp:!1,isDown:!1},Middle:{isPressed:!1,isUp:!1,isDown:!1},Right:{isPressed:!1,isUp:!1,isDown:!1}},this.wheelValue=0;const t=e=>w[e];e.addEventListener("mousedown",(e=>{if(e.button>2)return;const r=t(e.button);this.buttonStates[r].isDown=!0,this.buttonStates[r].isPressed=!0})),e.addEventListener("mouseup",(e=>{if(e.button>2)return;const r=t(e.button);this.buttonStates[r].isUp=!0,this.buttonStates[r].isPressed=!1})),e.addEventListener("wheel",(e=>{this.wheelValue=e.deltaY}))}pressed(e){return this.buttonStates[e].isPressed}down(e){return this.buttonStates[e].isDown}up(e){return this.buttonStates[e].isUp}wheel(){return this.wheelValue}onFrameEnd(){for(const e of w)this.buttonStates[e]=Object.assign(Object.assign({},this.buttonStates[e]),{isUp:!1,isDown:!1});this.wheelValue=0}}class S{constructor(){this.callbacks=[],this.currentFrames=0,this.targetFPS=60}addCallback(e){this.callbacks.push(e)}start(){let e=0;const t=r=>{if(60!==this.targetFPS){if((r-e)/1e3<=1/this.targetFPS)return void requestAnimationFrame(t)}e=r,++this.currentFrames,this.callbacks.forEach((e=>e())),requestAnimationFrame(t)};requestAnimationFrame(t)}frames(){return this.currentFrames}setTargetFPS(e){this.targetFPS=Math.max(Math.min(60,e),1)}getTargetFPS(){return this.targetFPS}}class k{constructor(...e){var t,r,i,n,o,s,h,f;if(b(e[0])||void 0===e[0])return this.width=null!==(r=null===(t=e[0])||void 0===t?void 0:t.width)&&void 0!==r?r:0,this.height=null!==(n=null===(i=e[0])||void 0===i?void 0:i.height)&&void 0!==n?n:0,this;if(!("number"!=typeof e[0]&&void 0!==e[0]||"number"!=typeof e[1]&&void 0!==e[1]))return this.width=null!==(o=e[0])&&void 0!==o?o:0,this.height=null!==(s=e[1])&&void 0!==s?s:0,this;if("number"==typeof e[0]||void 0===e[0])return this.width=null!==(h=e[0])&&void 0!==h?h:0,this.height=null!==(f=e[0])&&void 0!==f?f:0,this;throw new TypeError(this.constructor.name+".constructor: invalid arguments.")}set(...e){if(b(e[0]))return this.width=e[0].width,this.height=e[0].height,this;if("number"==typeof e[0]&&"number"==typeof e[1])return this.width=e[0],this.height=e[1],this;if("number"==typeof e[0])return this.width=e[0],this.height=e[0],this;throw new TypeError(this.constructor.name+".set: invalid arguments.")}add(...e){if(b(e[0]))return this.width+=e[0].width,this.height+=e[0].height,this;if("number"==typeof e[0]&&"number"==typeof e[1])return this.width+=e[0],this.height+=e[1],this;if("number"==typeof e[0])return this.width+=e[0],this.height+=e[0],this;throw new TypeError(this.constructor.name+".add: invalid arguments.")}sub(...e){if(b(e[0]))return this.width-=e[0].width,this.height-=e[0].height,this;if("number"==typeof e[0]&&"number"==typeof e[1])return this.width-=e[0],this.height-=e[1],this;if("number"==typeof e[0])return this.width-=e[0],this.height-=e[0],this;throw new TypeError(this.constructor.name+".sub: invalid arguments.")}mul(...e){if(b(e[0]))return this.width*=e[0].width,this.height*=e[0].height,this;if("number"==typeof e[0]&&"number"==typeof e[1])return this.width*=e[0],this.height*=e[1],this;if("number"==typeof e[0])return this.width*=e[0],this.height*=e[0],this;throw new TypeError(this.constructor.name+".mul: invalid arguments.")}div(...e){if(b(e[0]))return this.width/=e[0].width,this.height/=e[0].height,this;if("number"==typeof e[0]&&"number"==typeof e[1])return this.width/=e[0],this.height/=e[1],this;if("number"==typeof e[0])return this.width/=e[0],this.height/=e[0],this;throw new TypeError(this.constructor.name+".div: invalid arguments.")}getAdd(...e){if(b(e[0]))return new k(this.width+e[0].width,this.height+e[0].height);if("number"==typeof e[0]&&"number"==typeof e[1])return new k(this.width+e[0],this.height+e[1]);if("number"==typeof e[0])return new k(this.width+e[0],this.height+e[0]);throw new TypeError(this.constructor.name+".getAdd: invalid arguments.")}getSub(...e){if(b(e[0]))return new k(this.width-e[0].width,this.height-e[0].height);if("number"==typeof e[0]&&"number"==typeof e[1])return new k(this.width-e[0],this.height-e[1]);if("number"==typeof e[0])return new k(this.width-e[0],this.height-e[0]);throw new TypeError(this.constructor.name+".getSub: invalid arguments.")}getMul(...e){if(b(e[0]))return new k(this.width*e[0].width,this.height*e[0].height);if("number"==typeof e[0]&&"number"==typeof e[1])return new k(this.width*e[0],this.height*e[1]);if("number"==typeof e[0])return new k(this.width*e[0],this.height*e[0]);throw new TypeError(this.constructor.name+".getMul: invalid arguments.")}getDiv(...e){if(b(e[0]))return new k(this.width/e[0].width,this.height/e[0].height);if("number"==typeof e[0]&&"number"==typeof e[1])return new k(this.width/e[0],this.height/e[1]);if("number"==typeof e[0])return new k(this.width/e[0],this.height/e[0]);throw new TypeError(this.constructor.name+".getDiv: invalid arguments.")}area(){return this.width*this.height}}class T{constructor(...e){var t,r,i,n,o,s,h,f;if(p(e[0])||void 0===e[0])return this.x=null!==(r=null===(t=e[0])||void 0===t?void 0:t.x)&&void 0!==r?r:0,this.y=null!==(n=null===(i=e[0])||void 0===i?void 0:i.y)&&void 0!==n?n:0,this;if(!("number"!=typeof e[0]&&void 0!==e[0]||"number"!=typeof e[1]&&void 0!==e[1]))return this.x=null!==(o=e[0])&&void 0!==o?o:0,this.y=null!==(s=e[1])&&void 0!==s?s:0,this;if("number"==typeof e[0]||void 0===e[0])return this.x=null!==(h=e[0])&&void 0!==h?h:0,this.y=null!==(f=e[0])&&void 0!==f?f:0,this;throw new TypeError(this.constructor.name+".constructor: invalid arguments.")}set(...e){if(p(e[0]))return this.x=e[0].x,this.y=e[0].y,this;if("number"==typeof e[0]&&"number"==typeof e[1])return this.x=e[0],this.y=e[1],this;if("number"==typeof e[0])return this.x=e[0],this.y=e[0],this;throw new TypeError(this.constructor.name+".set: invalid arguments.")}add(...e){if(p(e[0]))return this.x+=e[0].x,this.y+=e[0].y,this;if("number"==typeof e[0]&&"number"==typeof e[1])return this.x+=e[0],this.y+=e[1],this;if("number"==typeof e[0])return this.x+=e[0],this.y+=e[0],this;throw new TypeError(this.constructor.name+".add: invalid arguments.")}sub(...e){if(p(e[0]))return this.x-=e[0].x,this.y-=e[0].y,this;if("number"==typeof e[0]&&"number"==typeof e[1])return this.x-=e[0],this.y-=e[1],this;if("number"==typeof e[0])return this.x-=e[0],this.y-=e[0],this;throw new TypeError(this.constructor.name+".sub: invalid arguments.")}mul(...e){if(p(e[0]))return this.x*=e[0].x,this.y*=e[0].y,this;if("number"==typeof e[0]&&"number"==typeof e[1])return this.x*=e[0],this.y*=e[1],this;if("number"==typeof e[0])return this.x*=e[0],this.y*=e[0],this;throw new TypeError(this.constructor.name+".mul: invalid arguments.")}div(...e){if(p(e[0]))return this.x/=e[0].x,this.y/=e[0].y,this;if("number"==typeof e[0]&&"number"==typeof e[1])return this.x/=e[0],this.y/=e[1],this;if("number"==typeof e[0])return this.x/=e[0],this.y/=e[0],this;throw new TypeError(this.constructor.name+".div: invalid arguments.")}getAdd(...e){if(p(e[0]))return new T(this.x+e[0].x,this.y+e[0].y);if("number"==typeof e[0]&&"number"==typeof e[1])return new T(this.x+e[0],this.y+e[1]);if("number"==typeof e[0])return new T(this.x+e[0],this.y+e[0]);throw new TypeError(this.constructor.name+".getAdd: invalid arguments.")}getSub(...e){if(p(e[0]))return new T(this.x-e[0].x,this.y-e[0].y);if("number"==typeof e[0]&&"number"==typeof e[1])return new T(this.x-e[0],this.y-e[1]);if("number"==typeof e[0])return new T(this.x-e[0],this.y-e[0]);throw new TypeError(this.constructor.name+".getSub: invalid arguments.")}getMul(...e){if(p(e[0]))return new T(this.x*e[0].x,this.y*e[0].y);if("number"==typeof e[0]&&"number"==typeof e[1])return new T(this.x*e[0],this.y*e[1]);if("number"==typeof e[0])return new T(this.x*e[0],this.y*e[0]);throw new TypeError(this.constructor.name+".getMul: invalid arguments.")}getDiv(...e){if(p(e[0]))return new T(this.x/e[0].x,this.y/e[0].y);if("number"==typeof e[0]&&"number"==typeof e[1])return new T(this.x/e[0],this.y/e[1]);if("number"==typeof e[0])return new T(this.x/e[0],this.y/e[0]);throw new TypeError(this.constructor.name+".getDiv: invalid arguments.")}}e.CanvasRenderer=t,e.Color=class{constructor(...e){if(this.r=0,this.g=0,this.b=0,this.a=1,"number"==typeof e[0]&&"number"==typeof e[1]&&"number"==typeof e[2]&&"number"==typeof e[3])return this.set(e[0],e[1],e[2],e[3]),this;if("number"==typeof e[0]&&"number"==typeof e[1]&&"number"==typeof e[2])return this.set(e[0],e[1],e[2]),this;if("number"==typeof e[0]&&"number"==typeof e[1])return this.set(e[0],e[1]),this;if("number"==typeof e[0])return this.set(e[0]),this;if(r(e[0]))return this.set(e[0].r,e[0].g,e[0].g,e[0].a),this;throw new TypeError(this.constructor.name+".constructor: invalid arguments.")}set(...e){if("number"==typeof e[0]&&"number"==typeof e[1]&&"number"==typeof e[2]&&"number"==typeof e[3])return this.r=e[0],this.g=e[1],this.b=e[2],this.a=e[3],this;if("number"==typeof e[0]&&"number"==typeof e[1]&&"number"==typeof e[2])return this.r=e[0],this.g=e[1],this.b=e[2],this;if("number"==typeof e[0]&&"number"==typeof e[1])return this.r=e[0],this.g=e[0],this.b=e[0],this.a=e[1],this;if("number"==typeof e[0])return this.r=e[0],this.g=e[0],this.b=e[0],this.a=1,this;if(r(e[0]))return this.r=e[0].r,this.g=e[0].g,this.b=e[0].g,this.a=e[0].a,this;throw new TypeError(this.constructor.name+".set: invalid arguments.")}toRenderStyle(){return`rgba(${255*this.r}, ${255*this.g}, ${255*this.b}, ${this.a})`}},e.ComponentManager=i,e.Drawer=a,e.HTMLElementCursor=c,e.HTMLElementKeyboard=x,e.HTMLElementMouse=v,e.KEY_CODES=g,e.MOUSE_BUTTON_CODES=w,e.QratchApp=class{constructor(e){this.components=new i,this.ticker=e.ticker,this.renderer=e.renderer,this.mouse=e.mouse,this.cursor=e.cursor,this.keyboard=e.keyboard,this.components.install(this.ticker),this.components.install(this.renderer),this.components.install(this.mouse),this.components.install(this.cursor),this.components.install(this.keyboard),this.drawer=new a(this.renderer),this.init(),this.components.call("onInit")}startTicker(){this.ticker.addCallback((()=>{this.components.call("onFrameStart"),this.frame(),this.components.call("onFrameEnd")})),this.ticker.start(),this.components.call("onFrameTickerStart")}start(){this.startTicker()}init(){}},e.RequestAnimationFrameTicker=S,e.Size=k,e.Vec2=T,e.addPoints=(e,t)=>({x:e.x+t.x,y:e.y+t.y}),e.createCanvasAppOptions=e=>({ticker:new S,renderer:new t(e),mouse:new v(e),cursor:new c(e),keyboard:new x(e)}),e.divPoints=(e,t)=>({x:e.x/t.x,y:e.y/t.y}),e.fontSizeToString=n,e.fontableToString=o,e.isFontSize=s,e.isFontStyle=f,e.isFontWeight=u,e.isFontable=l,e.isPointable=p,e.isRGBA=r,e.isRenderImage=m,e.isRenderStylable=d,e.isSizeable=b,e.mulPoints=(e,t)=>({x:e.x*t.x,y:e.y*t.y}),e.subPoints=(e,t)=>({x:e.x-t.x,y:e.y-t.y}),Object.defineProperty(e,"__esModule",{value:!0})}));
2//# sourceMappingURL=index.js.map