npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

fluent-2d-context

v0.1.1

Published

Method chaining pattern implementation for canvas 2d context api

Downloads

2

Readme

Fluent 2d Context

Method chaining pattern for canvas 2d context api

Introduction

This is an implementation of the same API from Canvas 2d Context but with a method chaining or fluent pattern.

Current

const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');

const drawSquare = (x, y, size) => {
  ctx.beginPath();
  ctx.fillStyle = '#000';
  ctx.fillRect(x, y, size, size);
  ctx.closePath();
}

Fluent

const canvas = document.createElement('canvas');
const fctx = new FluentContext(canvas);

const drawSquare = (x, y, size) => {
  fctx.beginPath()
    .fillStyle('#000')
    .fillRect(x, y, size, size)
    .closePath();
}

Usage

Install

npm i -S fluent-2d-context

# or

yarn add fluent-2d-context

Implementation

import FluentContext from 'fluent-2d-context';
// or
const FluentContext = require('fluent-2d-context');


const canvas = document.createElement('canvas');

const fctx = new FluentContext(canvas);

API

Instance

const fctx = FluentContext(canvas);

Properties

fctx.ctx

@returns: An instance of the real Canvas 2d Context

fctx.canvas

@returns: An instance of the current canvas

Canvas State

fctx.save();

@returns {this}

fctx.restore();

@returns {this}

Canvas Transform

fctx.getTransform();

@returns {DOMMatrix}

fctx.resetTransform();

@returns {this}

fctx.rotate(angle);

@param {Number} angle
@returns {this}

fctx.scale(x, y);

@param {Number} x
@param {Number} y
@returns {this}

fctx.setTransform([transform]);

@param {DOMMatrix2DInit} [transform]

fctx.setTransform(a, b, c, d, e, f);

@param {Number} a
@param {Number} b
@param {Number} c
@param {Number} d
@param {Number} e
@param {Number} f
@returns {this}

fctx.transform(a, b, c, d, e, f);

@param {Number} a
@param {Number} b
@param {Number} c
@param {Number} d
@param {Number} e
@param {Number} f
@returns {this}

fctx.translate(x, y);

@param {Number} x
@param {Number} y
@returns {this}

Canvas Compositing

fctx.globalAlpha(globalAlpha);

Is like ctx.globalAlpha = {Number};
@param {Number} globalAlpha
@returns {this}

fctx.globalCompositeOperation(globalCompositeOperation);

Is like ctx.globalCompositeOperation = {String};
@param {String} globalCompositeOperation
@returns {this}

Canvas Image Smoothing

fctx.imageSmoothingEnabled(imageSmoothingEnabled);

Is like ctx.imageSmoothingEnabled = {Boolean};
@param {Boolean} imageSmoothingEnabled
@returns {this}

fctx.imageSmoothingQuality(imageSmoothingQuality);

Is like ctx.imageSmoothingQuality = {("low"|"medium"|"high")};
@param {("low"|"medium"|"high")} imageSmoothingEnabled
@returns {this}

Canvas Fill Stroke Styles

fctx.fillStyle(fillStyle);

Is like ctx.fillStyle = {(String|CanvasGradient|CanvasPattern)};
@param {String|CanvasGradient|CanvasPattern} fillStyle
@returns {this}

fctx.strokeStyle(strokeStyle: string | CanvasGradient | CanvasPattern);

Is like ctx.strokeStyle = {(String|CanvasGradient|CanvasPattern)};
@param {String|CanvasGradient|CanvasPattern} strokeStyle
@returns {this}

fctx.createLinearGradient(x0, y0, x1, y1);

@param {Number} x0
@param {Number} y0
@param {Number} x1
@param {Number} y1
@returns {CanvasGradient}

fctx.createPattern(image, repetition);

@param {CanvasImageSource} image
@param {String} repetition
@returns {(CanvasPattern|Null)}

fctx.createRadialGradient(x0, y0, r0, x1, y1, r1);

