import type { HTMLCanvasElement } from './HTMLCanvasElement'
import type { OffscreenCanvas } from './OffscreenCanvas'
import { ImageData } from './ImageData'
import * as _ from './utils'
export class CanvasRenderingContext2D {
get canvas(): HTMLCanvasElement | OffscreenCanvas | null {
return _.internalsOf(this, 'CanvasRenderingContext2D', 'canvas').canvas
}
get direction(): 'ltr' | 'rtl' | 'inherit' {
return _.internalsOf(this, 'CanvasRenderingContext2D', 'direction')
.direction
}
get fillStyle(): string {
return _.internalsOf(this, 'CanvasRenderingContext2D', 'fillStyle')
.fillStyle
}
get filter(): string {
return _.internalsOf(this, 'CanvasRenderingContext2D', 'filter').filter
}
get globalAlpha(): number {
return _.internalsOf(this, 'CanvasRenderingContext2D', 'globalAlpha')
.globalAlpha
}
get globalCompositeOperation(): string {
return _.internalsOf(
this,
'CanvasRenderingContext2D',
'globalCompositeOperation'
).globalCompositeOperation
}
get font(): string {
return _.internalsOf(this, 'CanvasRenderingContext2D', 'font').font
}
get imageSmoothingEnabled(): boolean {
return _.internalsOf(
this,
'CanvasRenderingContext2D',
'imageSmoothingEnabled'
).imageSmoothingEnabled
}
get imageSmoothingQuality(): 'low' | 'medium' | 'high' {
return _.internalsOf(
this,
'CanvasRenderingContext2D',
'imageSmoothingQuality'
).imageSmoothingQuality
}
get lineCap(): 'butt' | 'round' | 'square' {
return _.internalsOf(this, 'CanvasRenderingContext2D', 'lineCap').lineCap
}
get lineDashOffset(): number {
return _.internalsOf(this, 'CanvasRenderingContext2D', 'lineDashOffset')
.lineDashOffset
}
get lineJoin(): 'bevel' | 'round' | 'miter' {
return _.internalsOf(this, 'CanvasRenderingContext2D', 'lineJoin').lineJoin
}
get lineWidth(): number {
return _.internalsOf(this, 'CanvasRenderingContext2D', 'lineWidth')
.lineWidth
}
get miterLimit(): number {
return _.internalsOf(this, 'CanvasRenderingContext2D', 'miterLimit')
.miterLimit
}
get strokeStyle(): string {
return _.internalsOf(this, 'CanvasRenderingContext2D', 'strokeStyle')
.strokeStyle
}
get shadowOffsetX(): number {
return _.internalsOf(this, 'CanvasRenderingContext2D', 'shadowOffsetX')
.shadowOffsetX
}
get shadowOffsetY(): number {
return _.internalsOf(this, 'CanvasRenderingContext2D', 'shadowOffsetY')
.shadowOffsetY
}
get shadowBlur(): number {
return _.internalsOf(this, 'CanvasRenderingContext2D', 'shadowBlur')
.shadowBlur
}
get shadowColor(): string {
return _.internalsOf(this, 'CanvasRenderingContext2D', 'shadowColor')
.shadowColor
}
get textAlign(): 'left' | 'right' | 'center' | 'start' | 'end' {
return _.internalsOf(this, 'CanvasRenderingContext2D', 'textAlign')
.textAlign
}
get textBaseline():
| 'top'
| 'hanging'
| 'middle'
| 'alphabetic'
| 'ideographic'
| 'bottom' {
return _.internalsOf(this, 'CanvasRenderingContext2D', 'textBaseline')
.textBaseline
}
arc() {}
arcTo() {}
beginPath() {}
bezierCurveTo() {}
clearRect() {}
clip() {}
closePath() {}
createImageData(width: number, height: number): void
createImageData(imagedata: ImageData): void
createImageData(arg0: number | ImageData, arg1?: void | number) {
/** Whether ImageData is provided. */
const hasData = _.__object_isPrototypeOf(ImageData.prototype, arg0)
const w = hasData ? (arg0 as ImageData).width : (arg0 as number)
const h = hasData ? (arg0 as ImageData).height : (arg1 as number)
const d = hasData
? (arg0 as ImageData).data
: new Uint8ClampedArray(w * h * 4)
return new ImageData(d, w, h)
}
createLinearGradient() {}
createPattern() {}
createRadialGradient() {}
drawFocusIfNeeded() {}
drawImage() {}
ellipse() {}
fill() {}
fillRect() {}
fillText() {}
getContextAttributes() {}
getImageData() {}
getLineDash() {}
getTransform() {}
isPointInPath() {}
isPointInStroke() {}
lineTo() {}
measureText() {}
moveTo() {}
putImageData() {}
quadraticCurveTo() {}
rect() {}
resetTransform() {}
restore() {}
rotate() {}
save() {}
scale() {}
setLineDash() {}
setTransform() {}
stroke() {}
strokeRect() {}
strokeText() {}
transform() {}
translate() {}
}
_.allowStringTag(CanvasRenderingContext2D)
export const __createCanvasRenderingContext2D = (
canvas: EventTarget
): CanvasRenderingContext2D => {
const renderingContext2D = Object.create(
CanvasRenderingContext2D.prototype
) as CanvasRenderingContext2D
_.INTERNALS.set(renderingContext2D, {
canvas,
direction: 'inherit',
fillStyle: '#000',
filter: 'none',
font: '10px sans-serif',
globalAlpha: 0,
globalCompositeOperation: 'source-over',
imageSmoothingEnabled: false,
imageSmoothingQuality: 'high',
lineCap: 'butt',
lineDashOffset: 0.0,
lineJoin: 'miter',
lineWidth: 1.0,
miterLimit: 10.0,
shadowBlur: 0,
shadowColor: '#000',
shadowOffsetX: 0,
shadowOffsetY: 0,
strokeStyle: '#000',
textAlign: 'start',
textBaseline: 'alphabetic',
})
return renderingContext2D
}
/** Returns whether the value is an instance of ImageData. */
const isImageData = (value: T) =>
(Object(value).data instanceof Uint8ClampedArray) as T extends ImageData
? true
: false