@flighthq/image 0.3.1-next.425.a3192ab → 0.3.1-next.509.c235802
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/imageResourceReference.d.ts +2 -0
- package/dist/imageResourceReference.d.ts.map +1 -1
- package/dist/imageResourceReference.js +26 -1
- package/dist/imageResourceReference.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/imageResourceReference.test.ts +100 -2
|
@@ -2,6 +2,8 @@ import type { AlphaType, EmbeddedImageResourceReference, ExternalImageResourceRe
|
|
|
2
2
|
export declare function createEmbeddedImageResourceReference(bytes: Uint8Array, mimeType?: string | null, alphaType?: AlphaType): EmbeddedImageResourceReference;
|
|
3
3
|
export declare function createExternalImageResourceReference(uri: string, basePath?: string | null): ExternalImageResourceReference;
|
|
4
4
|
export declare function createImageResourceFailure(cause: unknown): ImageResourceFailure;
|
|
5
|
+
export declare function disableImageBitmapComposition(): void;
|
|
6
|
+
export declare function enableImageBitmapComposition(): void;
|
|
5
7
|
export declare function explainImageResourceReferenceResolution(ref: Readonly<ImageResourceReference>): ImageResourceReferenceResolutionExplanation;
|
|
6
8
|
export declare function resetFailedImageResourceReference(ref: ImageResourceReference): boolean;
|
|
7
9
|
export declare function resolveImageResourceReference(ref: ImageResourceReference, fetch: ImageResourceFetch, signal: AbortSignal): Promise<TextureSource | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"imageResourceReference.d.ts","sourceRoot":"","sources":["../src/imageResourceReference.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EAET,8BAA8B,EAE9B,8BAA8B,EAC9B,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACtB,2CAA2C,EAC3C,aAAa,EACd,MAAM,0BAA0B,CAAC;AAWlC,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,UAAU,EACjB,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,SAAS,GAAE,SAAsB,GAChC,8BAA8B,CAUhC;
|
|
1
|
+
{"version":3,"file":"imageResourceReference.d.ts","sourceRoot":"","sources":["../src/imageResourceReference.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EAET,8BAA8B,EAE9B,8BAA8B,EAC9B,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACtB,2CAA2C,EAC3C,aAAa,EACd,MAAM,0BAA0B,CAAC;AAWlC,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,UAAU,EACjB,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,SAAS,GAAE,SAAsB,GAChC,8BAA8B,CAUhC;AAgCD,wBAAgB,oCAAoC,CAClD,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAM,GAAG,IAAW,GAC7B,8BAA8B,CAUhC;AAID,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAK/E;AAwBD,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD;AAKD,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAID,wBAAgB,uCAAuC,CACrD,GAAG,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GACpC,2CAA2C,CAO7C;AAID,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAKtF;AAUD,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,sBAAsB,EAC3B,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAwB/B"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createEntity } from '@flighthq/entity/contract';
|
|
2
|
-
import { decodeImage, decodeImagePremultiplied } from '@flighthq/image-codec/contract';
|
|
2
|
+
import { decodeImage, decodeImagePremultiplied, getImageBitmapComposer } from '@flighthq/image-codec/contract';
|
|
3
3
|
import { BitmapTextureSourceKind, ImageResourceFailureKind, ImageResourceReferenceKind, ResourceResolutionState, } from '@flighthq/types/contract';
|
|
4
4
|
// `bytes` is retained as the view the container handed over, not a copy: a parser carves an image payload
|
|
5
5
|
// out of its source and the reference borrows it, so a document that never resolves an image never pays for
|
|
@@ -20,6 +20,9 @@ export function createEmbeddedImageResourceReference(bytes, mimeType = null, alp
|
|
|
20
20
|
// dispatch by kind. The reference's alpha request is carried onto the source verbatim, so bytes that
|
|
21
21
|
// are already premultiplied never get multiplied a second time at renderer upload.
|
|
22
22
|
async function decodeEmbeddedImageResourceReference(ref, signal) {
|
|
23
|
+
if (ref.bitmapComposition !== undefined && _resolveImageBitmapComposition !== null) {
|
|
24
|
+
return _resolveImageBitmapComposition(ref, signal);
|
|
25
|
+
}
|
|
23
26
|
signal.throwIfAborted();
|
|
24
27
|
const decoded = await (ref.alphaType === 'premultiplied'
|
|
25
28
|
? decodeImagePremultiplied(ref.bytes, ref.mimeType ?? undefined)
|
|
@@ -58,6 +61,28 @@ export function createImageResourceFailure(cause) {
|
|
|
58
61
|
}
|
|
59
62
|
return { kind: ImageResourceFailureKind.Error, message: String(cause), name: null };
|
|
60
63
|
}
|
|
64
|
+
async function resolveImageBitmapComposition(ref, signal) {
|
|
65
|
+
signal.throwIfAborted();
|
|
66
|
+
const composition = ref.bitmapComposition;
|
|
67
|
+
const composer = getImageBitmapComposer(composition.kind);
|
|
68
|
+
if (composer === null)
|
|
69
|
+
return null;
|
|
70
|
+
// A composer always receives straight decoded pixels. It may also own a raw raster with no MIME
|
|
71
|
+
// decoder, in which case decoded is null and its plain payload is the complete input.
|
|
72
|
+
const decoded = await decodeImage(ref.bytes, ref.mimeType ?? undefined);
|
|
73
|
+
signal.throwIfAborted();
|
|
74
|
+
return composer(decoded, composition.payload);
|
|
75
|
+
}
|
|
76
|
+
let _resolveImageBitmapComposition = null;
|
|
77
|
+
export function disableImageBitmapComposition() {
|
|
78
|
+
_resolveImageBitmapComposition = null;
|
|
79
|
+
}
|
|
80
|
+
// Installs the optional decoded-pixel join without making an ordinary embedded-image consumer retain
|
|
81
|
+
// its registry lookup or straight-decode branch. A format package calls this beside its composer
|
|
82
|
+
// registrations; until then the nullable hook leaves the original hot path byte-for-byte tree-shakable.
|
|
83
|
+
export function enableImageBitmapComposition() {
|
|
84
|
+
_resolveImageBitmapComposition = resolveImageBitmapComposition;
|
|
85
|
+
}
|
|
61
86
|
// Returns a detached plain-data explanation suitable for logs, tools, and serialization. It never throws
|
|
62
87
|
// and exposes no resolver runtime or raw thrown value.
|
|
63
88
|
export function explainImageResourceReferenceResolution(ref) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"imageResourceReference.js","sourceRoot":"","sources":["../src/imageResourceReference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"imageResourceReference.js","sourceRoot":"","sources":["../src/imageResourceReference.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { cloneImageResource, createCompressedImage, createEmbeddedImageResourceReference, createExternalImageResourceReference, createImageResource, createImageResourceFailure, createImageResourceFromBitmap, createImageResourceFromCanvas, createImageResourceFromImageBitmap, createImageResourceFromImageElement, explainImageResourceReferenceResolution, isImageResourceEmpty, isImageUrlSameOrigin, loadImageResourceFromBase64, loadImageResourceFromBlob, loadImageResourceFromBytes, loadImageResourceFromUrl, resetFailedImageResourceReference, resolveImageResourceReference, } from './contract';
|
|
1
|
+
export { cloneImageResource, createCompressedImage, createEmbeddedImageResourceReference, createExternalImageResourceReference, createImageResource, createImageResourceFailure, createImageResourceFromBitmap, createImageResourceFromCanvas, createImageResourceFromImageBitmap, createImageResourceFromImageElement, disableImageBitmapComposition, enableImageBitmapComposition, explainImageResourceReferenceResolution, isImageResourceEmpty, isImageUrlSameOrigin, loadImageResourceFromBase64, loadImageResourceFromBlob, loadImageResourceFromBytes, loadImageResourceFromUrl, resetFailedImageResourceReference, resolveImageResourceReference, } from './contract';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,oCAAoC,EACpC,oCAAoC,EACpC,mBAAmB,EACnB,0BAA0B,EAC1B,6BAA6B,EAC7B,6BAA6B,EAC7B,kCAAkC,EAClC,mCAAmC,EACnC,uCAAuC,EACvC,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,EACzB,0BAA0B,EAC1B,wBAAwB,EACxB,iCAAiC,EACjC,6BAA6B,GAC9B,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,oCAAoC,EACpC,oCAAoC,EACpC,mBAAmB,EACnB,0BAA0B,EAC1B,6BAA6B,EAC7B,6BAA6B,EAC7B,kCAAkC,EAClC,mCAAmC,EACnC,6BAA6B,EAC7B,4BAA4B,EAC5B,uCAAuC,EACvC,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,EACzB,0BAA0B,EAC1B,wBAAwB,EACxB,iCAAiC,EACjC,6BAA6B,GAC9B,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { cloneImageResource, createCompressedImage, createEmbeddedImageResourceReference, createExternalImageResourceReference, createImageResource, createImageResourceFailure, createImageResourceFromBitmap, createImageResourceFromCanvas, createImageResourceFromImageBitmap, createImageResourceFromImageElement, explainImageResourceReferenceResolution, isImageResourceEmpty, isImageUrlSameOrigin, loadImageResourceFromBase64, loadImageResourceFromBlob, loadImageResourceFromBytes, loadImageResourceFromUrl, resetFailedImageResourceReference, resolveImageResourceReference, } from './contract';
|
|
1
|
+
export { cloneImageResource, createCompressedImage, createEmbeddedImageResourceReference, createExternalImageResourceReference, createImageResource, createImageResourceFailure, createImageResourceFromBitmap, createImageResourceFromCanvas, createImageResourceFromImageBitmap, createImageResourceFromImageElement, disableImageBitmapComposition, enableImageBitmapComposition, explainImageResourceReferenceResolution, isImageResourceEmpty, isImageUrlSameOrigin, loadImageResourceFromBase64, loadImageResourceFromBlob, loadImageResourceFromBytes, loadImageResourceFromUrl, resetFailedImageResourceReference, resolveImageResourceReference, } from './contract';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,oCAAoC,EACpC,oCAAoC,EACpC,mBAAmB,EACnB,0BAA0B,EAC1B,6BAA6B,EAC7B,6BAA6B,EAC7B,kCAAkC,EAClC,mCAAmC,EACnC,uCAAuC,EACvC,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,EACzB,0BAA0B,EAC1B,wBAAwB,EACxB,iCAAiC,EACjC,6BAA6B,GAC9B,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,oCAAoC,EACpC,oCAAoC,EACpC,mBAAmB,EACnB,0BAA0B,EAC1B,6BAA6B,EAC7B,6BAA6B,EAC7B,kCAAkC,EAClC,mCAAmC,EACnC,6BAA6B,EAC7B,4BAA4B,EAC5B,uCAAuC,EACvC,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,EACzB,0BAA0B,EAC1B,wBAAwB,EACxB,iCAAiC,EACjC,6BAA6B,GAC9B,MAAM,YAAY,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/image",
|
|
3
|
-
"version": "0.3.1-next.
|
|
3
|
+
"version": "0.3.1-next.509.c235802",
|
|
4
4
|
"author": "Joshua Granick and other contributors",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,9 +38,9 @@
|
|
|
38
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@flighthq/entity": "0.3.1-next.
|
|
42
|
-
"@flighthq/image-codec": "0.3.1-next.
|
|
43
|
-
"@flighthq/types": "0.3.1-next.
|
|
41
|
+
"@flighthq/entity": "0.3.1-next.509.c235802",
|
|
42
|
+
"@flighthq/image-codec": "0.3.1-next.509.c235802",
|
|
43
|
+
"@flighthq/types": "0.3.1-next.509.c235802"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"typescript": "^5.3.0"
|
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
1
|
+
import { createEntity } from '@flighthq/entity/contract';
|
|
2
|
+
import {
|
|
3
|
+
clearImageBitmapComposers,
|
|
4
|
+
clearImageDecoders,
|
|
5
|
+
registerImageBitmapComposer,
|
|
6
|
+
registerImageDecoder,
|
|
7
|
+
} from '@flighthq/image-codec/contract';
|
|
8
|
+
import type { Bitmap, Image, ImageDecoder } from '@flighthq/types/contract';
|
|
3
9
|
import {
|
|
4
10
|
BitmapTextureSourceKind,
|
|
5
11
|
EntityRuntimeKey,
|
|
@@ -11,6 +17,8 @@ import {
|
|
|
11
17
|
createEmbeddedImageResourceReference,
|
|
12
18
|
createExternalImageResourceReference,
|
|
13
19
|
createImageResourceFailure,
|
|
20
|
+
disableImageBitmapComposition,
|
|
21
|
+
enableImageBitmapComposition,
|
|
14
22
|
explainImageResourceReferenceResolution,
|
|
15
23
|
resetFailedImageResourceReference,
|
|
16
24
|
resolveImageResourceReference,
|
|
@@ -28,6 +36,8 @@ beforeEach(() => {
|
|
|
28
36
|
});
|
|
29
37
|
|
|
30
38
|
afterEach(() => {
|
|
39
|
+
disableImageBitmapComposition();
|
|
40
|
+
clearImageBitmapComposers();
|
|
31
41
|
clearImageDecoders();
|
|
32
42
|
});
|
|
33
43
|
|
|
@@ -79,6 +89,37 @@ describe('createImageResourceFailure', () => {
|
|
|
79
89
|
});
|
|
80
90
|
});
|
|
81
91
|
|
|
92
|
+
describe('disableImageBitmapComposition', () => {
|
|
93
|
+
it('restores the ordinary decoder path for a reference that carries composition data', async () => {
|
|
94
|
+
const composer = vi.fn().mockReturnValue(createTestBitmap('straight'));
|
|
95
|
+
registerImageBitmapComposer('acme/alpha-plane', composer);
|
|
96
|
+
enableImageBitmapComposition();
|
|
97
|
+
disableImageBitmapComposition();
|
|
98
|
+
const ref = createEmbeddedImageResourceReference(new Uint8Array([1]), 'image/png');
|
|
99
|
+
ref.bitmapComposition = { kind: 'acme/alpha-plane', payload: new Uint8Array([7]) };
|
|
100
|
+
|
|
101
|
+
const source = await resolveImageResourceReference(ref, unusedFetch, new AbortController().signal);
|
|
102
|
+
|
|
103
|
+
expect(composer).not.toHaveBeenCalled();
|
|
104
|
+
expect(decoder).toHaveBeenCalledWith(ref.bytes);
|
|
105
|
+
expect(source?.kind).toBe(BitmapTextureSourceKind);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
describe('enableImageBitmapComposition', () => {
|
|
110
|
+
it('installs the registered decoded-pixel composition route', async () => {
|
|
111
|
+
const bitmap = createTestBitmap('straight');
|
|
112
|
+
const composer = vi.fn().mockReturnValue(bitmap);
|
|
113
|
+
registerImageBitmapComposer('acme/alpha-plane', composer);
|
|
114
|
+
enableImageBitmapComposition();
|
|
115
|
+
const ref = createEmbeddedImageResourceReference(new Uint8Array([1]), 'image/png');
|
|
116
|
+
ref.bitmapComposition = { kind: 'acme/alpha-plane', payload: new Uint8Array([7]) };
|
|
117
|
+
|
|
118
|
+
expect(await resolveImageResourceReference(ref, unusedFetch, new AbortController().signal)).toBe(bitmap);
|
|
119
|
+
expect(composer).toHaveBeenCalledOnce();
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
|
|
82
123
|
describe('explainImageResourceReferenceResolution', () => {
|
|
83
124
|
it('detaches the failure so a caller cannot mutate the reference', () => {
|
|
84
125
|
const ref = createEmbeddedImageResourceReference(new Uint8Array(1));
|
|
@@ -141,6 +182,50 @@ describe('resolveImageResourceReference', () => {
|
|
|
141
182
|
expect(source?.alphaType).toBe('premultiplied');
|
|
142
183
|
});
|
|
143
184
|
|
|
185
|
+
it('hands straight decoded pixels and plain payload bytes to a registered Bitmap composer', async () => {
|
|
186
|
+
const payload = new Uint8Array([7, 8, 9]);
|
|
187
|
+
const bitmap = createTestBitmap('straight');
|
|
188
|
+
const composer = vi.fn().mockReturnValue(bitmap);
|
|
189
|
+
registerImageBitmapComposer('acme/alpha-plane', composer);
|
|
190
|
+
enableImageBitmapComposition();
|
|
191
|
+
const ref = createEmbeddedImageResourceReference(new Uint8Array([1]), 'image/png', 'premultiplied');
|
|
192
|
+
ref.bitmapComposition = { kind: 'acme/alpha-plane', payload };
|
|
193
|
+
|
|
194
|
+
const source = await resolveImageResourceReference(ref, unusedFetch, new AbortController().signal);
|
|
195
|
+
|
|
196
|
+
expect(decoder).toHaveBeenCalledWith(ref.bytes);
|
|
197
|
+
expect(composer).toHaveBeenCalledWith(
|
|
198
|
+
{ data: new Uint8ClampedArray([0x11, 0x22, 0x33, 0x44]), height: 1, width: 1 },
|
|
199
|
+
payload,
|
|
200
|
+
);
|
|
201
|
+
expect(source).toBe(bitmap);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
it('lets a registered raw-pixel producer return a Bitmap when no MIME decoder recognizes the bytes', async () => {
|
|
205
|
+
const bitmap = createTestBitmap('opaque');
|
|
206
|
+
const composer = vi.fn().mockReturnValue(bitmap);
|
|
207
|
+
registerImageBitmapComposer('acme/raw-raster', composer);
|
|
208
|
+
enableImageBitmapComposition();
|
|
209
|
+
const ref = createEmbeddedImageResourceReference(new Uint8Array([1]));
|
|
210
|
+
ref.bitmapComposition = { kind: 'acme/raw-raster', payload: ref.bytes };
|
|
211
|
+
|
|
212
|
+
const source = await resolveImageResourceReference(ref, unusedFetch, new AbortController().signal);
|
|
213
|
+
|
|
214
|
+
expect(composer).toHaveBeenCalledWith(null, ref.bytes);
|
|
215
|
+
expect(source).toBe(bitmap);
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it('reports an unavailable resource when its declared Bitmap composer is not registered', async () => {
|
|
219
|
+
enableImageBitmapComposition();
|
|
220
|
+
const ref = createEmbeddedImageResourceReference(new Uint8Array([1]));
|
|
221
|
+
ref.bitmapComposition = { kind: 'acme/missing', payload: ref.bytes };
|
|
222
|
+
|
|
223
|
+
expect(await resolveImageResourceReference(ref, unusedFetch, new AbortController().signal)).toBeNull();
|
|
224
|
+
expect(decoder).not.toHaveBeenCalled();
|
|
225
|
+
expect(ref.state).toBe(ResourceResolutionState.Failed);
|
|
226
|
+
expect(ref.failure?.kind).toBe(ImageResourceFailureKind.Unavailable);
|
|
227
|
+
});
|
|
228
|
+
|
|
144
229
|
it('routes an external reference through the fetch seam', async () => {
|
|
145
230
|
const ref = createExternalImageResourceReference('atlas.png', '/assets');
|
|
146
231
|
const fetched = { width: 2 } as Image;
|
|
@@ -187,3 +272,16 @@ describe('resolveImageResourceReference', () => {
|
|
|
187
272
|
expect(ref.state).toBe(ResourceResolutionState.Resolved);
|
|
188
273
|
});
|
|
189
274
|
});
|
|
275
|
+
|
|
276
|
+
function createTestBitmap(alphaType: Bitmap['alphaType']): Bitmap {
|
|
277
|
+
return createEntity({
|
|
278
|
+
alphaType,
|
|
279
|
+
data: new Uint8ClampedArray([0x11, 0x22, 0x33, 0x44]),
|
|
280
|
+
format: 'rgba8unorm',
|
|
281
|
+
gamut: 'srgb',
|
|
282
|
+
height: 1,
|
|
283
|
+
kind: BitmapTextureSourceKind,
|
|
284
|
+
version: 0,
|
|
285
|
+
width: 1,
|
|
286
|
+
});
|
|
287
|
+
}
|