@param {Number} x0
@param {Number} y0
@param {Number} r0
@param {Number} x1
@param {Number} y1
@param {Number} r1
@returns {CanvasGradient}

Canvas Shadow Styles

fctx.shadowBlur(shadowBlur: number);

Is like ctx.shadowBlur = {Number};
@param {Number} shadowBlur
@returns {this}

fctx.shadowColor(shadowColor: string);

Is like ctx.shadowColor = {String};
@param {String} shadowColor
@returns {this}

fctx.shadowOffsetX(shadowOffsetX: number);

Is like ctx.shadowOffsetX = {Number};
@param {Number} shadowOffsetX
@returns {this}

fctx.shadowOffsetY(shadowOffsetY: number);

Is like ctx.shadowOffsetY = {Number};
@param {Number} shadowOffsetY
@returns {this}

Canvas Filters

fctx.filter(filter: string);

Is like ctx.filter = {String};
@param {String} filter
@returns {this}

Canvas Rect

fctx.clearRect(x, y, w, h);

@param {Number} x
@param {Number} y
@param {Number} w
@param {Number} h
@returns {this}

fctx.fillRect(x, y, w, h);

@param {Number} x
@param {Number} y
@param {Number} w
@param {Number} h
@returns {this}

fctx.strokeRect(x, y, w, h);

@param {Number} x
@param {Number} y
@param {Number} w
@param {Number} h
@returns {this}

Canvas Draw Path

fctx.beginPath();

@returns {this}

fctx.clip([fillRule]);

@param {"butt"|"round"|"square"} [fillRule]
@returns {this}

fctx.clip(path[, fillRule]);

@param {Path2D} path
@param {"butt"|"round"|"square"} [fillRule]
@returns {this}

fctx.fill([fillRule]);

@param {"butt"|"round"|"square"} [fillRule]
@returns {this}

fctx.fill(path[, fillRule]);

@param {Path2D} path
@param {"butt"|"round"|"square"} [fillRule]
@returns {this}

fctx.isPointInPath(x, y[, fillRule]);

@param {Number} x
@param {Number} y
@param {"butt"|"round"|"square"} [fillRule]
@returns {Boolean}

fctx.isPointInPath(path, x, y[, fillRule]);

@param {Path2D} path
@param {Number} x
@param {Number} y
@param {"butt"|"round"|"square"} [fillRule]
@returns {Boolean}

fctx.isPointInStroke(x, y);

@param {Number} x
@param {Number} y
@returns {Boolean}

fctx.isPointInStroke(path, x, y);

@param {Path2D} path
@param {Number} x
@param {Number} y
@returns {Boolean}

Canvas User Interface

fctx.drawFocusIfNeeded(element);

@param {Element} element
@returns {this}

fctx.drawFocusIfNeeded(path, element);

@param {Path2D} path
@param {Element} element
@returns {this}

fctx.scrollPathIntoView([path]);

@param {Path2D} [path]
@returns {this}

Canvas Text

fctx.fillText(text, x, y[, maxWidth]);

@param {String} text
@param {Number} x
@param {Number} y
@param {Number} [maxWidth]
@returns {this}

fctx.measureText(text);

@param {String} text
@returns {TextMetrics}

fctx.strokeText(text, x, y[, maxWidth]);

@param {String} text
@param {Number} x
@param {Number} y
@param {Number} [maxWidth]
@returns {this}

Canvas Draw Image

fctx.drawImage(image, dx, dy);

@param {CanvasImageSource} image
@param {Number} dx
@param {Number} dy
@returns {this}

fctx.drawImage(image, dx, dy, dw, dh);

@param {CanvasImageSource} image
@param {Number} dx
@param {Number} dy
@param {Number} dw
@param {Number} dh
@returns {this}

fctx.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh);

@param {CanvasImageSource} image
@param {Number} sx
@param {Number} sy
@param {Number} sw
@param {Number} sh
@param {Number} dx
@param {Number} dy
@param {Number} dw
@param {Number} dh
@returns {this}

Canvas Image Data

fctx.createImageData(sw, sh);

