@vpmedia/phaser 1.113.0 → 1.115.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/dist/index.js +402 -379
- package/dist/index.js.map +1 -1
- package/dist/phaser/core/animation_manager.d.ts +2 -1
- package/dist/phaser/core/animation_manager.d.ts.map +1 -1
- package/dist/phaser/core/array_set.d.ts +1 -1
- package/dist/phaser/core/array_set.d.ts.map +1 -1
- package/dist/phaser/core/cache.d.ts +1 -1
- package/dist/phaser/core/cache.d.ts.map +1 -1
- package/dist/phaser/core/factory.d.ts +1 -1
- package/dist/phaser/core/factory.d.ts.map +1 -1
- package/dist/phaser/core/game.d.ts +2 -0
- package/dist/phaser/core/game.d.ts.map +1 -1
- package/dist/phaser/core/input.d.ts +5 -5
- package/dist/phaser/core/input.d.ts.map +1 -1
- package/dist/phaser/core/input_event.d.ts +35 -0
- package/dist/phaser/core/input_event.d.ts.map +1 -0
- package/dist/phaser/core/input_handler.d.ts +2 -2
- package/dist/phaser/core/input_handler.d.ts.map +1 -1
- package/dist/phaser/core/input_mouse.d.ts +27 -26
- package/dist/phaser/core/input_mouse.d.ts.map +1 -1
- package/dist/phaser/core/input_mspointer.d.ts +16 -15
- package/dist/phaser/core/input_mspointer.d.ts.map +1 -1
- package/dist/phaser/core/input_pointer.d.ts +9 -8
- package/dist/phaser/core/input_pointer.d.ts.map +1 -1
- package/dist/phaser/core/input_touch.d.ts +18 -17
- package/dist/phaser/core/input_touch.d.ts.map +1 -1
- package/dist/phaser/core/loader.d.ts +64 -30
- package/dist/phaser/core/loader.d.ts.map +1 -1
- package/dist/phaser/core/scale_manager.d.ts +1 -1
- package/dist/phaser/core/scale_manager.d.ts.map +1 -1
- package/dist/phaser/core/scene_manager.d.ts +14 -4
- package/dist/phaser/core/scene_manager.d.ts.map +1 -1
- package/dist/phaser/core/signal.d.ts +8 -8
- package/dist/phaser/core/signal.d.ts.map +1 -1
- package/dist/phaser/core/signal_binding.d.ts +2 -2
- package/dist/phaser/core/signal_binding.d.ts.map +1 -1
- package/dist/phaser/core/sound.d.ts +1 -1
- package/dist/phaser/core/sound.d.ts.map +1 -1
- package/dist/phaser/core/sound_manager.d.ts +3 -3
- package/dist/phaser/core/sound_manager.d.ts.map +1 -1
- package/dist/phaser/core/sound_sprite.d.ts +1 -1
- package/dist/phaser/core/sound_sprite.d.ts.map +1 -1
- package/dist/phaser/core/timer.d.ts +5 -5
- package/dist/phaser/core/timer.d.ts.map +1 -1
- package/dist/phaser/core/timer_event.d.ts +2 -2
- package/dist/phaser/core/timer_event.d.ts.map +1 -1
- package/dist/phaser/core/tween.d.ts +4 -4
- package/dist/phaser/core/tween.d.ts.map +1 -1
- package/dist/phaser/core/tween_data.d.ts +2 -1
- package/dist/phaser/core/tween_data.d.ts.map +1 -1
- package/dist/phaser/core/tween_manager.d.ts +1 -1
- package/dist/phaser/core/tween_manager.d.ts.map +1 -1
- package/dist/phaser/display/button.d.ts +1 -1
- package/dist/phaser/display/button.d.ts.map +1 -1
- package/dist/phaser/display/canvas/buffer.d.ts +3 -3
- package/dist/phaser/display/canvas/buffer.d.ts.map +1 -1
- package/dist/phaser/display/canvas/graphics.d.ts +2 -2
- package/dist/phaser/display/canvas/graphics.d.ts.map +1 -1
- package/dist/phaser/display/canvas/masker.d.ts +5 -2
- package/dist/phaser/display/canvas/masker.d.ts.map +1 -1
- package/dist/phaser/display/canvas/renderer.d.ts +6 -5
- package/dist/phaser/display/canvas/renderer.d.ts.map +1 -1
- package/dist/phaser/display/canvas/tinter.d.ts +2 -1
- package/dist/phaser/display/canvas/tinter.d.ts.map +1 -1
- package/dist/phaser/display/canvas/util.d.ts +11 -4
- package/dist/phaser/display/canvas/util.d.ts.map +1 -1
- package/dist/phaser/display/display_object.d.ts +4 -3
- package/dist/phaser/display/display_object.d.ts.map +1 -1
- package/dist/phaser/display/graphics.d.ts +47 -27
- package/dist/phaser/display/graphics.d.ts.map +1 -1
- package/dist/phaser/display/graphics_data.d.ts +20 -11
- package/dist/phaser/display/graphics_data.d.ts.map +1 -1
- package/dist/phaser/display/image.d.ts +4 -3
- package/dist/phaser/display/image.d.ts.map +1 -1
- package/dist/phaser/display/render_session.d.ts +44 -0
- package/dist/phaser/display/render_session.d.ts.map +1 -0
- package/dist/phaser/display/sprite_util.d.ts +4 -3
- package/dist/phaser/display/sprite_util.d.ts.map +1 -1
- package/dist/phaser/display/text.d.ts +65 -31
- package/dist/phaser/display/text.d.ts.map +1 -1
- package/dist/phaser/display/webgl/base_texture.d.ts +3 -3
- package/dist/phaser/display/webgl/base_texture.d.ts.map +1 -1
- package/dist/phaser/display/webgl/earcut.d.ts +25 -25
- package/dist/phaser/display/webgl/earcut.d.ts.map +1 -1
- package/dist/phaser/display/webgl/earcut_node.d.ts +2 -2
- package/dist/phaser/display/webgl/earcut_node.d.ts.map +1 -1
- package/dist/phaser/display/webgl/fast_sprite_batch.d.ts +3 -2
- package/dist/phaser/display/webgl/fast_sprite_batch.d.ts.map +1 -1
- package/dist/phaser/display/webgl/filter_manager.d.ts +1 -1
- package/dist/phaser/display/webgl/filter_manager.d.ts.map +1 -1
- package/dist/phaser/display/webgl/graphics.d.ts +2 -1
- package/dist/phaser/display/webgl/graphics.d.ts.map +1 -1
- package/dist/phaser/display/webgl/graphics_data.d.ts +9 -9
- package/dist/phaser/display/webgl/graphics_data.d.ts.map +1 -1
- package/dist/phaser/display/webgl/mask_manager.d.ts +3 -2
- package/dist/phaser/display/webgl/mask_manager.d.ts.map +1 -1
- package/dist/phaser/display/webgl/render_texture.d.ts +3 -3
- package/dist/phaser/display/webgl/render_texture.d.ts.map +1 -1
- package/dist/phaser/display/webgl/renderer.d.ts +5 -4
- package/dist/phaser/display/webgl/renderer.d.ts.map +1 -1
- package/dist/phaser/display/webgl/shader/normal.d.ts +3 -1
- package/dist/phaser/display/webgl/shader/normal.d.ts.map +1 -1
- package/dist/phaser/display/webgl/shader_manager.d.ts +10 -4
- package/dist/phaser/display/webgl/shader_manager.d.ts.map +1 -1
- package/dist/phaser/display/webgl/sprite_batch.d.ts +4 -3
- package/dist/phaser/display/webgl/sprite_batch.d.ts.map +1 -1
- package/dist/phaser/display/webgl/stencil_manager.d.ts +4 -3
- package/dist/phaser/display/webgl/stencil_manager.d.ts.map +1 -1
- package/dist/phaser/display/webgl/texture.d.ts +6 -6
- package/dist/phaser/display/webgl/texture.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/phaser/core/animation_manager.ts +2 -2
- package/src/phaser/core/array_set.ts +1 -1
- package/src/phaser/core/cache.ts +1 -1
- package/src/phaser/core/factory.ts +1 -1
- package/src/phaser/core/game.ts +2 -0
- package/src/phaser/core/input.ts +7 -6
- package/src/phaser/core/input_event.ts +34 -0
- package/src/phaser/core/input_handler.ts +2 -11
- package/src/phaser/core/input_mouse.ts +53 -36
- package/src/phaser/core/input_mspointer.ts +54 -29
- package/src/phaser/core/input_pointer.test.ts +149 -0
- package/src/phaser/core/input_pointer.ts +20 -21
- package/src/phaser/core/input_touch.ts +48 -31
- package/src/phaser/core/loader.test.ts +139 -0
- package/src/phaser/core/loader.ts +146 -83
- package/src/phaser/core/scale_manager.ts +1 -1
- package/src/phaser/core/scene_manager.ts +16 -8
- package/src/phaser/core/signal.ts +8 -8
- package/src/phaser/core/signal_binding.ts +2 -2
- package/src/phaser/core/sound.ts +4 -4
- package/src/phaser/core/sound_manager.ts +17 -19
- package/src/phaser/core/sound_sprite.ts +2 -2
- package/src/phaser/core/timer.ts +6 -6
- package/src/phaser/core/timer_event.ts +2 -2
- package/src/phaser/core/tween.ts +6 -6
- package/src/phaser/core/tween_data.ts +2 -1
- package/src/phaser/core/tween_manager.ts +1 -1
- package/src/phaser/display/button.ts +1 -1
- package/src/phaser/display/canvas/buffer.ts +3 -3
- package/src/phaser/display/canvas/graphics.ts +24 -20
- package/src/phaser/display/canvas/masker.ts +5 -2
- package/src/phaser/display/canvas/renderer.ts +10 -11
- package/src/phaser/display/canvas/tinter.ts +4 -3
- package/src/phaser/display/canvas/util.ts +15 -5
- package/src/phaser/display/display_object.ts +6 -5
- package/src/phaser/display/graphics.test.ts +122 -0
- package/src/phaser/display/graphics.ts +73 -64
- package/src/phaser/display/graphics_data.ts +22 -12
- package/src/phaser/display/image.ts +4 -3
- package/src/phaser/display/render_session.ts +45 -0
- package/src/phaser/display/sprite_util.ts +10 -8
- package/src/phaser/display/text.test.ts +136 -0
- package/src/phaser/display/text.ts +183 -119
- package/src/phaser/display/webgl/base_texture.ts +3 -3
- package/src/phaser/display/webgl/earcut.test.ts +132 -0
- package/src/phaser/display/webgl/earcut.ts +84 -74
- package/src/phaser/display/webgl/earcut_node.ts +5 -5
- package/src/phaser/display/webgl/fast_sprite_batch.ts +4 -4
- package/src/phaser/display/webgl/filter_manager.ts +1 -1
- package/src/phaser/display/webgl/graphics.ts +26 -17
- package/src/phaser/display/webgl/graphics_data.ts +9 -9
- package/src/phaser/display/webgl/mask_manager.ts +3 -2
- package/src/phaser/display/webgl/render_texture.ts +3 -3
- package/src/phaser/display/webgl/renderer.ts +7 -6
- package/src/phaser/display/webgl/shader/normal.ts +23 -6
- package/src/phaser/display/webgl/shader_manager.ts +15 -6
- package/src/phaser/display/webgl/sprite_batch.ts +4 -3
- package/src/phaser/display/webgl/stencil_manager.ts +10 -3
- package/src/phaser/display/webgl/texture.ts +6 -6
|
@@ -4,6 +4,8 @@ import { getTintedTexture } from './canvas/tinter.js';
|
|
|
4
4
|
import type { Image } from './image.js';
|
|
5
5
|
import type { Texture } from './webgl/texture.js';
|
|
6
6
|
import type { Matrix } from '../geom/matrix.js';
|
|
7
|
+
import type { RenderSession } from './render_session.js';
|
|
8
|
+
import { setSmoothing } from './canvas/util.js';
|
|
7
9
|
|
|
8
10
|
/**
|
|
9
11
|
* Sets the texture of a sprite.
|
|
@@ -27,7 +29,7 @@ export const setTexture = (target: Image, texture: Texture, destroyBase = false)
|
|
|
27
29
|
* @param {object} matrix - The transformation matrix.
|
|
28
30
|
* @returns {Rectangle} The bounds rectangle.
|
|
29
31
|
*/
|
|
30
|
-
export const getBounds = (target: Image, matrix:
|
|
32
|
+
export const getBounds = (target: Image, matrix: Matrix | null = null) => {
|
|
31
33
|
// TODO verify
|
|
32
34
|
if (target.currentBounds) {
|
|
33
35
|
return target.currentBounds;
|
|
@@ -129,7 +131,7 @@ export const getLocalBounds = (target: Image) => {
|
|
|
129
131
|
* @param {object} renderSession - The render session object.
|
|
130
132
|
* @param {Matrix | null | undefined} matrix - The transformation matrix.
|
|
131
133
|
*/
|
|
132
|
-
export const renderWebGL = (target: Image, renderSession:
|
|
134
|
+
export const renderWebGL = (target: Image, renderSession: RenderSession, matrix: Matrix | null | undefined = null) => {
|
|
133
135
|
// if the sprite is not visible or the alpha is 0 then no need to render this element
|
|
134
136
|
if (!target.visible || target.alpha <= 0 || !target.renderable) {
|
|
135
137
|
return;
|
|
@@ -149,7 +151,7 @@ export const renderWebGL = (target: Image, renderSession: any, matrix: Matrix |
|
|
|
149
151
|
}
|
|
150
152
|
if (target._mask) {
|
|
151
153
|
spriteBatch.stop();
|
|
152
|
-
renderSession.maskManager.pushMask(target.mask
|
|
154
|
+
renderSession.maskManager.pushMask(target.mask!, renderSession);
|
|
153
155
|
spriteBatch.start();
|
|
154
156
|
}
|
|
155
157
|
// add this sprite to the batch
|
|
@@ -182,7 +184,7 @@ export const renderWebGL = (target: Image, renderSession: any, matrix: Matrix |
|
|
|
182
184
|
* @param {object} renderSession - The render session object.
|
|
183
185
|
* @param {Matrix | null | undefined} matrix - The transformation matrix.
|
|
184
186
|
*/
|
|
185
|
-
export const renderCanvas = (target: Image, renderSession:
|
|
187
|
+
export const renderCanvas = (target: Image, renderSession: RenderSession, matrix: Matrix | null | undefined = null) => {
|
|
186
188
|
// If the sprite is not visible or the alpha is 0 then no need to render this element
|
|
187
189
|
if (
|
|
188
190
|
!target.visible ||
|
|
@@ -201,7 +203,7 @@ export const renderCanvas = (target: Image, renderSession: any, matrix: Matrix |
|
|
|
201
203
|
if (target.blendMode !== renderSession.currentBlendMode) {
|
|
202
204
|
renderSession.currentBlendMode = target.blendMode;
|
|
203
205
|
renderSession.context.globalCompositeOperation =
|
|
204
|
-
globalThis.PhaserRegistry.blendModesCanvas[renderSession.currentBlendMode];
|
|
206
|
+
globalThis.PhaserRegistry.blendModesCanvas[renderSession.currentBlendMode] ?? 'source-over';
|
|
205
207
|
}
|
|
206
208
|
if (target._mask) {
|
|
207
209
|
renderSession.maskManager.pushMask(target._mask, renderSession);
|
|
@@ -214,7 +216,7 @@ export const renderCanvas = (target: Image, renderSession: any, matrix: Matrix |
|
|
|
214
216
|
// If smoothingEnabled is supported and we need to change the smoothing property for this texture
|
|
215
217
|
if (renderSession.smoothProperty && renderSession.scaleMode !== target.texture.baseTexture.scaleMode) {
|
|
216
218
|
renderSession.scaleMode = target.texture.baseTexture.scaleMode;
|
|
217
|
-
renderSession.context
|
|
219
|
+
setSmoothing(renderSession.context, renderSession.smoothProperty, renderSession.scaleMode === SCALE_LINEAR);
|
|
218
220
|
}
|
|
219
221
|
// If the texture is trimmed we offset by the trim x/y, otherwise we use the frame dimensions
|
|
220
222
|
let dx = target.texture.trim
|
|
@@ -238,7 +240,7 @@ export const renderCanvas = (target: Image, renderSession: any, matrix: Matrix |
|
|
|
238
240
|
dx /= resolution;
|
|
239
241
|
dy /= resolution;
|
|
240
242
|
if (target.tint !== 0xffffff) {
|
|
241
|
-
if (target.texture.requiresReTint || target.cachedTint !== target.tint) {
|
|
243
|
+
if (target.texture.requiresReTint || target.cachedTint !== target.tint || !target.tintedTexture) {
|
|
242
244
|
target.tintedTexture = getTintedTexture(target, target.tint);
|
|
243
245
|
target.cachedTint = target.tint;
|
|
244
246
|
target.texture.requiresReTint = false;
|
|
@@ -267,6 +269,6 @@ export const renderCanvas = (target: Image, renderSession: any, matrix: Matrix |
|
|
|
267
269
|
child.renderCanvas(renderSession);
|
|
268
270
|
}
|
|
269
271
|
if (target._mask) {
|
|
270
|
-
renderSession.maskManager.popMask(renderSession);
|
|
272
|
+
renderSession.maskManager.popMask(target._mask, renderSession);
|
|
271
273
|
}
|
|
272
274
|
};
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import type { Game } from '../core/game.js';
|
|
3
|
+
import { getRegistry } from '../core/registry.js';
|
|
4
|
+
import { Text } from './text.js';
|
|
5
|
+
import { textureFromCanvas } from './webgl/texture_util.js';
|
|
6
|
+
|
|
7
|
+
// happy-dom has no 2D canvas implementation, so Text cannot be constructed without one. This is the
|
|
8
|
+
// smallest surface updateText() touches.
|
|
9
|
+
const createContext2D = (): CanvasRenderingContext2D =>
|
|
10
|
+
({
|
|
11
|
+
font: '',
|
|
12
|
+
fillStyle: '',
|
|
13
|
+
strokeStyle: '',
|
|
14
|
+
textBaseline: '',
|
|
15
|
+
lineWidth: 0,
|
|
16
|
+
lineJoin: '',
|
|
17
|
+
globalAlpha: 1,
|
|
18
|
+
measureText: (value: string) => ({
|
|
19
|
+
width: value.length * 8,
|
|
20
|
+
actualBoundingBoxAscent: 8,
|
|
21
|
+
actualBoundingBoxDescent: 2,
|
|
22
|
+
}),
|
|
23
|
+
clearRect: vi.fn(),
|
|
24
|
+
fillRect: vi.fn(),
|
|
25
|
+
fillText: vi.fn(),
|
|
26
|
+
strokeText: vi.fn(),
|
|
27
|
+
save: vi.fn(),
|
|
28
|
+
restore: vi.fn(),
|
|
29
|
+
scale: vi.fn(),
|
|
30
|
+
translate: vi.fn(),
|
|
31
|
+
setTransform: vi.fn(),
|
|
32
|
+
getImageData: () => ({ data: new Uint8ClampedArray(4) }),
|
|
33
|
+
putImageData: vi.fn(),
|
|
34
|
+
}) as unknown as CanvasRenderingContext2D;
|
|
35
|
+
|
|
36
|
+
const createGame = (): Game =>
|
|
37
|
+
({
|
|
38
|
+
renderer: { resolution: 1 },
|
|
39
|
+
cache: { getImage: () => null },
|
|
40
|
+
add: { existing: (child: unknown) => child },
|
|
41
|
+
}) as unknown as Game;
|
|
42
|
+
|
|
43
|
+
const createText = (value: string | number): Text => new Text(createGame(), 0, 0, value);
|
|
44
|
+
|
|
45
|
+
describe('Text', () => {
|
|
46
|
+
const originalGetContext = HTMLCanvasElement.prototype.getContext;
|
|
47
|
+
|
|
48
|
+
beforeAll(() => {
|
|
49
|
+
HTMLCanvasElement.prototype.getContext = function getContext(this: HTMLCanvasElement, id: string) {
|
|
50
|
+
return id === '2d' ? createContext2D() : null;
|
|
51
|
+
} as typeof HTMLCanvasElement.prototype.getContext;
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
getRegistry().CACHE_MISSING_IMAGE = textureFromCanvas(document.createElement('canvas'));
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
afterAll(() => {
|
|
59
|
+
HTMLCanvasElement.prototype.getContext = originalGetContext;
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
describe('constructor', () => {
|
|
63
|
+
it('keeps a string as-is', () => {
|
|
64
|
+
expect(createText('hello').text).toBe('hello');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Callers pass numbers straight into game.add.text(). The constructor must coerce:
|
|
68
|
+
// updateText() calls .split() on the value, which throws on a number.
|
|
69
|
+
it('coerces a number to its string form', () => {
|
|
70
|
+
expect(createText(42).text).toBe('42');
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('coerces zero rather than falling back to the empty string', () => {
|
|
74
|
+
expect(createText(0).text).toBe('0');
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('coerces a negative number', () => {
|
|
78
|
+
expect(createText(-7).text).toBe('-7');
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it('defaults to the empty string', () => {
|
|
82
|
+
expect(new Text(createGame(), 0, 0).text).toBe('');
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('renders a numeric label without throwing', () => {
|
|
86
|
+
expect(() => createText(2026)).not.toThrow();
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
describe('text setter', () => {
|
|
91
|
+
it('coerces a number assigned after construction', () => {
|
|
92
|
+
const text = createText('start');
|
|
93
|
+
text.text = 99;
|
|
94
|
+
expect(text.text).toBe('99');
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
describe('fontSize', () => {
|
|
99
|
+
// A px-suffixed size cannot be read with Number(); it yields NaN. An autofix made exactly that
|
|
100
|
+
// substitution once already.
|
|
101
|
+
it('reads a px size back as a number', () => {
|
|
102
|
+
const text = new Text(createGame(), 0, 0, 'hello', { font: '20px Arial' });
|
|
103
|
+
expect(text.fontSize).toBe(20);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('round trips through the setter', () => {
|
|
107
|
+
const text = createText('hello');
|
|
108
|
+
text.fontSize = 32;
|
|
109
|
+
expect(text.fontSize).toBe(32);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('reads zero back as zero', () => {
|
|
113
|
+
const text = createText('hello');
|
|
114
|
+
text.fontSize = 0;
|
|
115
|
+
expect(text.fontSize).toBe(0);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('never reports NaN for a styled font', () => {
|
|
119
|
+
const text = new Text(createGame(), 0, 0, 'hello', { font: 'bold 14px Arial' });
|
|
120
|
+
expect(Number.isNaN(text.fontSize)).toBe(false);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
describe('setText', () => {
|
|
125
|
+
it('coerces a number', () => {
|
|
126
|
+
const text = createText('start');
|
|
127
|
+
text.setText(123);
|
|
128
|
+
expect(text.text).toBe('123');
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('returns itself for chaining', () => {
|
|
132
|
+
const text = createText('start');
|
|
133
|
+
expect(text.setText('next')).toBe(text);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
});
|