q5
Version:
Beginner friendly graphics powered by WebGPU and optimized for interactive art!
1,952 lines (1,696 loc) • 114 kB
TypeScript
/**
* q5.d.ts
*
* TypeScript definitions for q5.js for use with IDEs like VSCode
* for autocompletion, hover over documentation, and type checking.
*/
declare global {
// ⭐️ core
/** ⭐️
* Welcome to q5's documentation! 🤩
*
* First time coding? Check out the [q5 Beginner's Brief](https://github.com/q5js/q5.js/wiki/q5-Beginner's-Brief).
*
* On these Learn pages, you can experiment with editing the
* interactive mini examples. Have fun! 😎
*/
/** ⭐️
* The draw function is run 60 times per second by default.
* @example
function draw() {
background('silver');
circle(frameCount % 200, 100, 80);
}
*/
function draw(): void;
/** ⭐️
* The setup function is run once, when the program starts.
*
* It can also be defined as an async function and used to load assets.
* @example
function setup() {
createCanvas(200, 100);
background('aqua');
}
* @example
let logo;
async function setup() {
logo = await loadImage('/q5js_logo.avif');
}
function draw() {
background(logo);
}
*/
function setup(): void;
/** ⭐️
* Load assets in the preload function to ensure that they'll be
* ready to use in the setup and draw functions.
*
* q5's preload system can also be used without a preload function
* if you create a canvas first, as shown in the second example.
* @example
let logo;
function preload() {
logo = loadImage('/q5js_logo.avif');
}
function draw() {
background(logo);
}
* @example
createCanvas(200, 100);
let logo = loadImage('/q5js_logo.avif');
function draw() {
background(logo);
}
*/
function preload(): void;
/** ⭐️
* The number of frames that have been displayed since the program started.
* @example
function draw() {
background(200);
textSize(64);
text(frameCount, 8, 120);
}
*/
var frameCount: number;
/** ⭐️
* Stops the draw loop.
* @example
function draw() {
circle(frameCount * 5, 100, 80);
noLoop();
}
*/
function noLoop(): void;
/** ⭐️
* Redraws the canvas n times. If no input parameter is provided,
* it calls the draw function once.
*
* This is an async function.
* @param {number} [n] number of times to redraw the canvas, default is 1
* @example
createCanvas(200);
noLoop();
function draw() {
circle(frameCount * 5, 100, 80);
}
function mousePressed() {
redraw(10);
}
*/
function redraw(n?: number): void;
/** ⭐️
* Starts the draw loop again if it was stopped.
* @example
createCanvas(200);
noLoop();
function draw() {
circle(frameCount * 5, 100, 80);
}
function mousePressed() {
loop();
}
*/
function loop(): void;
/** ⭐️
* Sets the target frame rate or gets an approximation of the
* sketch's current frame rate.
*
* Even when the sketch is running at a consistent frame rate,
* the current frame rate value will fluctuate. Use your web browser's
* developer tools for more accurate performance analysis.
* @param {number} [hertz] target frame rate, default is 60
* @returns {number} current frame rate
* @example
function draw() {
background(200);
if (mouseIsPressed) frameRate(10);
else frameRate(60);
circle(frameCount % 200, 100, 80);
}
* @example
function draw() {
background(200);
textSize(64);
text(round(frameRate()), 65, 120);
}
*/
function frameRate(hertz?: number): number;
/** ⭐️
* The desired frame rate of the sketch.
* @returns {number} target frame rate
* @example
function draw() {
background(200);
textSize(64);
text(getTargetFrameRate(), 65, 120);
}
*/
function getTargetFrameRate(): number;
/** ⭐️
* Gets the current FPS, in terms of how many frames could be generated
* in one second, which can be higher than the target frame rate.
*
* Use your web browser's developer tools for more in-depth
* performance analysis.
* @returns {number} frames per second
* @example
function draw() {
background(200);
frameRate(1);
textSize(64);
text(getFPS(), 8, 120);
}
*/
function getFPS(): number;
/** ⭐️
* Logs a message to the JavaScript console. Alias for the standard
* [`console.log`](https://developer.mozilla.org/docs/Web/API/console/log_static) function.
*
* You can open web developer tools in most browsers by using the
* keyboard shortcut `Ctrl + Shift + i` or `command + option + i`,
* then click the "Console" tab.
* @param {*} message message to log
*/
function log(message: any): void;
/** ⭐️
* Runs after each `draw` function call and post draw hooks.
*
* Useful for adding post-processing effects when it's not possible
* to do so at the end of the `draw` function, such as when using
* addons like p5play that auto-draw to the canvas after the `draw`
* function is run.
* @example
function draw() {
background(200);
circle(frameCount % 200, 100, 80);
}
function postProcess() {
filter(INVERT);
}
*/
function postProcess(): void;
/** ⭐️
* The width of the window.
* @example
function draw() {
background(200);
textSize(64);
textAlign(CENTER, CENTER);
text(windowWidth, 100, 100);
}
*/
var windowWidth: number;
/** ⭐️
* The height of the window.
* @example
function draw() {
background(200);
textSize(64);
textAlign(CENTER, CENTER);
text(windowHeight, 100, 100);
}
*/
var windowHeight: number;
/** ⭐️
* The time passed since the last frame was drawn.
*
* With the default frame rate of 60, delta time will be
* approximately 16.6
*
* Can be used to keep movements tied to real time if the sketch
* is often dropping below the target frame rate. Although if frame
* rates are consistently low, consider reducing the target frame
* rate instead.
* @example
function draw() {
background(200);
text(deltaTime, 60, 106);
}
* @example
let x = 0;
function draw() {
background(200);
// simulate frame rate drops
frameRate(random(30, 60));
x += deltaTime * 0.2;
circle(x % 200, 100, 20);
}
*/
var deltaTime: number;
/** ⭐️
* By default, q5 supports the p5.js v1
* [preload](https://q5js.org/learn/#preload)
* system, which uses
* [`Promise.all`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)
* behind the scenes to load assets in parallel.
*
* To match p5.js v2 behavior, q5 automatically makes
* load* functions, such as `loadImage`, return promises
* in `setup` if it's defined as an async function.
*
* This function can be used at any point in your sketch
* to make load* functions return promises or not. Yet, consider
* using [`load`](https://q5js.org/learn/#load) instead.
*
* @param {boolean} [val] Whether load* functions should return promises or not. If this parameter is undefined the value is set to true.
* @example
createCanvas(200);
usePromiseLoading();
let logo = await loadImage('/q5js_logo.avif');
background(logo);
*/
function usePromiseLoading(val?: boolean): void;
class Q5 {
/** ⭐️
* Creates an instance of Q5.
*
* Running `new Q5()` starts q5 in top-level global mode,
* enabling use of q5 functions and variables on the file level,
* outside of `setup` and `draw`. You can also start Q5 in this mode
* by running [`createCanvas`](https://q5js.org/learn/#createCanvas)
* on the file level.
*
* If you don't create a new instance of Q5, an
* instance will be created automatically, replicating
* p5's limited global mode. p5's instance mode is supported by
* this constructor as well but its use is deprecated, use
* [q5's namespaced instance mode](https://github.com/q5js/q5.js/wiki/Instance-Mode) instead.
* @param {string | Function} [scope]
* - "global": (default) adds q5 functions and variables to the global scope
* - "instance": does not add q5 functions or variables to the global scope
* @param {HTMLElement} [parent] element that the canvas will be placed inside
* @example
new Q5();
createCanvas(200, 100);
circle(100, 50, 80);
* @example
let q = new Q5('instance');
q.createCanvas(200, 100);
q.circle(100, 50, 20);
*/
constructor(scope?: string | Function, parent?: HTMLElement);
/** ⭐️
* Q5 reformats some errors to make them more readable for beginners.
* @default false
*/
static disableFriendlyErrors: boolean;
/** ⭐️
* Sets the default canvas context attributes for all Q5 instances
* and graphics.
* @default { alpha: false, colorSpace: 'display-p3' }
*/
static canvasOptions: {};
/** ⭐️
* True if the device supports HDR (the display-p3 colorspace).
*/
static supportsHDR: boolean;
/** ⭐️
* Set to true to keep draw looping after an error. False by default.
*/
static errorTolerant: boolean;
/** ⭐️
* The maximum number of rectangles that can be drawn in a single
* draw call.
* @default 200200
*/
static MAX_RECTS: number;
/** ⭐️
* The maximum number of ellipses that can be drawn in a single
* draw call.
* @default 200200
*/
static MAX_ELLIPSES: number;
/** ⭐️
* Modules added to this object will be added to new Q5 instances.
*/
static modules: {};
static Image: {
new(w: number, h: number, opt?: any): Q5.Image;
}
/** ⭐️
* Creates a new Q5 instance that uses [q5's WebGPU renderer](https://github.com/q5js/q5.js/wiki/q5-WebGPU-renderer).
* @example
let q = await Q5.WebGPU();
q.draw = () => {
background(0.8);
circle(mouseX, 0, 80);
};
*/
static WebGPU(): Q5;
/** ⭐️
* ___Experimental! Might be changed.___
*
* Registers an addon with q5.js.
*
* Addons can augment q5 with new functionality and register
* functions to be executed at specific points in the q5 lifecycle:
* init, presetup, postsetup, predraw, postdraw, and remove.
*
* @param {Function} addon A function that receives `Q5`, `Q5.prototype`, and a `lifecycles` object.
* @example
// addon.js
Q5.registerAddon((Q5, proto, lifecycles) => {
lifecycles.postsetup = function () {
this.background('blue');
};
});
// sketch.js
createCanvas(200);
*/
static registerAddon(addon: Function): void; //-
/** ⭐️
* The draw function is run 60 times per second by default.
*/
draw(): void; //-
/** ⭐️
* The setup function is run once, when the program starts.
*/
setup(): void; //-
/** ⭐️
* Load assets in the preload function to ensure that they'll be
* ready to use in the setup and draw functions.
*
* q5's preload system can also be used without a preload function
* if you create a canvas first.
*/
preload(): void; //-
/** ⭐️
* The number of frames that have been displayed since the program
* started.
*/
postProcess(): void; //-
}
namespace Q5 {
interface Image {
width: number; //-
height: number; //-
}
}
// ⬜️ canvas
/** ⬜️
* Creates a canvas element, a section of the screen your program
* can draw on.
*
* Run this function to start using q5. If this function is not run
* by the user, a 200x200 canvas will be created automatically before
* the draw loop starts.
*
* When using q5 WebGPU, create a canvas before using any other
* q5 functions. The origin of a WebGPU canvas is at its center.
* @param {number} [w] width or size of the canvas
* @param {number} [h] height of the canvas
* @param {object} [opt] options for the canvas
* @param {boolean} [opt.alpha] whether the canvas should have an alpha channel that allows it to be seen through, default is false
* @param {string} [opt.colorSpace] color space of the canvas, either "srgb" or "display-p3", default is "display-p3" for devices that support HDR colors
* @returns {HTMLCanvasElement} created canvas element
* @example
createCanvas(200, 100);
circle(100, 50, 80);
* @example
await Q5.WebGPU();
createCanvas(200, 100);
circle(0, 0, 80);
* @example
createCanvas(200, 200, { alpha: true });
function draw() {
clear();
circle(frameCount % 200, 100, 80);
}
*/
function createCanvas(w?: number, h?: number, options?: CanvasRenderingContext2DSettings): HTMLCanvasElement;
/** ⬜️
* The canvas element associated with the Q5 instance.
*
* @prop {number} w
* @prop {number} width
* @prop {number} h
* @prop {number} height
* @prop {number} hw half the width
* @prop {number} hh half the height
* @prop {string} renderer either "c2d" (Canvas2D) or "webgpu"
*/
var canvas: HTMLCanvasElement;
/** ⬜️
* Clears the canvas, making every pixel completely transparent.
*
* Note that the canvas can only be seen through if it has an alpha channel.
*/
function clear(): void;
/** ⬜️
* Sets the fill color for shapes. The default is white.
*
* Like the [`color`](https://q5js.org/learn/#color) function, this function
* can accept colors in a wide range of formats: as a CSS color string,
* a `Color` object, grayscale value, or color component values.
* @param {Color} color fill color
* @example
createCanvas(200);
background(200);
fill('red');
circle(80, 80, 80);
fill('lime');
square(80, 80, 80);
*/
function fill(color: Color): void;
/** ⬜️
* Sets the stroke (outline) color for shapes. The default is black.
*
* Like the [`color`](https://q5js.org/learn/#color) function, this function
* can accept colors in a wide range of formats: as a CSS color string,
* a `Color` object, grayscale value, or color component values.
* @param {Color} color stroke color
* @example
createCanvas(200);
background(200);
fill(36);
stroke('red');
circle(80, 80, 80);
stroke('lime');
square(80, 80, 80);
*/
function stroke(color: Color): void;
/** ⬜️
* After calling this function, shapes will not be filled.
* @example
createCanvas(200);
background(200);
noFill();
stroke('red');
circle(80, 80, 80);
stroke('lime');
square(80, 80, 80);
*/
function noFill(): void;
/** ⬜️
* After calling this function, shapes will not have a stroke (outline).
* @example
createCanvas(200);
background(200);
fill(36);
stroke('red');
circle(80, 80, 80);
noStroke();
square(80, 80, 80);
*/
function noStroke(): void;
/** ⬜️
* Sets the size of the stroke used for lines and the border around shapes.
* @param {number} weight size of the stroke in pixels
* @example
createCanvas(200);
background(200);
stroke('red');
circle(50, 100, 80);
strokeWeight(12);
circle(150, 100, 80);
*/
function strokeWeight(weight: number): void;
/** ⬜️
* Sets the global opacity, which affects all subsequent drawing operations, except `background`. Default is 1, fully opaque.
*
* In q5 WebGPU this function only affects images.
* @param {number} alpha opacity level, ranging from 0 to 1
* @example
createCanvas(200);
background(200);
opacity(1);
circle(80, 80, 80);
opacity(0.2);
square(80, 80, 80);
*/
function opacity(alpha: number): void;
/** ⬜️
* Sets the shadow color. The default is transparent (no shadow).
*
* Shadows apply to anything drawn to the canvas, including filled
* shapes, strokes, text, and images.
*
* Like the [`color`](https://q5js.org/learn/#color) function, this function
* can accept colors in a wide range of formats: as a CSS color string,
* a `Color` object, grayscale value, or color component values.
*
* Not available in q5 WebGPU.
* @param {Color} color shadow color
* @example
createCanvas(200);
background(200);
noFill();
shadow('black');
rect(64, 60, 80, 80);
* @example
createCanvas(200);
let logo = loadImage('/assets/p5play_logo.webp');
function setup() {
background(200);
shadow(0);
image(logo, 36, 36, 128, 128);
}
*/
function shadow(color: string | Color): void;
/** ⬜️
* Disables the shadow effect.
*
* Not available in q5 WebGPU.
* @example
createCanvas(200);
background(200);
noStroke();
shadow('black');
rect(14, 14, 80, 80);
noShadow();
rect(104, 104, 80, 80);
*/
function noShadow(): void;
/** ⬜️
* Sets the shadow offset and blur radius.
*
* When q5 starts, shadow offset is (10, 10) with a blur of 10.
*
* Not available in q5 WebGPU.
*
* @param {number} offsetX horizontal offset of the shadow
* @param {number} offsetY vertical offset of the shadow, defaults to be the same as offsetX
* @param {number} blur blur radius of the shadow, defaults to 0
* @example
createCanvas(200);
noStroke();
shadow(50);
function draw() {
background(200);
shadowBox(-20, mouseY, 10);
circle(100, 100, 80, 80);
}
* @example
createCanvas(200);
background(200);
noStroke();
shadow('aqua');
shadowBox(20);
rect(50, 50, 100, 100);
textSize(64);
text('q5', 60, 115);
*/
function shadowBox(offsetX: number, offsetY: number, blur: number): void;
/** ⬜️
* The width of the canvas.
*/
var width: number;
/** ⬜️
* The height of the canvas.
*/
var height: number;
/** ⬜️
* Half the width of the canvas.
*/
var halfWidth: number;
/** ⬜️
* Half the height of the canvas.
*/
var halfHeight: number;
/** ⬜️
* Translates the origin of the drawing context.
* @param {number} x translation along the x-axis
* @param {number} y translation along the y-axis
* @example
function draw() {
background(200);
translate(100, 100);
circle(0, 0, 80);
}
*/
function translate(x: number, y: number): void;
/** ⬜️
* Rotates the drawing context.
* @param {number} angle rotation angle in radians
* @example
function draw() {
background(200);
translate(100, 100);
rotate(QUARTER_PI);
// drawn from its top-left corner by default
square(0, 0, 50);
}
*/
function rotate(angle: number): void;
/** ⬜️
* Scales the drawing context.
*
* If only one input parameter is provided,
* the drawing context will be scaled uniformly.
* @param {number} x scaling factor along the x-axis
* @param {number} [y] scaling factor along the y-axis
* @example
function draw() {
background(200);
scale(4);
circle(0, 0, 80);
}
*/
function scale(x: number, y?: number): void;
/** ⬜️
* Shears the drawing context along the x-axis.
* @param {number} angle shear angle in radians
* @example
function draw() {
background(200);
translate(25, 60);
shearX(QUARTER_PI);
square(0, 0, 80);
}
*/
function shearX(angle: number): void;
/** ⬜️
* Shears the drawing context along the y-axis.
* @param {number} angle shear angle in radians
* @example
function draw() {
background(200);
translate(25, 60);
shearY(QUARTER_PI);
square(0, 0, 80);
}
*/
function shearY(angle: number): void;
/** ⬜️
* Applies a transformation matrix.
*
* Accepts a 3x3 or 4x4 matrix as either an array or multiple arguments.
*
* Note that in q5 WebGPU, the identity matrix (default)
* has a negative y scale, so the y-axis is flipped to match
* the Canvas2D renderer.
* @param {number} a horizontal scaling
* @param {number} b horizontal skewing
* @param {number} c vertical skewing
* @param {number} d vertical scaling
* @param {number} e horizontal moving
* @param {number} f vertical moving
* @example
function draw() {
background(200);
applyMatrix(2, 1, 1, 1, 100, 100);
circle(0, 0, 80);
}
*/
function applyMatrix(a: number, b: number, c: number, d: number, e: number, f: number): void;
/** ⬜️
* Resets the transformation matrix.
*
* q5 runs this function before every time the `draw` function is run,
* so that transformations don't carry over to the next frame.
* @example
createCanvas(200);
background(200);
translate(100, 100);
circle(0, 0, 80);
resetMatrix();
square(0, 0, 50);
*/
function resetMatrix(): void;
/** ⬜️
* Saves the current transformation matrix.
* @example
createCanvas(200);
background(200);
translate(100, 100);
pushMatrix();
rotate(QUARTER_PI);
ellipse(0, 0, 120, 40);
popMatrix();
ellipse(0, 0, 120, 40);
*/
function pushMatrix(): void;
/** ⬜️
* Restores the previously saved transformation matrix.
* @example
createCanvas(200);
background(200);
translate(100, 100);
pushMatrix();
rotate(QUARTER_PI);
ellipse(0, 0, 120, 40);
popMatrix();
ellipse(0, 0, 120, 40);
*/
function popMatrix(): void;
/** ⬜️
* Saves the current drawing style settings.
*
* This includes the fill, stroke, stroke weight, tint, image mode,
* rect mode, ellipse mode, text size, text align, text baseline, and
* shadow settings.
* @example
function draw() {
background(200);
pushStyles();
fill('blue');
circle(50, 50, 80);
popStyles();
circle(150, 150, 80);
}
*/
function pushStyles(): void;
/** ⬜️
* Restores the previously saved drawing style settings.
*/
function popStyles(): void;
/** ⬜️
* Saves the current drawing style settings and transformations.
* @example
createCanvas(200);
push();
fill('blue');
translate(100, 100);
circle(0, 0, 80);
pop();
square(0, 0, 50);
*/
function push(): void;
/** ⬜️
* Restores the previously saved drawing style settings and transformations.
*/
function pop(): void;
/** ⬜️
* Resizes the canvas to the specified width and height.
* @param {number} w width of the canvas
* @param {number} h height of the canvas
*/
function resizeCanvas(w: number, h: number): void;
/** ⬜️
* Sets the pixel density of the canvas.
* @param {number} v pixel density value
* @returns {number} pixel density
*/
function pixelDensity(v: number): number;
/** ⬜️
* Returns the current display density.
* @returns {number} display density
*/
function displayDensity(): number;
/** ⬜️
* Creates a graphics buffer.
*
* Disabled by default in q5 WebGPU.
* See issue [#104](https://github.com/q5js/q5.js/issues/104) for details.
* @param {number} w width
* @param {number} h height
* @param {object} [opt] options
* @returns {Q5} a new Q5 graphics buffer
*/
function createGraphics(w: number, h: number, opt?: any): Q5;
/** ⬜️
* The 2D rendering context for the canvas, if using the Canvas2D
* renderer.
*/
var ctx: CanvasRenderingContext2D;
/** ⬜️
* Alias for `ctx`, the 2D rendering context for the canvas.
*/
var drawingContext: CanvasRenderingContext2D;
// 🎨 color
/** 🎨
* Creates a new `Color` object, which is primarily useful for storing
* a color that your sketch will reuse or modify later.
*
* With the default RGB color mode, colors have `r`/`red`, `g`/`green`, `b`/`blue`, and `a`/`alpha` components. The default color
* format is integer, so set components to values between 0 and 255.
*
* In q5 WebGPU, the default color mode is RGB in float format, so
* set color components to values between 0 and 1.
*
* The [`fill`](https://q5js.org/learn/#fill), [`stroke`](https://q5js.org/learn/#stroke), and [`background`](https://q5js.org/learn/#background) functions
* accept the same wide range of color representations as this function.
*
* Here are some examples of valid use:
*
* - `color(255)` (grayscale)
* - `color(255, 200)` (grayscale, alpha)
* - `color(255, 0, 0)` (r, g, b)
* - `color(255, 0, 0, 10)` (r, g, b, a)
* - `color('red')` (colorName)
* - `color('#ff0000')` (hexColor)
* - `color([255, 0, 0])` (colorComponents)
* @param {string | number | Color | number[]} c0 color or first color component
* @param {number} [c1] second color component
* @param {number} [c2] third color component
* @param {number} [c3] fourth color component (alpha)
* @returns {Color} a new `Color` object
* @example
createCanvas(200);
rect(0, 0, 100, 200);
// ( r, g, b, a)
let bottle = color(90, 100, 255, 100);
fill(bottle);
stroke(bottle);
strokeWeight(30);
circle(100, 100, 155);
* @example
createCanvas(200);
// (gray, alpha)
let c = color(200, 50);
function draw() {
background(c);
circle(mouseX, mouseY, 50);
c.g = (c.g + 1) % 256;
}
* @example
let q = await Q5.WebGPU();
// (r, g, b, a)
let c = color(0, 1, 1, 0.2);
q.draw = () => {
fill(c);
circle(mouseX, mouseY, 50);
};
*/
function color(c0: string | number | Color | number[], c1?: number, c2?: number, c3?: number): Color;
/** 🎨
* Sets the color mode for the sketch, which changes how colors are
* interpreted and displayed.
*
* The default color mode is RGB in legacy integer format.
*
* In WebGPU, the default is RGB in float format (best performance).
*
* Color gamut is 'display-p3' by default, if the device supports HDR.
*
* @param {'rgb' | 'oklch' | 'hsl' | 'hsb'} mode color mode
* @param {1 | 255} format color format (1 for float, 255 for integer)
* @param {'srgb' | 'display-p3'} [gamut] color gamut
* @example
createCanvas(200);
colorMode(RGB, 1);
fill(1, 0, 0);
rect(0, 0, 66, 200);
fill(0, 1, 0);
rect(66, 0, 67, 200);
fill(0, 0, 1);
rect(133, 0, 67, 200);
* @example
createCanvas(200);
colorMode(OKLCH);
fill(0.25, 0.15, 0);
rect(0, 0, 100, 200);
fill(0.75, 0.15, 0)
rect(100, 0, 100, 200);
*/
function colorMode(mode: 'rgb' | 'oklch', format: 1 | 255, gamut: 'srgb' | 'display-p3'): void;
/** 🎨
* RGB colors have components `r`/`red`, `g`/`green`, `b`/`blue`,
* and `a`/`alpha`.
*
* By default when a canvas is using the HDR "display-p3" color space,
* rgb colors are mapped to the full P3 gamut, even when they use the
* legacy integer 0-255 format.
* @example
createCanvas(200, 100);
colorMode(RGB);
background(255, 0, 0);
*/
const RGB: 'rgb';
/** 🎨
* OKLCH colors have components `l`/`lightness`, `c`/`chroma`,
* `h`/`hue`, and `a`/`alpha`. It's more intuitive for humans
* to work with color in these terms than RGB.
*
* OKLCH is perceptually uniform, meaning colors at the
* same lightness and chroma (colorfulness) will appear to
* have equal luminance, regardless of the hue.
*
* OKLCH can accurately represent all colors visible to the
* human eye, unlike many other color spaces that are bounded
* to a gamut. The maximum lightness and chroma values that
* correspond to sRGB or P3 gamut limits vary depending on
* the hue. Colors that are out of gamut will be clipped to
* the nearest in-gamut color.
*
* Use the [OKLCH color picker](https://oklch.com) to find
* in-gamut colors.
*
* - `lightness`: 0 to 1
* - `chroma`: 0 to ~0.4
* - `hue`: 0 to 360
* - `alpha`: 0 to 1
* @example
createCanvas(200, 100);
colorMode(OKLCH);
background(0.64, 0.3, 30);
* @example
createCanvas(200);
colorMode(OKLCH);
function draw() {
background(0.7, 0.16, frameCount % 360);
}
*/
const OKLCH: 'oklch';
/** 🎨
* HSL colors have components `h`/`hue`, `s`/`saturation`,
* `l`/`lightness`, and `a`/`alpha`.
*
* HSL was created in the 1970s to approximate human perception
* of color, trading accuracy for simpler computations. It's
* not perceptually uniform, so colors with the same lightness
* can appear darker or lighter, depending on their hue
* and saturation. Yet, the lightness and saturation values that
* correspond to gamut limits are always 100, regardless of the
* hue. This can make HSL easier to work with than OKLCH.
*
* HSL colors are mapped to the full P3 gamut when
* using the "display-p3" color space.
*
* - `hue`: 0 to 360
* - `saturation`: 0 to 100
* - `lightness`: 0 to 100
* - `alpha`: 0 to 1
* @example
createCanvas(200, 100);
colorMode(HSL);
background(0, 100, 50);
* @example
createCanvas(200, 220);
noStroke();
colorMode(HSL);
for (let h = 0; h < 360; h += 10) {
for (let l = 0; l <= 100; l += 10) {
fill(h, 100, l);
rect(h * (11/20), l * 2, 6, 20);
}
}
*/
const HSL: 'hsl';
/** 🎨
* HSB colors have components `h`/`hue`, `s`/`saturation`,
* `b`/`brightness` (aka `v`/`value`), and `a`/`alpha`.
*
* HSB is similar to HSL, but instead of lightness
* (black to white), it uses brightness (black to
* full color). To produce white, set brightness
* to 100 and saturation to 0.
*
* - `hue`: 0 to 360
* - `saturation`: 0 to 100
* - `brightness`: 0 to 100
* - `alpha`: 0 to 1
* @example
createCanvas(200, 100);
colorMode(HSB);
background(0, 100, 100);
* @example
createCanvas(200, 220);
noStroke();
colorMode(HSB);
for (let h = 0; h < 360; h += 10) {
for (let b = 0; b <= 100; b += 10) {
fill(h, 100, b);
rect(h * (11/20), b * 2, 6, 20);
}
}
*/
const HSB: 'hsb';
/** 🎨
* Limits the color gamut to the sRGB color space.
*
* If your display is HDR capable, note that full red appears
* less saturated and darker in this example, as it would on
* an SDR display.
* @example
createCanvas(200, 100);
colorMode(RGB, 255, SRGB);
background(255, 0, 0);
*/
const SRGB: 'srgb';
/** 🎨
* Expands the color gamut to the P3 color space.
*
* This is the default color gamut on devices that support HDR.
*
* If your display is HDR capable, note that full red appears
* fully saturated and bright in the following example.
* @example
createCanvas(200, 100);
colorMode(RGB, 255, DISPLAY_P3);
background(255, 0, 0);
*/
const DISPLAY_P3: 'display-p3';
class Color {
/** 🎨
* This constructor strictly accepts 4 numbers, which are the color
* components.
*
* Use the `color` function for greater flexibility, it runs
* this constructor internally.
*
* `Color` is not actually a class itself, it's a reference to a
* Q5 color class based on the color mode, format, and gamut.
*/
constructor(c0: number, c1: number, c2: number, c3: number);
/** 🎨
* Checks if this color is exactly equal to another color.
*/
equals(other: Color): boolean;
/** 🎨
* Checks if the color is the same as another color,
* disregarding their alpha values.
*/
isSameColor(other: Color): boolean;
/** 🎨
* Produces a CSS color string representation.
*/
toString(): string;
/** 🎨
* An array of the color's components.
*/
levels: number[];
}
// 💻 display
/** 💻
* Customize how your canvas is presented.
* @param {string} mode Display modes:
* - NORMAL: (default) canvas is not repositioned
* - CENTER: canvas is moved to the center of its parent
* - MAXED: canvas will be scaled to fill the parent element, with letterboxing if necessary to preserve its aspect ratio
* @param {string} renderQuality Render quality settings:
* - SMOOTH: (default) smooth upscaling if the canvas is scaled
* - PIXELATED: pixels rendered as sharp squares
* @param {number} scale can also be given as a string (for example "x2")
* @example
createCanvas(50, 25);
displayMode(CENTER, PIXELATED, 4);
circle(25, 12.5, 16);
*/
function displayMode(mode: string, renderQuality: string, scale: string | number): void;
/** 💻
* Enables or disables fullscreen mode.
* @param {boolean} [v] boolean indicating whether to enable or disable fullscreen mode
*/
function fullscreen(v?: boolean): void;
/** 💻
* A `displayMode` setting.
*
* The canvas will be scaled to fill the parent element,
* with letterboxing if necessary to preserve its aspect ratio.
*/
const MAXED: 'maxed';
/** 💻
* A `displayMode` render quality.
*
* Smooth upscaling is used if the canvas is scaled.
*/
const SMOOTH: 'smooth';
/** 💻
* A `displayMode` render quality.
*
* Pixels are rendered as sharp squares if the canvas is scaled.
*/
const PIXELATED: 'pixelated';
// 🧑🎨 shapes
/** 🧑🎨
* Draws over the entire canvas with a color or image.
*
* Like the [`color`](https://q5js.org/learn/#color) function,
* this function can accept colors in a wide range of formats:
* CSS color string, grayscale value, and color component values.
* @param {Color | Q5.Image} filler a color or image to draw
* @example
createCanvas(200, 100);
background('crimson');
* @example
let q = await Q5.WebGPU();
q.draw = () => {
background(0.5, 0.4);
circle(mouseX, mouseY, 20);
};
*/
function background(filler: Color | Q5.Image): void;
/** 🧑🎨
* Draws a rectangle or a rounded rectangle.
* @param {number} x x-coordinate
* @param {number} y y-coordinate
* @param {number} w width of the rectangle
* @param {number} [h] height of the rectangle
* @param {number} [tl] top-left radius
* @param {number} [tr] top-right radius
* @param {number} [br] bottom-right radius
* @param {number} [bl] bottom-left radius
* @example
createCanvas(200);
background(200);
rect(30, 20, 40, 60);
rect(80, 70, 40, 60, 10);
rect(130, 120, 40, 60, 30, 2, 8, 20);
*/
function rect(x: number, y: number, w: number, h?: number, tl?: number, tr?: number, br?: number, bl?: number): void;
/** 🧑🎨
* Draws a square or a rounded square.
* @param {number} x x-coordinate
* @param {number} y y-coordinate
* @param {number} size size of the sides of the square
* @param {number} [tl] top-left radius
* @param {number} [tr] top-right radius
* @param {number} [br] bottom-right radius
* @param {number} [bl] bottom-left radius
* @example
createCanvas(200);
background(200);
square(30, 30, 40);
square(80, 80, 40, 10);
square(130, 130, 40, 30, 2, 8, 20);
*/
function square(x: number, y: number, size: number, tl?: number, tr?: number, br?: number, bl?: number): void;
/** 🧑🎨
* Draws a circle.
* @param {number} x x-coordinate
* @param {number} y y-coordinate
* @param {number} diameter diameter of the circle
* @example
createCanvas(200, 100);
circle(100, 50, 80);
*/
function circle(x: number, y: number, diameter: number): void;
/** 🧑🎨
* Draws an ellipse.
* @param {number} x x-coordinate
* @param {number} y y-coordinate
* @param {number} width width of the ellipse
* @param {number} [height] height of the ellipse
* @example
createCanvas(200, 100);
ellipse(100, 50, 160, 80);
*/
function ellipse(x: number, y: number, width: number, height?: number): void;
/** 🧑🎨
* Draws an arc, which is a section of an ellipse.
*
* `ellipseMode` affects how the arc is drawn.
*
* q5 WebGPU only supports the default `PIE_OPEN` mode.
* @param {number} x x-coordinate
* @param {number} y y-coordinate
* @param {number} w width of the ellipse
* @param {number} h height of the ellipse
* @param {number} start angle to start the arc
* @param {number} stop angle to stop the arc
* @param {number} [mode] shape and stroke style setting, default is `PIE_OPEN` for a pie shape with an unclosed stroke, can be `PIE`, `CHORD`, or `CHORD_OPEN`
* @example
createCanvas(200);
background(200);
arc(40, 40, 40, 40, 0.8, -0.8);
arc(80, 80, 40, 40, 0.8, -0.8, PIE);
arc(120, 120, 40, 40, 0.8, -0.8, CHORD_OPEN);
arc(160, 160, 40, 40, 0.8, -0.8, CHORD);
*/
function arc(x: number, y: number, w: number, h: number, start: number, stop: number, mode?: number): void;
/** 🧑🎨
* Draws a line on the canvas.
* @param {number} x1 x-coordinate of the first point
* @param {number} y1 y-coordinate of the first point
* @param {number} x2 x-coordinate of the second point
* @param {number} y2 y-coordinate of the second point
* @example
createCanvas(200, 100);
stroke('lime');
line(20, 20, 180, 80);
*/
function line(x1: number, y1: number, x2: number, y2: number): void;
/** 🧑🎨
* Draws a capsule, which is pill shaped.
* @param {number} x1 x-coordinate of the first point
* @param {number} y1 y-coordinate of the first point
* @param {number} x2 x-coordinate of the second point
* @param {number} y2 y-coordinate of the second point
* @param {number} r radius of the capsule semi-circle ends
* @example
createCanvas(200, 100);
background(200);
strokeWeight(5);
capsule(40, 40, 160, 60, 10);
* @example
let q = await Q5.WebGPU();
q.draw = () => {
background(0.8);
strokeWeight(10);
capsule(0, 0, mouseX, mouseY, 20);
}
*/
function capsule(x1: number, y1: number, x2: number, y2: number, r: number): void;
/** 🧑🎨
* Draws a point on the canvas.
* @param {number} x x-coordinate
* @param {number} y y-coordinate
* @example
createCanvas(200, 100);
stroke('white');
point(75, 50);
strokeWeight(10);
point(125, 50);
*/
function point(x: number, y: number): void;
/** 🧑🎨
* Set the global composite operation for the canvas context.
*
* Not available in q5 WebGPU.
* @param {string} val composite operation
*/
function blendMode(val: string): void;
/** 🧑🎨
* Set the line cap style to `ROUND`, `SQUARE`, or `PROJECT`.
*
* Not available in q5 WebGPU.
* @param {CanvasLineCap} val line cap style
* @example
createCanvas(200);
background(200);
strokeWeight(20);
strokeCap(ROUND);
line(50, 50, 150, 50);
strokeCap(SQUARE);
line(50, 100, 150, 100);
strokeCap(PROJECT);
line(50, 150, 150, 150);
*/
function strokeCap(val: CanvasLineCap): void;
/** 🧑🎨
* Set the line join style to `ROUND`, `BEVEL`, or `MITER`.
*
* Not available in q5 WebGPU.
* @param {CanvasLineJoin} val line join style
* @example
createCanvas(200);
background(200);
strokeWeight(10);
strokeJoin(ROUND);
triangle(50, 20, 150, 20, 50, 70);
strokeJoin(BEVEL);
triangle(150, 50, 50, 100, 150, 150);
strokeJoin(MITER);
triangle(50, 130, 150, 180, 50, 180);
*/
function strokeJoin(val: CanvasLineJoin): void;
/** 🧑🎨
* Set to `CORNER` (default), `CENTER`, `RADIUS`, or `CORNERS`.
*
* Changes how the first four inputs to
* `rect` and `square` are interpreted.
* @param {string} mode
* @example
createCanvas(200, 100);
background(200);
rectMode(CORNER);
// ( x, y, w, h)
rect(50, 25, 100, 50);
* @example
createCanvas(200, 100);
background(200);
rectMode(CENTER);
// ( cX, cY, w, h)
rect(100, 50, 100, 50);
* @example
createCanvas(200, 100);
background(200);
rectMode(RADIUS);
// ( cX, cY, rX, rY)
rect(100, 50, 50, 25);
* @example
createCanvas(200, 100);
background(200);
rectMode(CORNERS);
// ( x1, y1, x2, y2)
rect(50, 25, 150, 75);
*/
function rectMode(mode: string): void;
/** 🧑🎨
* Set to `CENTER` (default), `RADIUS`, `CORNER`, or `CORNERS`.
*
* Changes how the first four inputs to
* `ellipse`, `circle`, and `arc` are interpreted.
* @param {string} mode
* @example
createCanvas(200, 100);
background(200);
ellipseMode(CENTER);
// ( x, y, w, h)
ellipse(100, 50, 100, 50);
* @example
createCanvas(200, 100);
background(200);
ellipseMode(RADIUS);
// ( x, y, rX, rY)
ellipse(100, 50, 50, 25);
* @example
createCanvas(200, 100);
background(200);
ellipseMode(CORNER);
// (lX, tY, w, h)
ellipse(50, 25, 100, 50);
* @example
createCanvas(200, 100);
background(200);
ellipseMode(CORNERS);
// ( x1, y1, x2, y2)
ellipse(50, 25, 150, 75);
*/
function ellipseMode(mode: string): void;
/** 🧑🎨
* Draws a curve.
*/
function curve( x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number): void;
/** 🧑🎨
* Sets the amount of straight line segments used to make a curve.
*
* Only takes effect in q5 WebGPU.
* @param {number} val curve detail level, default is 20
* @example
await Q5.WebGPU();
curveDetail(4);
strokeWeight(10);
stroke(0, 1, 1);
noFill();
curve(-100, -200, -50, 0, 50, 0, 100, -200);
*/
function curveDetail(val: number): void;
/** 🧑🎨
* Starts storing vertices for a convex shape.
*/
function beginShape(): void;
/** 🧑🎨
* Ends storing vertices for a convex shape.
*/
function endShape(): void;
/** 🧑🎨
* Starts storing vertices for a contour.
*
* Not available in q5 WebGPU.
*/
function beginContour(): void;
/** 🧑🎨
* Ends storing vertices for a contour.
*
* Not available in q5 WebGPU.
*/
function endContour(): void;
/** 🧑🎨
* Specifies a vertex in a shape.
* @param {number} x x-coordinate
* @param {number} y y-coordinate
*/
function vertex(x: number, y: number): void;
/** 🧑🎨
* Specifies a Bezier vertex in a shape.
* @param {number} cp1x x-coordinate of the first control point
* @param {number} cp1y y-coordinate of the first control point
* @param {number} cp2x x-coordinate of the second control point
* @param {number} cp2y y-coordinate of the second control point
* @param {number} x x-coordinate of the anchor point
* @param {number} y y-coordinate of the anchor point
*/
function bezierVertex(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void;
/** 🧑🎨
* Specifies a quadratic Bezier vertex in a shape.
* @param {number} cp1x x-coordinate of the control point
* @param {number} cp1y y-coordinate of the control point
* @param {number} x x-coordinate of the anchor point
* @param {number} y y-coordinate of the anchor point
*/
function quadraticVertex(cp1x: number, cp1y: number, x: number, y: number): void;
/** 🧑🎨
* Draws a Bezier curve.
* @param {number} x1 x-coordinate of the first anchor point
* @param {number} y1 y-coordinate of the first anchor point
* @param {number} x2 x-coordinate of the first control point
* @param {number} y2 y-coordinate of the first control point
* @param {number} x3 x-coordinate of the second control point
* @param {number} y3 y-coordinate of the second control point
* @param {number} x4 x-coordinate of the second anchor point
* @param {number} y4 y-coordinate of the second anchor point
*/
function bezier(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number): void;
/** 🧑🎨
* Draws a triangle.
* @param {number} x1 x-coordinate of the first vertex
* @param {number} y1 y-coordinate of the first vertex
* @param {number} x2 x-coordinate of the second vertex
* @param {number} y2 y-coordinate of the second vertex
* @param {number} x3 x-coordinate of the third vertex
* @param {number} y3 y-coordinate of the third vertex
*/
function triangle(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number): void;
/** 🧑🎨
* Draws a quadrilateral.
* @param {number} x1 x-coordinate of the first vertex
* @param {number} y1 y-coordinate of the first vertex
* @param {number} x2 x-coordinate of the second vertex
* @param {number} y2 y-coordinate of the second vertex
* @param {number} x3 x-coordinate of the third vertex
* @param {number} y3 y-coordinate of the third vertex
* @param {number} x4 x-coordinate of the fourth vertex
* @param {number} y4 y-coordinate of the fourth vertex
*/
function quad(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number): void;
/** 🧑🎨
* Sets the canvas to erase mode, where shapes will erase what's
* underneath them instead of drawing over it.
*
* Not available in q5 WebGPU.
* @param {number} [fillAlpha] opacity level of the fill color
* @param {number} [strokeAlpha] opacity level of the stroke color
*/
function erase(fillAlpha?: number, strokeAlpha?: number): void;
/** 🧑🎨
* Resets the canvas from erase mode to normal drawing mode.
*
* Not available in q5 WebGPU.
*/
function noErase(): void;
/** 🧑🎨
* Checks if a given point is within the current path's fill area.
*
* Not available in q5 WebGPU.
* @param {number} x x-coordinate of the point
* @param {number} y y-coordinate of the point
* @returns {boolean} true if the point is within the fill area, false otherwise
*/
function inFill(x: number, y: number): boolean;
/** 🧑🎨
* Checks if a given point is within the current path's stroke.
*
* Not available in q5 WebGPU.
* @param {number} x x-coordinate of the point
* @param {number} y y-coordinate of the point
* @returns {boolean} true if the point is within the stroke, false otherwise
*/
function inStroke(x: number, y: number): boolean;
/** 🧑🎨
*/
const CORNER: 'corner';
/** 🧑🎨
*/
const RADIUS: 'radius';
/** 🧑🎨
*/
const CORNERS: 'corners';
// 🌆 image
/** 🌆
* Loads an image from a URL and optionally runs a callback function.
*
* Returns a promise if used in async `setup`.
*
* @param {string} url url of the image to load
* @returns {Q5.Image | Promise<Q5.Image>} image or promise
* @example
createCanvas(200);
let logo = loadImage('/q5js_logo.avif');
function draw() {
background(logo);
}
* @example
let q = await Q5.WebGPU();
createCanvas(200);
let logo = loadImage('/q5js_logo.avif');
q.draw = () => {
background(logo);
};
*/
function loadImage(url: string): Q5.Image | Promise<Q5.Image>;
/** 🌆
* Draws an image or video frame to the canvas.
* @param {Q5.Image | HTMLVideoElement} img image or video to draw
* @param {number} dx x position to draw the image at
* @param {number} dy y position to draw the image at
* @param {number} [dw] width of the destination image
* @param {number} [dh] height of the destination image
* @param {number} [sx] x position in the source to start clipping a subsection from
* @param {number} [sy] y position in the source to start clipping a subsection from
* @param {number} [sw] width of the subsection of the source image
* @param {number} [sh] height of the subsection of the source image
* @example
createCanvas(200);
let logo = loadImage('/q5js_logo.avif');
function draw() {
image(logo, 0, 0, 200, 200);
}
* @example
createCanvas(200);
let logo = loadImage('/q5js_logo.avif');
function draw() {
image(logo, 0, 0, 200, 200, 256, 256, 512, 512);
}
*/
function image(img: Q5.Image | HTMLVideoElement, dx: number, dy: number, dw?: number, dh?: number, sx?: number, sy?: number, sw?: number, sh?: number): void;
/** 🌆
* Set to `CORNER` (default), `CORNERS`, or `CENTER`.
*
* Changes how inputs to `image` are interpreted.
* @param {string} mode
* @example
createCanvas(200);
let logo = loadImage('/q5js_logo.avif');
function draw() {
imageMode(CORNER);
// ( img, x, y, w, h)
image(logo, 50, 50, 100, 100);
}
* @example
createCanvas(200);
let logo = loadImage('/q5js_logo.avif');
function draw() {
imageMode(CENTER);
// ( img, cX, cY, w, h)
image(logo, 100, 100, 100, 100);
}
* @example
createCanvas(200);
let logo = loadImage('/q5js_logo.avif');
function draw() {
imageMode(CORNERS);
// ( img, x1, y1, x2, y2)
image(logo, 50, 50, 100, 100);
}
*/
function imageMode(mode: string): void;
/** 🌆
* Sets the default image scale, which is applied to images when
* they are drawn without a specified width or height.
*
* By default it is 0.5 so images appear at their actual size
* when pixel density is 2. Images will be drawn at a consistent
* default size relative to the canvas regardless of pixel density.
*
* This function must be called before images are loaded to
* have an effect.
* @param {number} scale
* @returns {number} default image scale
*/
function defaultImageScale(scale: number): number;
/** 🌆
* Resizes the image.
* @param {number} w new width
* @param {number} h new height
* @example
createCanvas(200);
let logo = loadImage('/q5js_logo.avif');
function setup() {
logo.resize(128, 128);
image(logo, 0, 0, 200, 200);
}
*/
function resize(w: number, h: number): void;
/** 🌆
* Returns a trimmed image, cropping out transparent pixels from the edges.
* @returns {Image}
*/
function trim(): Q5.Image;
/** 🌆
* Enables smooth rendering of images displayed larger than
* their actual size. This is the default setting, so running this
* function only has an effect if `noSmooth` has been called.
* @example
createCanvas(200);
let icon = loadImage('/q5js_icon.png');
function setup() {
image(icon, 0, 0, 200, 200);
}
*/
function smooth(): void;
/** 🌆
* Disables smooth image rendering for a pixelated look.
* @example
createCanvas(200);
let icon = loadImage('/q5js_icon.png');
function setup() {
noSmooth();
image(icon, 0, 0, 200, 200);
}
*/
function noSmooth(): void;
/** 🌆
* Applies a tint (color overlay) to the drawing.
*
* The alpha value of the tint color determines the
* strength of the tint. To change an image's opacity,
* use the `opacity` function.
*
* Tinting affects all subsequent images drawn. The tint
* color is applied to images using the "multiply" blend mode.
*
* Since the tinting process is performance intensive, each time
* an image is tinted, q5 caches the result. `image` will draw the
* cached tinted image unless the tint color has changed or the
* image being tinted was edited.
*
* If you need to draw an image multiple times each frame with
* different tints, consider making copies of the image and tinting
* each copy separately.
* @param {string | number} color tint color
* @example
createCanvas(200);
let logo = loadImage('/q5js_logo.avif');
function setup() {
tint(255, 0, 0, 128);
image(logo, 0, 0, 200, 200);
}
*/
function tint(color: string | number): void;
/** 🌆
* Images drawn after this function is run will not be tinted.
*/
function noTint(): void;
/** 🌆
* Masks the image with another image.
* @param {Q5.Image} img image to use as a mask
*/
function mask(img: Q5.Image): void;
/** 🌆
* Returns a copy of the image.
* @returns {Q5.Image}
*/
function copy(): Q5.Image;
/** 🌆
* Displays a region of the image on another region of the image.
* Can be used to create a detail inset, aka a magnifying glass effect.
* @param {number} sx x-coordinate of the source region
* @param {number} sy y-coordinate of the source region
* @param {number} sw width of the source region
* @param {number} sh height of the source region
* @param {number} dx x-coordinate of the destination region
* @param {number} dy y-coordinate of the destination region
* @param {number} dw width of the destination region
* @param {number} dh height of the destination region
* @example
createCanvas(200);
let logo = loadImage('/q5js_logo.avif');
function setup() {
logo.inset(256, 256, 512, 512, 0, 0, 256, 256);
image(logo, 0, 0, 200, 200);
}
*/
function inset(sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw: number, dh: number): void;
/** 🌆
* Retrieves a subsection of an image or canvas as a new Q5 Image
* or the color of a pixel in the image or canvas.
*
* If only x and y are specified, this function returns the color of the pixel
* at the given coordinate in `[R, G, B, A]` array format. If `loadPixels`
* has never been run, it's run by this function.
*
* If you make changes t