summaryrefslogtreecommitdiff
path: root/packages/webapi/src/lib/CanvasRenderingContext2D.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/webapi/src/lib/CanvasRenderingContext2D.ts')
-rw-r--r--packages/webapi/src/lib/CanvasRenderingContext2D.ts182
1 files changed, 182 insertions, 0 deletions
diff --git a/packages/webapi/src/lib/CanvasRenderingContext2D.ts b/packages/webapi/src/lib/CanvasRenderingContext2D.ts
new file mode 100644
index 000000000..d83a227aa
--- /dev/null
+++ b/packages/webapi/src/lib/CanvasRenderingContext2D.ts
@@ -0,0 +1,182 @@
+import type { HTMLCanvasElement } from './HTMLCanvasElement'
+import type { OffscreenCanvas } from './OffscreenCanvas'
+
+import * as _ from './utils'
+import { ImageData } from './ImageData'
+
+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 = <T>(value: T) => (Object(value).data instanceof Uint8ClampedArray) as T extends ImageData ? true : false