Build 589089stable
Module 765270
11,885 characters · in no known chunkDependencies
Source Raw
function(e,t,n){"use strict";n.d(t,{A:()=>c});var i=n(284009),r=n.n(i),a=n(583954);class s{color="black";font={style:"normal",weight:300,size:24,family:["serif"],truncate:a.Kq.None};filter={blur:0,brightness:1,contrast:1,grayscale:0,hueRotation:0,invert:0,opacity:1,saturate:1,sepia:0};assetMap;canvas;constructor(e,t){this.canvas=e,this.assetMap=t}getCanvas(){return this.canvas}setColor(e){this.color=e}setFont(e){this.font.style=e.style??this.font.style,this.font.size=e.size??this.font.size,this.font.weight=e.weight??this.font.weight,this.font.family=e.family??this.font.family,this.font.truncate=e.truncate??this.font.truncate}setFilter(e){this.filter.blur=e.blur??this.filter.blur,this.filter.brightness=e.brightness??this.filter.brightness,this.filter.contrast=e.contrast??this.filter.contrast,this.filter.grayscale=e.grayscale??this.filter.grayscale,this.filter.hueRotation=e.hueRotation??this.filter.hueRotation,this.filter.invert=e.invert??this.filter.invert,this.filter.opacity=e.opacity??this.filter.opacity,this.filter.saturate=e.saturate??this.filter.saturate,this.filter.sepia=e.sepia??this.filter.sepia}getFilterString(){return[`blur(${this.filter.blur}px)`,`hue-rotate(${this.filter.hueRotation}deg)`,...["brightness","contrast","grayscale","invert","opacity","saturate","sepia"].map(e=>`${e}(${this.filter[e]})`)].join(" ")}getLoadedImage(e){r()(null!=this.assetMap,"DiscordCanvas: An AssetStore has not been initialized.");let t=this.assetMap.get(e);return void 0===t?void console.error(`DiscordCanvas: AssetMap hasn't loaded ${e}. Make sure to load it before trying to render.`):t}drawRoundedImageWithFallbacks(e,t,n,i,r){for(let s of e){let e=this.drawRoundedImage(s,t,n,i,r);if(e!==a.uS.Failure)return e}return a.uS.Failure}}let l=s,o="u">typeof OffscreenCanvas;class d{MAX_ROW_WIDTH=2176;MAX_HEIGHT=2176;nextX=0;nextY=0;tallestImageHeight=0;needsReset=!1;canvas;context;imageMap;constructor(){this.imageMap=new Map,o?this.canvas=new OffscreenCanvas(this.MAX_ROW_WIDTH,this.MAX_HEIGHT):(this.canvas=document.createElement("canvas"),this.canvas.width=this.MAX_ROW_WIDTH,this.canvas.height=this.MAX_HEIGHT);const e=this.canvas.getContext("2d",{alpha:!0,willReadFrequently:!1});if(null==e)throw Error("Couldn't construct context for offscreen canvas");this.context=e}reset(){this.context.clearRect(0,0,this.MAX_ROW_WIDTH,this.MAX_HEIGHT),this.imageMap.clear(),this.nextX=0,this.nextY=0,this.tallestImageHeight=0,this.needsReset=!1}breakToNewRow(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.nextX=0,this.nextY+=this.tallestImageHeight+4,this.tallestImageHeight=0,this.nextY>this.MAX_HEIGHT&&(e?this.reset():this.needsReset=!0)}getImage(e,t,n){let i=n??"default",r=this.imageMap.get(e);if(null!=r&&null!=r[i])return r[i];if(this.needsReset&&this.reset(),t.width>this.MAX_ROW_WIDTH||t.height>this.MAX_HEIGHT)throw Error(`Image: ${e} is too wide to use with offscreen canvas. (${t.width} x ${t.height}`);(this.nextX+t.width+4>this.MAX_ROW_WIDTH||this.nextY+t.height+4>this.MAX_HEIGHT)&&this.breakToNewRow(!0),this.context.save(),null!=n&&(this.context.filter=n),this.context.drawImage(t,this.nextX,this.nextY,t.width,t.height),this.context.restore();let a=this.imageMap.get(e)??{},s={x:this.nextX,y:this.nextY,w:t.width,h:t.height};return this.imageMap.set(e,{...a,[i]:s}),t.height>this.tallestImageHeight&&(this.tallestImageHeight=t.height),this.nextX+=t.width+4,this.nextX>this.MAX_ROW_WIDTH&&this.breakToNewRow(),s}}class c extends l{canvas;context;offscreenCanvasCache=void 0;_warnedAboutFilters=!1;constructor(e,t){super(e,t),this.canvas=e,this.context=this.canvas.getContext("2d"),null!=this.context&&(this.context.imageSmoothingQuality="high")}setupOffscreenCanvas(){try{this.offscreenCanvasCache=new d}catch(e){this.offscreenCanvasCache=void 0}}getCanvasForExport(){return this.canvas}setFilter(e){!1===this._warnedAboutFilters&&this.offscreenCanvasCache,super.setFilter(e)}setContextProperties(){null!=this.context&&(this.context.fillStyle=this.color,this.context.strokeStyle=this.color,this.context.font=`${this.font.style} ${this.font.weight} ${this.font.size}px ${this.font.family.join(", ")}`)}setSize(e,t){let{w:n,h:i}=e;null!=this.context&&null!=t?(this.canvas.width=n*t,this.canvas.height=i*t,this.context.scale(t,t)):(this.canvas.width=n,this.canvas.height=i)}clearRect(e){if(null==this.context)return;let{x:t,y:n,w:i,h:r}=e;this.context.clearRect(t,n,i,r)}restoreContext(){null!=this.context&&this.context.restore()}rotateAroundOriginAndDraw(e,t,n){null!=this.context&&(this.context.save(),this.context.translate(e.x,e.y),this.context.rotate(t*Math.PI/180),n(),this.context.restore())}drawRect(e){let t=!(arguments.length>1)||void 0===arguments[1]||arguments[1],n=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(null==this.context)return;let{x:i,y:r,w:a,h:s}=e;n&&this.setContextProperties(),t?this.context.fillRect(i,r,a,s):this.context.strokeRect(i,r,a,s)}drawRoundedRect(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=!(arguments.length>2)||void 0===arguments[2]||arguments[2],i=!(arguments.length>3)||void 0===arguments[3]||arguments[3];if(null==this.context)return;let{x:r,y:a,w:s,h:l}=e;i&&this.setContextProperties(),this.context.beginPath(),this.context.roundRect(r,a,s,l,t),n?this.context.fill():this.context.stroke()}drawText(e,t,n){if(null==this.context)return;this.setContextProperties();let i=t.w??this.canvas.width-t.x,s=this.context.measureText(e),l=!1,o=this.font.size,d=(e,t)=>{null!=this.context&&(n?this.context.fillText(e,t.x,t.y):this.context.strokeText(e,t.x,t.y))},c=e=>{if(null==this.context||s.width<=12)return"";let t=`${e}`;for(;s.width+12>i;)t=t.slice(0,-4),s=this.context.measureText(t),l=!0;return l&&(t+="..."),t};if(this.font.truncate===a.Kq.None&&d(e,t),this.font.truncate===a.Kq.Truncate&&d(e=c(e),t),this.font.truncate===a.Kq.Wrap){let n=e.split(" "),a=1/0,l="",u=0;for(null!=t.h&&(a=t.h/o,r()(a>0,`DiscordCavas: boundingBox.h of ${t.h} results in 0 visible lines with font size of ${o}`));n.length>0;)if((s=this.context.measureText(l+" "+n[0])).width>i){let e=!1;if(u+1>=a&&n.length>0&&(e=!0),""!==l?(d(e?c(l+"..."):l,{x:t.x,y:t.y+o*u}),l=""):d(c(n.shift()??""),{x:t.x,y:t.y+o*u}),e)break;u+=1}else l+=` ${n.shift()}`,0===n.length&&d(l,{x:t.x,y:t.y+o*u})}return{x:t.x,y:t.y,w:s.width,h:s.actualBoundingBoxAscent+s.actualBoundingBoxDescent}}drawFormattedMessage(e,t,n){this.font.truncate===a.Kq.Wrap&&console.warn("DiscordCavas: `drawFormattedMessage` doesn't currently support wrapping formatted text. The results of this draw likely won't match your expectations.");let i=this.font.weight,r=(e,t,n)=>{let r;return"strong"===e.type&&this.setFont({weight:700}),r=Array.isArray(e.content)?s(e.content,t,n):this.drawText(e.content,t,n),this.setFont({weight:i}),r},s=(e,t,n)=>{let i=0;return e.forEach(e=>{let{x:a,y:s,w:l,h:o}=t,d=null!=l?l-i:void 0,c=r(e,{x:a+i,y:s,w:d,h:o},n);null!=c&&(i+=c.w)}),{x:t.x+i,y:t.y,w:i,h:this.font.size}};Array.isArray(e)?s(e,t,n):r(e,t,n)}drawImage(e,t,n){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{fillMode:a.VZ.Stretch};r()(null!=this.assetMap,"DiscordCavas: `drawImage` requires an AssetMap to be initialized.");let{fillMode:s}=i;if(null==this.context)return a.uS.Failure;this.setContextProperties();let l=this.assetMap.get(e);if(null==l)return a.uS.ImageNotLoaded;if(null!=n){if(s===a.VZ.Contain){let i,r={w:l.width,h:l.height},s=+(r.w/r.h).toFixed(1);if(+(n.w/n.h).toFixed(1)>s){let e=n.h*s;i={x:t.x+(n.w-e)/2,y:t.y,w:e,h:n.h}}else{let e=n.w/s;i={x:t.x,y:t.y+(n.h-e)/2,w:n.w,h:e}}return this.drawCroppedImage(e,{x:0,y:0,w:r.w,h:r.h},{x:i.x,y:i.y,w:i.w,h:i.h}),a.uS.Success}if(s===a.VZ.Cover){let r,s={w:l.width,h:l.height},o=+(s.w/s.h).toFixed(1),d=+(n.w/n.h).toFixed(1);if(d>o){let e=s.w/d;r={...{x:0,y:(s.h-e)*(i?.focus?.y??.5)},w:l.width,h:e}}else{let e=s.h*d;r={...{x:(l.width-e)*(i?.focus?.x??.5),y:0},w:e,h:l.height}}return this.drawCroppedImage(e,r,{x:t.x,y:t.y,w:n.w,h:n.h}),a.uS.Success}if(null!=this.offscreenCanvasCache)return this.drawCachedImage(e,t,n);this.context.drawImage(l,t.x,t.y,n.w,n.h)}else{if(null!=this.offscreenCanvasCache)return this.drawCachedImage(e,t);this.context.drawImage(l,t.x,t.y)}return a.uS.Success}drawRoundedImage(e,t,n,i,r){if(null==this.context)return a.uS.Failure;let{x:s,y:l}=t,{w:o,h:d}=n;this.context.save();let c=new Path2D;c.roundRect(s,l,o,d,i),this.context.clip(c);let u=this.drawImage(e,t,n,r);return this.restoreContext(),u}drawCroppedImage(e,t,n){if(null!=this.offscreenCanvasCache&&this.drawCroppedCachedImage(e,t,n),null==this.context)return a.uS.Failure;let i=this.assetMap?.get(e);if(null==i)return a.uS.ImageNotLoaded;if(null!=this.offscreenCanvasCache)return this.drawCroppedCachedImage(e,t,n);{let{x:e,y:r,w:a,h:s}=t,{x:l,y:o,w:d,h:c}=n;this.context.drawImage(i,e,r,a,s,l,o,d,c)}return a.uS.Success}drawCachedImage(e,t,n){if(r()(null!=this.assetMap,"DiscordCavas: `drawImage` requires an AssetMap to be initialized."),r()(null!=this.offscreenCanvasCache,"DiscordCavas: `drawCachedImage` requires an offscreen canvas being initialized."),null==this.context)return a.uS.Failure;let i=this.assetMap.get(e);if(null==i)return a.uS.ImageNotLoaded;let s=this.offscreenCanvasCache.getImage(e.toString(),i,this.getFilterString());return null==s?a.uS.Failure:(this.context.drawImage(this.offscreenCanvasCache.canvas,s.x,s.y,s.w,s.h,t.x,t.y,n?.w??s.w,n?.h??s.h),a.uS.Success)}drawCroppedCachedImage(e,t,n){if(r()(null!=this.assetMap,"DiscordCavas: `drawImage` requires an AssetMap to be initialized."),r()(null!=this.offscreenCanvasCache,"DiscordCavas: `drawCachedImage` requires an offscreen canvas being initialized."),null==this.context)return a.uS.Failure;let i=this.assetMap.get(e);if(null==i)return a.uS.ImageNotLoaded;let s=this.offscreenCanvasCache.getImage(e.toString(),i,this.getFilterString());if(null==s)return a.uS.Failure;let{x:l,y:o,w:d,h:c}=t,{x:u,y:_,w:E,h:A}=n;return this.context.drawImage(this.offscreenCanvasCache.canvas,s.x+l,s.y+o,d,c,u,_,E,A),a.uS.Success}drawPath(e,t){let n=!(arguments.length>2)||void 0===arguments[2]||arguments[2],i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;if(null==this.context)return a.uS.Failure;this.setContextProperties(),this.context.save();let r=new Path2D(e);return this.context.translate(t.x,t.y),this.context.scale(i,i),n?this.context.fill(r,"evenodd"):this.context.stroke(r),this.restoreContext(),a.uS.Success}setGradientFillStyle(e,t,n){if(null==this.context)return;let i=this.context.createLinearGradient(t.x,t.y,n.x,n.y);for(let{color:t,stop:n}of e)i.addColorStop(n,t);this.context.fillStyle=i}drawGradientRect(e,t,n,i){return null==this.context?a.uS.Failure:(this.setGradientFillStyle(e,t,n),this.drawRect(i,!0,!1),a.uS.Success)}drawRoundedGradientRect(e,t,n,i,r){return null==this.context?a.uS.Failure:(this.setGradientFillStyle(e,t,n),this.drawRoundedRect(i,r,!0,!1),a.uS.Success)}clip(e,t){if(null==this.context)return;this.context.save();let{x:n,y:i}=e,r=new Path2D(t);this.context.translate(n,i),this.context.clip(r)}clipRect(e,t){if(null==this.context)return;this.context.save();let{x:n,y:i,w:r,h:a}=e;if(t){let e=new Path2D;e.moveTo(0,0),e.lineTo(this.canvas.width,0),e.lineTo(this.canvas.width,this.canvas.height),e.lineTo(0,this.canvas.height),e.lineTo(0,0),e.closePath(),e.rect(n,i,r,a),this.context.clip(e,"evenodd")}else{let e=new Path2D;e.rect(n,i,r,a),this.context.clip(e)}}clipRoundedRect(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2?arguments[2]:void 0;if(null==this.context)return;this.context.save();let{x:i,y:r,w:a,h:s}=e;if(n){let e=new Path2D;e.moveTo(0,0),e.lineTo(this.canvas.width,0),e.lineTo(this.canvas.width,this.canvas.height),e.lineTo(0,this.canvas.height),e.lineTo(0,0),e.closePath(),e.roundRect(i,r,a,s,t),this.context.clip(e,"evenodd")}else{let e=new Path2D;e.roundRect(i,r,a,s,t),this.context.clip(e)}}}}