11import { Compression , SampleFormat } from "@cogeotiff/core" ;
22import type { RasterTypedArray } from "../array.js" ;
3+ import { decode as decodeViaCanvas } from "../codecs/canvas.js" ;
34
45/** The result of a decoding process */
56export type DecodedPixels =
67 | { layout : "pixel-interleaved" ; data : RasterTypedArray }
78 | { layout : "band-separate" ; bands : RasterTypedArray [ ] } ;
89
10+ /** Metadata from the TIFF IFD, passed to decoders that need it. */
11+ export type DecoderMetadata = {
12+ sampleFormat : SampleFormat ;
13+ bitsPerSample : number ;
14+ samplesPerPixel : number ;
15+ } ;
16+
917/**
1018 * A decoder returns either:
1119 * - An ArrayBuffer of raw decompressed bytes (byte-level codecs like deflate, zstd)
1220 * - A DecodedPixels with typed pixel data (image codecs like LERC, JPEG)
1321 */
1422export type Decoder = (
1523 bytes : ArrayBuffer ,
24+ metadata : DecoderMetadata ,
1625) => Promise < ArrayBuffer | DecodedPixels > ;
1726
1827async function decodeUncompressed ( bytes : ArrayBuffer ) : Promise < ArrayBuffer > {
@@ -34,18 +43,12 @@ registry.set(Compression.DeflateOther, () =>
3443// registry.set(Compression.Lzma, () =>
3544// import("../codecs/lzma.js").then((m) => m.decode),
3645// );
37- // registry.set(Compression.Webp, () =>
38- // import("../codecs/webp.js").then((m) => m.decode),
39- // );
4046// registry.set(Compression.Jp2000, () =>
4147// import("../codecs/jp2000.js").then((m) => m.decode),
4248// );
43- // registry.set(Compression.Jpeg, () =>
44- // import("../codecs/jpeg.js").then((m) => m.decode),
45- // );
46- // registry.set(Compression.Jpeg6, () =>
47- // import("../codecs/jpeg.js").then((m) => m.decode),
48- // );
49+ registry . set ( Compression . Jpeg , ( ) => Promise . resolve ( decodeViaCanvas ) ) ;
50+ registry . set ( Compression . Jpeg6 , ( ) => Promise . resolve ( decodeViaCanvas ) ) ;
51+ registry . set ( Compression . Webp , ( ) => Promise . resolve ( decodeViaCanvas ) ) ;
4952registry . set ( Compression . Lerc , ( ) =>
5053 import ( "../codecs/lerc.js" ) . then ( ( m ) => m . decode ) ,
5154) ;
@@ -56,26 +59,20 @@ registry.set(Compression.Lerc, () =>
5659export async function decode (
5760 bytes : ArrayBuffer ,
5861 compression : Compression ,
59- {
60- sampleFormat,
61- bitsPerSample,
62- } : {
63- sampleFormat : SampleFormat ;
64- bitsPerSample : number ;
65- } ,
62+ metadata : DecoderMetadata ,
6663) : Promise < DecodedPixels > {
6764 const loader = registry . get ( compression ) ;
6865 if ( ! loader ) {
6966 throw new Error ( `Unsupported compression: ${ compression } ` ) ;
7067 }
7168
7269 const decoder = await loader ( ) ;
73- const result = await decoder ( bytes ) ;
70+ const result = await decoder ( bytes , metadata ) ;
7471
7572 if ( result instanceof ArrayBuffer ) {
7673 return {
7774 layout : "pixel-interleaved" ,
78- data : toTypedArray ( result , sampleFormat , bitsPerSample ) ,
75+ data : toTypedArray ( result , metadata ) ,
7976 } ;
8077 }
8178
@@ -89,9 +86,9 @@ export async function decode(
8986 */
9087function toTypedArray (
9188 buffer : ArrayBuffer ,
92- sampleFormat : SampleFormat ,
93- bitsPerSample : number ,
89+ metadata : Pick < DecoderMetadata , "sampleFormat" | "bitsPerSample" > ,
9490) : RasterTypedArray {
91+ const { sampleFormat, bitsPerSample } = metadata ;
9592 switch ( sampleFormat ) {
9693 case SampleFormat . Uint :
9794 switch ( bitsPerSample ) {
0 commit comments