@param {Number} sw
@param {Number} sh
@returns {ImageData}

fctx.createImageData(imagedata);

@param {ImageData} imagedata
@returns {ImageData}

fctx.getImageData(sx, sy, sw, sh);

@param {Number} sx
@param {Number} sy
@param {Number} sw
@param {Number} sh
@returns {ImageData}

fctx.putImageData(imagedata, dx, dy);

@param {ImageData} imagedata
@param {Number} dx
@param {Number} dy
@returns {this}

fctx.putImageData(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);

@param {ImageData} imagedata
@param {Number} dx
@param {Number} dy
@param {Number} dirtyX
@param {Number} dirtyY
@param {Number} dirtyWidth
@param {Number} dirtyHeight
@returns {this}

Canvas Path Drawing Styles

fctx.lineCap(lineCap);

@param {"butt"|"round"|"square"} lineCap
@returns {this}

fctx.lineDashOffset(lineDashOffset);

@param {Number} lineDashOffset
@returns {this}

fctx.lineJoin(lineJoin);

@param {"round"|"bevel"|"miter"} lineJoin
@returns {this}

fctx.lineWidth(lineWidth);

@param {Number} lineWidth
@returns {this}

fctx.miterLimit(miterLimit);

@param {Number} miterLimit
@returns {this}

fctx.getLineDash();

@returns {Number[]}

fctx.setLineDash(segments);

@param {Number[]} segments
@returns {this}

Canvas Text Drawing Styles

fctx.direction(direction);

Is like ctx.direction = {"ltr"|"rtl"|"inherit"};
@param {"ltr"|"rtl"|"inherit"} direction
@returns {this}

fctx.font(font);

Is like ctx.font = {String};
@param {String} font
@returns {this}

fctx.textAlign(textAlign);

Is like ctx.textAlign = {"start"|"end"|"left"|"right"|"center"};
@param {"start"|"end"|"left"|"right"|"center"} textAlign
@returns {this}

fctx.textBaseline(textBaseline);

Is like ctx.textBaseline = {"top"|"hanging"|"middle"|"alphabetic"|"ideographic"|"bottom"};
@param {"top"|"hanging"|"middle"|"alphabetic"|"ideographic"|"bottom"} textBaseline
@returns {this}

Canvas Path

fctx.arc(x, y, radius, startAngle, endAngle[, anticlockwise]);

@param {Number} x
@param {Number} y
@param {Number} radius
@param {Number} startAngle
@param {Number} endAngle
@param {Boolean} [anticlockwise]
@returns {this}

fctx.arcTo(x1, y1, x2, y2, radius);

@param {Number} x1
@param {Number} y1
@param {Number} x2
@param {Number} y2
@param {Number} radius
@returns {this}

fctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);

@param {Number} cp1x
@param {Number} cp1y
@param {Number} cp2x
@param {Number} cp2y
@param {Number} x
@param {Number} y
@returns {this}

fctx.closePath();

@returns {this}

fctx.ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle[, anticlockwise]);

@param {Number} x
@param {Number} y
@param {Number} radiusX
@param {Number} radiusY
@param {Number} rotation
@param {Number} startAngle
@param {Number} endAngle
@param {Boolean} [anticlockwise]
@returns {this}

fctx.lineTo(x, y);

@param {Number} x
@param {Number} y
@returns {this}

fctx.moveTo(x, y);

@param {Number} x
@param {Number} y
@returns {this}

fctx.quadraticCurveTo(cpx, cpy, x, y);

@param {Number} cpx
@param {Number} cpy
@param {Number} x
@param {Number} y
@returns {this}

fctx.rect(x, y, w, h);

@param {Number} x
@param {Number} y
@param {Number} w
@param {Number} h
@returns {this}

Interfaces

DOMMatrix

