spryte 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +71 -2
- package/dist/backend.d.ts +69 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +2 -0
- package/dist/backend.js.map +1 -0
- package/dist/bitmap-font.d.ts +55 -0
- package/dist/bitmap-font.d.ts.map +1 -0
- package/dist/bitmap-font.js +103 -0
- package/dist/bitmap-font.js.map +1 -0
- package/dist/canvas2d.d.ts +45 -0
- package/dist/canvas2d.d.ts.map +1 -0
- package/dist/canvas2d.js +210 -0
- package/dist/canvas2d.js.map +1 -0
- package/dist/color.d.ts +7 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +49 -0
- package/dist/color.js.map +1 -0
- package/dist/copies.d.ts +45 -0
- package/dist/copies.d.ts.map +1 -0
- package/dist/copies.js +43 -0
- package/dist/copies.js.map +1 -0
- package/dist/draw.d.ts +188 -0
- package/dist/draw.d.ts.map +1 -0
- package/dist/draw.js +603 -0
- package/dist/draw.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/renderer.d.ts +17 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +61 -0
- package/dist/renderer.js.map +1 -0
- package/dist/shader.d.ts +34 -0
- package/dist/shader.d.ts.map +1 -0
- package/dist/shader.js +40 -0
- package/dist/shader.js.map +1 -0
- package/dist/target.d.ts +13 -0
- package/dist/target.d.ts.map +1 -0
- package/dist/target.js +18 -0
- package/dist/target.js.map +1 -0
- package/dist/webgl2.d.ts +90 -0
- package/dist/webgl2.d.ts.map +1 -0
- package/dist/webgl2.js +868 -0
- package/dist/webgl2.js.map +1 -0
- package/package.json +54 -4
package/dist/color.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const cache = new Map();
|
|
2
|
+
/** Normalise a colour to `0xRRGGBBAA` (unsigned). Hex strings are cached; other CSS colours resolve through the browser. */
|
|
3
|
+
export function toRGBA(color) {
|
|
4
|
+
if (typeof color === "number")
|
|
5
|
+
return color >>> 0;
|
|
6
|
+
const hit = cache.get(color);
|
|
7
|
+
if (hit !== undefined)
|
|
8
|
+
return hit;
|
|
9
|
+
const value = parse(color);
|
|
10
|
+
if (cache.size > 512)
|
|
11
|
+
cache.clear();
|
|
12
|
+
cache.set(color, value);
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
function parse(input) {
|
|
16
|
+
let hex = input.trim();
|
|
17
|
+
if (hex.startsWith("#")) {
|
|
18
|
+
hex = hex.slice(1);
|
|
19
|
+
if (hex.length === 3 || hex.length === 4)
|
|
20
|
+
hex = [...hex].map((c) => c + c).join("");
|
|
21
|
+
if (hex.length === 6)
|
|
22
|
+
hex += "ff";
|
|
23
|
+
if (hex.length === 8 && /^[0-9a-f]{8}$/i.test(hex))
|
|
24
|
+
return Number.parseInt(hex, 16) >>> 0;
|
|
25
|
+
}
|
|
26
|
+
return parseCss(input);
|
|
27
|
+
}
|
|
28
|
+
let probe;
|
|
29
|
+
/** Any other CSS colour (named, rgb(), hsl()…): let the browser resolve it once. */
|
|
30
|
+
function parseCss(input) {
|
|
31
|
+
if (probe === undefined) {
|
|
32
|
+
const canvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(1, 1) : document.createElement("canvas");
|
|
33
|
+
probe = canvas.getContext("2d", { willReadFrequently: true });
|
|
34
|
+
}
|
|
35
|
+
if (!probe)
|
|
36
|
+
throw new Error(`Cannot parse colour "${input}" without a 2D canvas; use hex`);
|
|
37
|
+
probe.clearRect(0, 0, 1, 1);
|
|
38
|
+
probe.fillStyle = "#000";
|
|
39
|
+
probe.fillStyle = input;
|
|
40
|
+
probe.fillRect(0, 0, 1, 1);
|
|
41
|
+
const [r = 0, g = 0, b = 0, a = 0] = probe.getImageData(0, 0, 1, 1).data;
|
|
42
|
+
return ((r << 24) | (g << 16) | (b << 8) | a) >>> 0;
|
|
43
|
+
}
|
|
44
|
+
/** `0xRRGGBBAA` to a CSS colour string. */
|
|
45
|
+
export function rgbaToCss(rgba, alphaScale = 1) {
|
|
46
|
+
const a = ((rgba & 0xff) / 255) * alphaScale;
|
|
47
|
+
return `rgba(${rgba >>> 24},${(rgba >>> 16) & 0xff},${(rgba >>> 8) & 0xff},${a})`;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=color.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.js","sourceRoot":"","sources":["../src/color.ts"],"names":[],"mappings":"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"}
|
package/dist/copies.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Matrix, TextureSource } from "./backend.js";
|
|
2
|
+
/** Optional per-copy values for `draw.sprites`. Each array has one entry per copy. */
|
|
3
|
+
export interface SpritesEach {
|
|
4
|
+
/** Uniform scale per copy, multiplied with `scaleX`/`scaleY`. */
|
|
5
|
+
scale?: ArrayLike<number>;
|
|
6
|
+
/** Radians per copy, added to `rotation`. */
|
|
7
|
+
rotation?: ArrayLike<number>;
|
|
8
|
+
/** `0xRRGGBBAA` per copy, multiplied with `tint` and `alpha`. A `Uint32Array`, uploaded as is. */
|
|
9
|
+
color?: Uint32Array;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Everything a backend needs to draw copies of one frame with per-copy values.
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export interface CopySpec {
|
|
16
|
+
/** The current transform. */
|
|
17
|
+
m: Matrix;
|
|
18
|
+
positions: ArrayLike<number>;
|
|
19
|
+
count: number;
|
|
20
|
+
src: TextureSource;
|
|
21
|
+
sx: number;
|
|
22
|
+
sy: number;
|
|
23
|
+
sw: number;
|
|
24
|
+
sh: number;
|
|
25
|
+
/** Anchor offset in frame pixels: -origin × size. */
|
|
26
|
+
ox: number;
|
|
27
|
+
oy: number;
|
|
28
|
+
/** Shared scale, flips folded in. */
|
|
29
|
+
scaleX: number;
|
|
30
|
+
scaleY: number;
|
|
31
|
+
rotation: number;
|
|
32
|
+
/** Shared 0xRRGGBBAA (tint × alpha × global alpha). */
|
|
33
|
+
color: number;
|
|
34
|
+
flash: number;
|
|
35
|
+
smooth: boolean;
|
|
36
|
+
/** Pixel art under a rotation-free transform: copies whose own rotation is zero snap to whole pixels. */
|
|
37
|
+
snap: boolean;
|
|
38
|
+
each: SpritesEach;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Copy `i`'s quad matrix (the same algebra as `draw.sprite`) and colour, for backends without a GPU path.
|
|
42
|
+
* Returns the colour; writes the matrix into `out`.
|
|
43
|
+
*/
|
|
44
|
+
export declare function copyAt(c: CopySpec, i: number, out: Matrix): number;
|
|
45
|
+
//# sourceMappingURL=copies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copies.d.ts","sourceRoot":"","sources":["../src/copies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE1D,sFAAsF;AACtF,MAAM,WAAW,WAAW;IAC1B,iEAAiE;IACjE,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7B,kGAAkG;IAClG,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,6BAA6B;IAC7B,CAAC,EAAE,MAAM,CAAC;IACV,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,aAAa,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,qDAAqD;IACrD,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,yGAAyG;IACzG,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,WAAW,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAgClE"}
|
package/dist/copies.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copy `i`'s quad matrix (the same algebra as `draw.sprite`) and colour, for backends without a GPU path.
|
|
3
|
+
* Returns the colour; writes the matrix into `out`.
|
|
4
|
+
*/
|
|
5
|
+
export function copyAt(c, i, out) {
|
|
6
|
+
const k = c.each.scale ? c.each.scale[i] : 1;
|
|
7
|
+
const r = c.rotation + (c.each.rotation ? c.each.rotation[i] : 0);
|
|
8
|
+
const sx = c.scaleX * k;
|
|
9
|
+
const sy = c.scaleY * k;
|
|
10
|
+
let a = sx;
|
|
11
|
+
let b = 0;
|
|
12
|
+
let cc = 0;
|
|
13
|
+
let d = sy;
|
|
14
|
+
if (r) {
|
|
15
|
+
const cos = Math.cos(r);
|
|
16
|
+
const sin = Math.sin(r);
|
|
17
|
+
a = cos * sx;
|
|
18
|
+
b = sin * sx;
|
|
19
|
+
cc = -sin * sy;
|
|
20
|
+
d = cos * sy;
|
|
21
|
+
}
|
|
22
|
+
const lx = a * c.ox + cc * c.oy + c.positions[i * 2];
|
|
23
|
+
const ly = b * c.ox + d * c.oy + c.positions[i * 2 + 1];
|
|
24
|
+
const m = c.m;
|
|
25
|
+
out[0] = (m[0] * a + m[2] * b) * c.sw;
|
|
26
|
+
out[1] = (m[1] * a + m[3] * b) * c.sw;
|
|
27
|
+
out[2] = (m[0] * cc + m[2] * d) * c.sh;
|
|
28
|
+
out[3] = (m[1] * cc + m[3] * d) * c.sh;
|
|
29
|
+
out[4] = m[0] * lx + m[2] * ly + m[4];
|
|
30
|
+
out[5] = m[1] * lx + m[3] * ly + m[5];
|
|
31
|
+
if (c.snap && !r) {
|
|
32
|
+
out[4] = Math.round(out[4]);
|
|
33
|
+
out[5] = Math.round(out[5]);
|
|
34
|
+
}
|
|
35
|
+
const each = c.each.color ? c.each.color[i] : 0xffffffff;
|
|
36
|
+
return each === 0xffffffff ? c.color : multiply(c.color, each);
|
|
37
|
+
}
|
|
38
|
+
/** Channel-wise product of two 0xRRGGBBAA colours. */
|
|
39
|
+
function multiply(x, y) {
|
|
40
|
+
const ch = (shift) => Math.round((((x >>> shift) & 0xff) * ((y >>> shift) & 0xff)) / 255);
|
|
41
|
+
return ((ch(24) << 24) | (ch(16) << 16) | (ch(8) << 8) | ch(0)) >>> 0;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=copies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copies.js","sourceRoot":"","sources":["../src/copies.ts"],"names":[],"mappings":"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"}
|
package/dist/draw.d.ts
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import type { Backend, BlendMode, Matrix, RawContext, TextureSource } from "./backend.js";
|
|
2
|
+
import type { BitmapFont } from "./bitmap-font.js";
|
|
3
|
+
import { type Color } from "./color.js";
|
|
4
|
+
import type { SpritesEach } from "./copies.js";
|
|
5
|
+
import { Shader } from "./shader.js";
|
|
6
|
+
import { RenderTarget } from "./target.js";
|
|
7
|
+
/** A rectangular region of an image, in source pixels. */
|
|
8
|
+
export interface Frame {
|
|
9
|
+
image: TextureSource;
|
|
10
|
+
x: number;
|
|
11
|
+
y: number;
|
|
12
|
+
w: number;
|
|
13
|
+
h: number;
|
|
14
|
+
}
|
|
15
|
+
export interface SpriteDrawOptions {
|
|
16
|
+
/** Anchor as a fraction of the frame size. Default [0.5, 0.5] (centre). */
|
|
17
|
+
origin?: readonly [number, number];
|
|
18
|
+
scaleX?: number;
|
|
19
|
+
scaleY?: number;
|
|
20
|
+
/** Radians. */
|
|
21
|
+
rotation?: number;
|
|
22
|
+
flipX?: boolean;
|
|
23
|
+
flipY?: boolean;
|
|
24
|
+
/** Multiplied with the global alpha. */
|
|
25
|
+
alpha?: number;
|
|
26
|
+
/** Colour multiplier. Default white. */
|
|
27
|
+
tint?: Color;
|
|
28
|
+
/** 0..1 mix toward white, e.g. hit flashes. */
|
|
29
|
+
flash?: number;
|
|
30
|
+
/** Linear filtering for this sprite. Default: the game's setting (off when `pixelArt`). */
|
|
31
|
+
smooth?: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface TextDrawOptions {
|
|
34
|
+
/** A `BitmapFont`, or a CSS font such as "16px monospace". Default: `draw.font`. */
|
|
35
|
+
font?: string | BitmapFont | undefined;
|
|
36
|
+
color?: Color;
|
|
37
|
+
align?: "left" | "center" | "right";
|
|
38
|
+
baseline?: "top" | "middle" | "bottom";
|
|
39
|
+
alpha?: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Immediate-mode drawing in logical units, the same API on WebGL2 and Canvas 2D (ADR 0007).
|
|
43
|
+
* Everything batches automatically; call order is draw order.
|
|
44
|
+
*/
|
|
45
|
+
export declare class Draw {
|
|
46
|
+
private backend;
|
|
47
|
+
/** Default filtering for images (false for pixel art). */
|
|
48
|
+
smooth: boolean;
|
|
49
|
+
/** Global alpha multiplier for subsequent draws. */
|
|
50
|
+
alpha: number;
|
|
51
|
+
/**
|
|
52
|
+
* Font for `text()` and `measure()` when none is given: a CSS font, a `BitmapFont`, or a function returning
|
|
53
|
+
* one (called on first use, so a font built from a canvas costs nothing until text is drawn).
|
|
54
|
+
*/
|
|
55
|
+
font: string | BitmapFont | (() => string | BitmapFont);
|
|
56
|
+
/** Quads (sprites, rects, glyph runs…) submitted this frame. Reset each frame; for diagnostics. */
|
|
57
|
+
quads: number;
|
|
58
|
+
/** Preallocated transform stack: push/pop copy six numbers and never allocate. */
|
|
59
|
+
private readonly stack;
|
|
60
|
+
private depth;
|
|
61
|
+
private readonly m;
|
|
62
|
+
private readonly frames;
|
|
63
|
+
private lastImage;
|
|
64
|
+
private lastFrame;
|
|
65
|
+
private readonly clips;
|
|
66
|
+
private shader;
|
|
67
|
+
/** The render target being drawn into, or null for the canvas. */
|
|
68
|
+
private target;
|
|
69
|
+
/** The canvas's logical size this frame, to switch back to after `into()`. */
|
|
70
|
+
private viewW;
|
|
71
|
+
private viewH;
|
|
72
|
+
private readonly tmp;
|
|
73
|
+
private readonly textCache;
|
|
74
|
+
private circleTexture;
|
|
75
|
+
private backingW;
|
|
76
|
+
private backingH;
|
|
77
|
+
/** @internal */
|
|
78
|
+
constructor(backend: Backend,
|
|
79
|
+
/** Default filtering for images (false for pixel art). */
|
|
80
|
+
smooth: boolean);
|
|
81
|
+
/** Which backend is active. */
|
|
82
|
+
get kind(): "webgl2" | "2d";
|
|
83
|
+
/** Draw calls this frame: batched GPU calls on WebGL2, one per quad on Canvas 2D. */
|
|
84
|
+
get drawCalls(): number;
|
|
85
|
+
/**
|
|
86
|
+
* Resolves once the backend can draw. Immediate on WebGL2; on the Canvas 2D fallback, once its chunk has
|
|
87
|
+
* loaded (frames before that draw nothing). Rejects if the fallback fails to load.
|
|
88
|
+
*/
|
|
89
|
+
ready: Promise<void>;
|
|
90
|
+
/** Raw `WebGL2RenderingContext` or `CanvasRenderingContext2D`. Mixing raw calls with `draw` calls requires care. */
|
|
91
|
+
get raw(): RawContext;
|
|
92
|
+
push(): void;
|
|
93
|
+
pop(): void;
|
|
94
|
+
translate(x: number, y: number): void;
|
|
95
|
+
scale(x: number, y?: number): void;
|
|
96
|
+
rotate(radians: number): void;
|
|
97
|
+
/**
|
|
98
|
+
* Run `fn` with drawing restricted to a rectangle (in current units), then restore. Nested clips
|
|
99
|
+
* intersect. Clips are axis-aligned on screen: under rotation the rectangle's screen bounds are used.
|
|
100
|
+
*/
|
|
101
|
+
clip(x: number, y: number, w: number, h: number, fn: () => void): void;
|
|
102
|
+
/** Run `fn` with the camera's view applied, then restore. */
|
|
103
|
+
withCamera(camera: {
|
|
104
|
+
view(): Matrix;
|
|
105
|
+
}, fn: () => void): void;
|
|
106
|
+
blend(mode: BlendMode): void;
|
|
107
|
+
rect(x: number, y: number, w: number, h: number, color: Color): void;
|
|
108
|
+
/** Filled circle (antialiased). */
|
|
109
|
+
circle(x: number, y: number, radius: number, color: Color): void;
|
|
110
|
+
line(x1: number, y1: number, x2: number, y2: number, width: number, color: Color): void;
|
|
111
|
+
/** Draw an image frame (or a whole image) at `x, y`, anchored by `origin`. Allocation-free hot path. */
|
|
112
|
+
sprite(frame: Frame | TextureSource, x: number, y: number, o?: SpriteDrawOptions): void;
|
|
113
|
+
/**
|
|
114
|
+
* Draw one image frame at many positions in a single call: particles, bullets, swarms, starfields.
|
|
115
|
+
* `positions` holds x, y pairs (a `Float32Array` you reuse is ideal); `count` defaults to all of them.
|
|
116
|
+
* Every copy shares `options` (rotation, scale, tint, alpha…), so per-copy work is just the position.
|
|
117
|
+
* Much faster than calling `sprite()` in a loop, and allocation-free.
|
|
118
|
+
*
|
|
119
|
+
* ```ts
|
|
120
|
+
* const pos = new Float32Array(2 * MAX);
|
|
121
|
+
* // ...update pos...
|
|
122
|
+
* draw.sprites(spark, pos, live, { tint: "#ffd36b", alpha: 0.8 });
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
sprites(frame: Frame | TextureSource, positions: ArrayLike<number>, count?: number, o?: SpriteDrawOptions, each?: SpritesEach): void;
|
|
126
|
+
private spritesEach;
|
|
127
|
+
/** tmp = M · T(x, y) · R(rotation) · S(sx, sy) · T(ox, oy) · S(w, h), expanded by hand. Returns the frame. */
|
|
128
|
+
private place;
|
|
129
|
+
private spriteColor;
|
|
130
|
+
/** Text, rasterised once and cached as a texture (crisp at the current render scale). */
|
|
131
|
+
text(text: string, x: number, y: number, o?: TextDrawOptions): void;
|
|
132
|
+
/**
|
|
133
|
+
* The logical box `text()` fills for this string and font, so layouts can align and centre without
|
|
134
|
+
* guessing. Same cache as `text()`, so measuring then drawing rasterises once.
|
|
135
|
+
*/
|
|
136
|
+
measure(text: string, font?: string | BitmapFont): {
|
|
137
|
+
w: number;
|
|
138
|
+
h: number;
|
|
139
|
+
};
|
|
140
|
+
private bitmapText;
|
|
141
|
+
/** An offscreen image of `width × height` pixels to draw into with `into()`, then draw like any image. */
|
|
142
|
+
createTarget(width: number, height: number): RenderTarget;
|
|
143
|
+
/**
|
|
144
|
+
* Run `fn` with drawing going into `target` instead of the canvas, then switch back. Inside, units are the
|
|
145
|
+
* target's pixels from its top-left; the transform, clips and global alpha start fresh and are restored
|
|
146
|
+
* afterwards. `clear` fills the target first (default transparent); pass `null` to draw over what's there,
|
|
147
|
+
* for trails and accumulation. Nests.
|
|
148
|
+
*
|
|
149
|
+
* ```ts
|
|
150
|
+
* const glow = draw.createTarget(160, 90);
|
|
151
|
+
* draw.into(glow, () => draw.sprites(spark, sparks, n, { tint: "#ffd36b" }));
|
|
152
|
+
* draw.blend("add");
|
|
153
|
+
* draw.sprite(glow, 160, 90, { scaleX: 2, scaleY: 2, smooth: true });
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
into(target: RenderTarget, fn: () => void, clear?: Color | null): void;
|
|
157
|
+
/** A custom fragment effect: see `Shader`. Compiled on first use, so errors surface at the first `withShader` draw. */
|
|
158
|
+
createShader(source: string): Shader;
|
|
159
|
+
/** Run `fn` with everything drawn through `shader`, then restore the previous one. Nests. WebGL2 only (see `Shader`). */
|
|
160
|
+
withShader(shader: Shader, fn: () => void): void;
|
|
161
|
+
/** Free a target's GPU memory. Drawing it afterwards recreates it, blank. */
|
|
162
|
+
disposeTarget(target: RenderTarget): void;
|
|
163
|
+
/** True while the WebGL context is lost (e.g. a backgrounded mobile tab): frames draw nothing until it's restored. */
|
|
164
|
+
get contextLost(): boolean;
|
|
165
|
+
/** Re-upload a source whose pixels changed (e.g. a canvas you draw into). */
|
|
166
|
+
invalidate(src: TextureSource): void;
|
|
167
|
+
/** @internal */
|
|
168
|
+
renderScale: number;
|
|
169
|
+
/** @internal */
|
|
170
|
+
begin(clear: Color, width: number, height: number, scale: number): void;
|
|
171
|
+
/** @internal Reset transform and blend between scene and afterRender hooks. */
|
|
172
|
+
reset(): void;
|
|
173
|
+
/** @internal */
|
|
174
|
+
end(): void;
|
|
175
|
+
/** @internal Release GPU resources and listeners. */
|
|
176
|
+
dispose(): void;
|
|
177
|
+
/** @internal */
|
|
178
|
+
resize(w: number, h: number): void;
|
|
179
|
+
/** @internal Switch to a backend that finished loading (the Canvas 2D fallback), at the current size. */
|
|
180
|
+
setBackend(backend: Backend): void;
|
|
181
|
+
/** tmp = current matrix × (translate(x, y) · scale(w, h)): maps the unit square to the rect. */
|
|
182
|
+
private local;
|
|
183
|
+
private wholeImage;
|
|
184
|
+
private defaultFont;
|
|
185
|
+
private withAlpha;
|
|
186
|
+
private circle64;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=draw.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draw.d.ts","sourceRoot":"","sources":["../src/draw.ts"],"names":[],"mappings":"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"}
|