@allmaps/render
Version:
Render functions for WebGL and image buffers
61 lines (60 loc) • 1.79 kB
JavaScript
import { fetchUrl } from "@allmaps/stdlib";
import { CacheableTile } from "./CacheableTile.js";
import { WarpedMapEvent, WarpedMapEventType } from "../shared/events.js";
class CacheableImageDataTile extends CacheableTile {
/**
* Fetch the tile and create its ImageData object.
*
* @returns
*/
async fetch() {
try {
const response = await fetchUrl(
this.fetchableTile.tileUrl,
{
signal: this.abortController.signal
},
this.fetchFn
);
const width = this.fetchableTile.tile.tileZoomLevel.width;
const height = this.fetchableTile.tile.tileZoomLevel.height;
const blob = await response.blob();
const bitmap = await createImageBitmap(blob);
const canvas = new OffscreenCanvas(width, height);
const context = canvas.getContext("2d");
if (!context) {
throw new Error("Could not create OffscreenCanvas context");
}
context.drawImage(bitmap, 0, 0);
this.data = context.getImageData(0, 0, width, height);
this.dispatchEvent(
new WarpedMapEvent(WarpedMapEventType.TILEFETCHED, {
tileUrl: this.fetchableTile.tileUrl
})
);
} catch (err) {
if (err instanceof Error && err.name === "AbortError") ;
else {
this.dispatchEvent(
new WarpedMapEvent(WarpedMapEventType.TILEFETCHERROR, {
tileUrl: this.fetchableTile.tileUrl
})
);
}
}
return this.data;
}
async applySprites() {
return;
}
spritesDataToCachedTiles() {
return [];
}
static createFactory() {
return (fetchableTile, fetchFn) => new CacheableImageDataTile(fetchableTile, fetchFn);
}
}
export {
CacheableImageDataTile
};
//# sourceMappingURL=CacheableImageDataTile.js.map