interface DOMMatrix {
  a: number;
  b: number;
  c: number;
  d: number;
  e: number;
  f: number;
  readonly is2D: boolean;
  readonly isIdentity: boolean;
  m11: number;
  m12: number;
  m13: number;
  m14: number;
  m21: number;
  m22: number;
  m23: number;
  m24: number;
  m31: number;
  m32: number;
  m33: number;
  m34: number;
  m41: number;
  m42: number;
  m43: number;
  m44: number;
  flipX(): DOMMatrix;
  flipY(): DOMMatrix;
  inverse(): DOMMatrix;
  invertSelf(): DOMMatrix;
  multiply(other?: DOMMatrixInit): DOMMatrix;
  multiplySelf(other?: DOMMatrixInit): DOMMatrix;
  preMultiplySelf(other?: DOMMatrixInit): DOMMatrix;
  rotate(rotX?: number, rotY?: number, rotZ?: number): DOMMatrix;
  rotateSelf(rotX?: number, rotY?: number, rotZ?: number): DOMMatrix;
  rotateAxisAngle(x?: number, y?: number, z?: number, angle?: number): DOMMatrix;
  rotateAxisAngleSelf(x?: number, y?: number, z?: number, angle?: number): DOMMatrix;
  rotateFromVector(x?: number, y?: number): DOMMatrix;
  rotateFromVectorSelf(x?: number, y?: number): DOMMatrix;
  scale(scaleX?: number, scaleY?: number, scaleZ?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
  scaleSelf(scaleX?: number, scaleY?: number, scaleZ?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
  scale3d(scale?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
  scale3dSelf(scale?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
  /** @deprecated */
  scaleNonUniform(scaleX?: number, scaleY?: number): DOMMatrix;
  setMatrixValue(transformList: string): DOMMatrix;
  skewX(sx?: number): DOMMatrix;
  skewXSelf(sx?: number): DOMMatrix;
  skewY(sy?: number): DOMMatrix;
  skewYSelf(sy?: number): DOMMatrix;
  toFloat32Array(): Float32Array;
  toFloat64Array(): Float64Array;
  toJSON(): any;
  transformPoint(point?: DOMPointInit): DOMPoint;
  translate(tx?: number, ty?: number, tz?: number): DOMMatrix;
  translateSelf(tx?: number, ty?: number, tz?: number): DOMMatrix;  
}

DOMMatrix2DInit

interface DOMMatrix2DInit {
    a?: number;
    b?: number;
    c?: number;
    d?: number;
    e?: number;
    f?: number;
    m11?: number;
    m12?: number;
    m21?: number;
    m22?: number;
    m41?: number;
    m42?: number;
}

CanvasGradient

/** An opaque object describing a gradient. It is returned by the methods CanvasRenderingContext2D.createLinearGradient() or CanvasRenderingContext2D.createRadialGradient(). */
interface CanvasGradient {
    /**
     * Adds a color stop with the given color to the gradient at the given offset. 0.0 is the offset
     * at one end of the gradient, 1.0 is the offset at the other end.
     * Throws an "IndexSizeError" DOMException if the offset
     * is out of range. Throws a "SyntaxError" DOMException if
     * the color cannot be parsed.
     */
    addColorStop(offset: number, color: string): void;
}

CanvasPattern

/** An opaque object describing a pattern, based on an image, a canvas, or a video, created by the CanvasRenderingContext2D.createPattern() method. */
interface CanvasPattern {
    /**
     * Sets the transformation matrix that will be used when rendering the pattern during a fill or
     * stroke painting operation.
     */
    setTransform(transform?: DOMMatrix2DInit): void;
}

CanvasImageSource

type HTMLOrSVGImageElement = HTMLImageElement | SVGImageElement;

type CanvasImageSource = HTMLOrSVGImageElement | HTMLVideoElement | HTMLCanvasElement | ImageBitmap | OffscreenCanvas;

Path2D

interface Path2D {
    addPath(path: Path2D, transform?: DOMMatrix2DInit): void;
    arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean): void;
    arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void;
    bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void;
    closePath(): void;
    ellipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise?: boolean): void;
    lineTo(x: number, y: number): void;
    moveTo(x: number, y: number): void;
    quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;
    rect(x: number, y: number, w: number, h: number): void;
}

Element

interface Element extends Node, ParentNode, NonDocumentTypeChildNode, ChildNode, Slotable, InnerHTML, Animatable {
    readonly assignedSlot: HTMLSlotElement | null;
    readonly attributes: NamedNodeMap;
    /**
     * Allows for manipulation of element's class content attribute as a
     * set of whitespace-separated tokens through a DOMTokenList object.
     */
    readonly classList: DOMTokenList;
    /**
     * Returns the value of element's class content attribute. Can be set
     * to change it.
     */
    className: string;
    readonly clientHeight: number;
    readonly clientLeft: number;
    readonly clientTop: number;
    readonly clientWidth: number;
    /**
     * Returns the value of element's id content attribute. Can be set to
     * change it.
     */
    id: string;
    /**
     * Returns the local name.
     */
    readonly localName: string;
    /**
     * Returns the namespace.
     */
    readonly namespaceURI: string | null;
    onfullscreenchange: ((this: Element, ev: Event) => any) | null;
    onfullscreenerror: ((this: Element, ev: Event) => any) | null;
    outerHTML: string;
    /**
     * Returns the namespace prefix.
     */
    readonly prefix: string | null;
    readonly scrollHeight: number;
    scrollLeft: number;
    scrollTop: number;
    readonly scrollWidth: number;
    /**
     * Returns element's shadow root, if any, and if shadow root's mode is "open", and null otherwise.
     */
    readonly shadowRoot: ShadowRoot | null;
    /**
     * Returns the value of element's slot content attribute. Can be set to
     * change it.
     */
    slot: string;
    /**
     * Returns the HTML-uppercased qualified name.
     */
    readonly tagName: string;
    /**
     * Creates a shadow root for element and returns it.
     */
    attachShadow(init: ShadowRootInit): ShadowRoot;
    /**
     * Returns the first (starting at element) inclusive ancestor that matches selectors, and null otherwise.
     */
    closest<K extends keyof HTMLElementTagNameMap>(selector: K): HTMLElementTagNameMap[K] | null;
    closest<K extends keyof SVGElementTagNameMap>(selector: K): SVGElementTagNameMap[K] | null;
    closest(selector: string): Element | null;
    /**
     * Returns element's first attribute whose qualified name is qualifiedName, and null if there is no such attribute otherwise.
     */
    getAttribute(qualifiedName: string): string | null;
    /**
     * Returns element's attribute whose namespace is namespace and local name is localName, and null if there is
     * no such attribute otherwise.
     */
    getAttributeNS(namespace: string | null, localName: string): string | null;
    /**
     * Returns the qualified names of all element's attributes.
     * Can contain duplicates.
     */
    getAttributeNames(): string[];
    getAttributeNode(name: string): Attr | null;
    getAttributeNodeNS(namespaceURI: string, localName: string): Attr | null;
    getBoundingClientRect(): ClientRect | DOMRect;
    getClientRects(): ClientRectList | DOMRectList;
    getElementsByClassName(classNames: string): HTMLCollectionOf<Element>;
    getElementsByTagName<K extends keyof HTMLElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<HTMLElementTagNameMap[K]>;
    getElementsByTagName<K extends keyof SVGElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<SVGElementTagNameMap[K]>;
    getElementsByTagName(qualifiedName: string): HTMLCollectionOf<Element>;
    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/1999/xhtml", localName: string): HTMLCollectionOf<HTMLElement>;
    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/2000/svg", localName: string): HTMLCollectionOf<SVGElement>;
    getElementsByTagNameNS(namespaceURI: string, localName: string): HTMLCollectionOf<Element>;
    /**
     * Returns true if element has an attribute whose qualified name is qualifiedName, and false otherwise.
     */
    hasAttribute(qualifiedName: string): boolean;
    /**
     * Returns true if element has an attribute whose namespace is namespace and local name is localName.
     */
    hasAttributeNS(namespace: string | null, localName: string): boolean;
    /**
     * Returns true if element has attributes, and false otherwise.
     */
    hasAttributes(): boolean;
    hasPointerCapture(pointerId: number): boolean;
    insertAdjacentElement(position: InsertPosition, insertedElement: Element): Element | null;
    insertAdjacentHTML(where: InsertPosition, html: string): void;
    insertAdjacentText(where: InsertPosition, text: string): void;
    /**
     * Returns true if matching selectors against element's root yields element, and false otherwise.
     */
    matches(selectors: string): boolean;
    msGetRegionContent(): any;
    releasePointerCapture(pointerId: number): void;
    /**
     * Removes element's first attribute whose qualified name is qualifiedName.
     */
    removeAttribute(qualifiedName: string): void;
    /**
     * Removes element's attribute whose namespace is namespace and local name is localName.
     */
    removeAttributeNS(namespace: string | null, localName: string): void;
    removeAttributeNode(attr: Attr): Attr;
    /**
     * Displays element fullscreen and resolves promise when done.
     * When supplied, options's navigationUI member indicates whether showing
     * navigation UI while in fullscreen is preferred or not. If set to "show", navigation
     * simplicity is preferred over screen space, and if set to "hide", more screen space
     * is preferred. User agents are always free to honor user preference over the application's. The
     * default value "auto" indicates no application preference.
     */
    requestFullscreen(options?: FullscreenOptions): Promise<void>;
    requestPointerLock(): void;
    scroll(options?: ScrollToOptions): void;
    scroll(x: number, y: number): void;
    scrollBy(options?: ScrollToOptions): void;
    scrollBy(x: number, y: number): void;
    scrollIntoView(arg?: boolean | ScrollIntoViewOptions): void;
    scrollTo(options?: ScrollToOptions): void;
    scrollTo(x: number, y: number): void;
    /**
     * Sets the value of element's first attribute whose qualified name is qualifiedName to value.
     */
    setAttribute(qualifiedName: string, value: string): void;
    /**
     * Sets the value of element's attribute whose namespace is namespace and local name is localName to value.
     */
    setAttributeNS(namespace: string | null, qualifiedName: string, value: string): void;
    setAttributeNode(attr: Attr): Attr | null;
    setAttributeNodeNS(attr: Attr): Attr | null;
    setPointerCapture(pointerId: number): void;
    /**
     * If force is not given, "toggles" qualifiedName, removing it if it is
     * present and adding it if it is not present. If force is true, adds qualifiedName. If force is false, removes qualifiedName.
     * Returns true if qualifiedName is now present, and false otherwise.
     */
    toggleAttribute(qualifiedName: string, force?: boolean): boolean;
    webkitMatchesSelector(selectors: string): boolean;
    addEventListener<K extends keyof ElementEventMap>(type: K, listener: (this: Element, ev: ElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof ElementEventMap>(type: K, listener: (this: Element, ev: ElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

TextMetrics

interface TextMetrics {
    readonly actualBoundingBoxAscent: number;
    readonly actualBoundingBoxDescent: number;
    readonly actualBoundingBoxLeft: number;
    readonly actualBoundingBoxRight: number;
    readonly alphabeticBaseline: number;
    readonly emHeightAscent: number;
    readonly emHeightDescent: number;
    readonly fontBoundingBoxAscent: number;
    readonly fontBoundingBoxDescent: number;
    readonly hangingBaseline: number;
    /**
     * Returns the measurement described below.
     */
    readonly ideographicBaseline: number;
    readonly width: number;
}

ImageData

/** The underlying pixel data of an area of a <canvas> element. It is created using the ImageData() constructor or creator methods on the CanvasRenderingContext2D object associated with a canvas: createImageData() and getImageData(). It can also be used to set a part of the canvas by using putImageData(). */
interface ImageData {
    /**
     * Returns the one-dimensional array containing the data in RGBA order, as integers in the
     * range 0 to 255.
     */
    readonly data: Uint8ClampedArray;
    /**
     * Returns the actual dimensions of the data in the ImageData object, in
     * pixels.
     */
    readonly height: number;
    readonly width: number;
}