@loaders.gl/images 3.1.0-alpha.2 → 4.0.0-alpha.3
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/bundle.js +2 -4
- package/dist/bundle.js.map +1 -1
- package/dist/dist.min.js +1 -1
- package/dist/dist.min.js.map +1 -1
- package/dist/image-loader.js +7 -6
- package/dist/image-loader.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/category-api/image-format.js +44 -0
- package/dist/lib/category-api/image-format.js.map +1 -0
- package/dist/lib/category-api/image-type.js +3 -3
- package/dist/lib/category-api/image-type.js.map +1 -1
- package/dist/lib/encoders/encode-image.js +1 -2
- package/dist/lib/encoders/encode-image.js.map +1 -1
- package/dist/lib/parsers/parse-image.js +1 -1
- package/dist/lib/parsers/parse-image.js.map +1 -1
- package/dist/lib/parsers/parse-to-image-bitmap.js.map +1 -1
- package/dist/lib/parsers/parse-to-image.js +1 -1
- package/dist/lib/parsers/parse-to-image.js.map +1 -1
- package/dist/lib/parsers/parse-to-node-image.js +4 -7
- package/dist/lib/parsers/parse-to-node-image.js.map +1 -1
- package/dist/lib/parsers/svg-utils.js +1 -1
- package/dist/lib/parsers/svg-utils.js.map +1 -1
- package/dist/lib/texture-api/generate-url.js +2 -3
- package/dist/lib/texture-api/generate-url.js.map +1 -1
- package/dist/lib/texture-api/load-image.js +1 -1
- package/dist/lib/texture-api/load-image.js.map +1 -1
- package/dist/lib/utils/version.js +1 -1
- package/package.json +4 -5
- package/src/bundle.ts +2 -3
- package/src/image-loader.ts +18 -8
- package/src/index.ts +4 -0
- package/src/lib/category-api/image-format.ts +66 -0
- package/src/lib/category-api/image-type.ts +2 -2
- package/src/lib/encoders/encode-image.ts +1 -2
- package/src/lib/parsers/parse-image.ts +9 -2
- package/src/lib/parsers/parse-to-image-bitmap.ts +10 -2
- package/src/lib/parsers/parse-to-image.ts +7 -2
- package/src/lib/parsers/parse-to-node-image.ts +24 -6
- package/src/lib/parsers/svg-utils.ts +2 -2
- package/src/lib/texture-api/generate-url.ts +1 -2
- package/src/lib/texture-api/load-image.ts +1 -1
- package/dist/lib/utils/assert.js +0 -6
- package/dist/lib/utils/assert.js.map +0 -1
- package/dist/lib/utils/globals.js +0 -16
- package/dist/lib/utils/globals.js.map +0 -1
- package/src/lib/utils/assert.js +0 -5
- package/src/lib/utils/globals.ts +0 -48
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { assert } from '
|
|
1
|
+
import { assert } from '@loaders.gl/loader-utils';
|
|
2
2
|
import { isImageTypeSupported, getDefaultImageType } from '../category-api/image-type';
|
|
3
3
|
import { getImageData } from '../category-api/parsed-image-api';
|
|
4
4
|
import parseToImage from './parse-to-image';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/parsers/parse-image.ts"],"names":["assert","isImageTypeSupported","getDefaultImageType","getImageData","parseToImage","parseToImageBitmap","parseToNodeImage","parseImage","arrayBuffer","options","context","imageOptions","image","imageType","type","url","loadType","getLoadableImageType"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/parsers/parse-image.ts"],"names":["assert","isImageTypeSupported","getDefaultImageType","getImageData","parseToImage","parseToImageBitmap","parseToNodeImage","parseImage","arrayBuffer","options","context","imageOptions","image","imageType","type","url","loadType","getLoadableImageType"],"mappings":"AACA,SAAQA,MAAR,QAAqB,0BAArB;AAGA,SAAQC,oBAAR,EAA8BC,mBAA9B,QAAwD,4BAAxD;AACA,SAAQC,YAAR,QAA2B,kCAA3B;AACA,OAAOC,YAAP,MAAyB,kBAAzB;AACA,OAAOC,kBAAP,MAA+B,yBAA/B;AACA,OAAOC,gBAAP,MAA6B,uBAA7B;AAIA,eAAe,eAAeC,UAAf,CACbC,WADa,EAEbC,OAFa,EAGbC,OAHa,EAIO;AACpBD,EAAAA,OAAO,GAAGA,OAAO,IAAI,EAArB;AACA,QAAME,YAAY,GAAGF,OAAO,CAACG,KAAR,IAAiB,EAAtC;AAGA,QAAMC,SAAS,GAAGF,YAAY,CAACG,IAAb,IAAqB,MAAvC;AAEA,QAAM;AAACC,IAAAA;AAAD,MAAQL,OAAO,IAAI,EAAzB;AAGA,QAAMM,QAAQ,GAAGC,oBAAoB,CAACJ,SAAD,CAArC;AAEA,MAAID,KAAJ;;AACA,UAAQI,QAAR;AACE,SAAK,aAAL;AACEJ,MAAAA,KAAK,GAAG,MAAMP,kBAAkB,CAACG,WAAD,EAAcC,OAAd,EAAuBM,GAAvB,CAAhC;AACA;;AACF,SAAK,OAAL;AACEH,MAAAA,KAAK,GAAG,MAAMR,YAAY,CAACI,WAAD,EAAcC,OAAd,EAAuBM,GAAvB,CAA1B;AACA;;AACF,SAAK,MAAL;AAEEH,MAAAA,KAAK,GAAG,MAAMN,gBAAgB,CAACE,WAAD,EAAcC,OAAd,CAA9B;AACA;;AACF;AACET,MAAAA,MAAM,CAAC,KAAD,CAAN;AAZJ;;AAgBA,MAAIa,SAAS,KAAK,MAAlB,EAA0B;AACxBD,IAAAA,KAAK,GAAGT,YAAY,CAACS,KAAD,CAApB;AACD;;AAED,SAAOA,KAAP;AACD;;AAGD,SAASK,oBAAT,CAA8BH,IAA9B,EAAoC;AAClC,UAAQA,IAAR;AACE,SAAK,MAAL;AACA,SAAK,MAAL;AAGE,aAAOZ,mBAAmB,EAA1B;;AACF;AAEED,MAAAA,oBAAoB,CAACa,IAAD,CAApB;AACA,aAAOA,IAAP;AATJ;AAWD","sourcesContent":["import type {LoaderContext} from '@loaders.gl/loader-utils';\nimport {assert} from '@loaders.gl/loader-utils';\nimport type {ImageType} from '../../types';\nimport type {ImageLoaderOptions} from '../../image-loader';\nimport {isImageTypeSupported, getDefaultImageType} from '../category-api/image-type';\nimport {getImageData} from '../category-api/parsed-image-api';\nimport parseToImage from './parse-to-image';\nimport parseToImageBitmap from './parse-to-image-bitmap';\nimport parseToNodeImage from './parse-to-node-image';\n\n// Parse to platform defined image type (data on node, ImageBitmap or HTMLImage on browser)\n// eslint-disable-next-line complexity\nexport default async function parseImage(\n arrayBuffer: ArrayBuffer,\n options?: ImageLoaderOptions,\n context?: LoaderContext\n): Promise<ImageType> {\n options = options || {};\n const imageOptions = options.image || {};\n\n // The user can request a specific output format via `options.image.type`\n const imageType = imageOptions.type || 'auto';\n\n const {url} = context || {};\n\n // Note: For options.image.type === `data`, we may still need to load as `image` or `imagebitmap`\n const loadType = getLoadableImageType(imageType);\n\n let image;\n switch (loadType) {\n case 'imagebitmap':\n image = await parseToImageBitmap(arrayBuffer, options, url);\n break;\n case 'image':\n image = await parseToImage(arrayBuffer, options, url);\n break;\n case 'data':\n // Node.js loads imagedata directly\n image = await parseToNodeImage(arrayBuffer, options);\n break;\n default:\n assert(false);\n }\n\n // Browser: if options.image.type === 'data', we can now extract data from the loaded image\n if (imageType === 'data') {\n image = getImageData(image);\n }\n\n return image;\n}\n\n// Get a loadable image type from image type\nfunction getLoadableImageType(type) {\n switch (type) {\n case 'auto':\n case 'data':\n // Browser: For image data we need still need to load using an image format\n // Node: the default image type is `data`.\n return getDefaultImageType();\n default:\n // Throw an error if not supported\n isImageTypeSupported(type);\n return type;\n }\n}\n"],"file":"parse-image.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/parsers/parse-to-image-bitmap.ts"],"names":["isSVG","getBlob","parseToImage","EMPTY_OBJECT","imagebitmapOptionsSupported","parseToImageBitmap","arrayBuffer","options","url","blob","image","imagebitmapOptions","imagebitmap","safeCreateImageBitmap","isEmptyObject","createImageBitmap","error","console","warn","object","key"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/parsers/parse-to-image-bitmap.ts"],"names":["isSVG","getBlob","parseToImage","EMPTY_OBJECT","imagebitmapOptionsSupported","parseToImageBitmap","arrayBuffer","options","url","blob","image","imagebitmapOptions","imagebitmap","safeCreateImageBitmap","isEmptyObject","createImageBitmap","error","console","warn","object","key"],"mappings":"AACA,SAAQA,KAAR,EAAeC,OAAf,QAA6B,aAA7B;AACA,OAAOC,YAAP,MAAyB,kBAAzB;AAEA,MAAMC,YAAY,GAAG,EAArB;AAEA,IAAIC,2BAA2B,GAAG,IAAlC;AASA,eAAe,eAAeC,kBAAf,CACbC,WADa,EAEbC,OAFa,EAGbC,GAHa,EAIS;AACtB,MAAIC,IAAJ;;AAGA,MAAIT,KAAK,CAACQ,GAAD,CAAT,EAAgB;AAEd,UAAME,KAAK,GAAG,MAAMR,YAAY,CAACI,WAAD,EAAcC,OAAd,EAAuBC,GAAvB,CAAhC;AACAC,IAAAA,IAAI,GAAGC,KAAP;AACD,GAJD,MAIO;AAELD,IAAAA,IAAI,GAAGR,OAAO,CAACK,WAAD,EAAcE,GAAd,CAAd;AACD;;AAED,QAAMG,kBAAkB,GAAGJ,OAAO,IAAIA,OAAO,CAACK,WAA9C;AAEA,SAAO,MAAMC,qBAAqB,CAACJ,IAAD,EAAOE,kBAAP,CAAlC;AACD;;AAQD,eAAeE,qBAAf,CACEJ,IADF,EAEEE,kBAA6C,GAAG,IAFlD,EAGwB;AACtB,MAAIG,aAAa,CAACH,kBAAD,CAAb,IAAqC,CAACP,2BAA1C,EAAuE;AACrEO,IAAAA,kBAAkB,GAAG,IAArB;AACD;;AAED,MAAIA,kBAAJ,EAAwB;AACtB,QAAI;AAEF,aAAO,MAAMI,iBAAiB,CAACN,IAAD,EAAOE,kBAAP,CAA9B;AACD,KAHD,CAGE,OAAOK,KAAP,EAAc;AACdC,MAAAA,OAAO,CAACC,IAAR,CAAaF,KAAb;AACAZ,MAAAA,2BAA2B,GAAG,KAA9B;AACD;AACF;;AAED,SAAO,MAAMW,iBAAiB,CAACN,IAAD,CAA9B;AACD;;AAED,SAASK,aAAT,CAAuBK,MAAvB,EAA+B;AAE7B,OAAK,MAAMC,GAAX,IAAkBD,MAAM,IAAIhB,YAA5B,EAA0C;AACxC,WAAO,KAAP;AACD;;AACD,SAAO,IAAP;AACD","sourcesContent":["import type {ImageLoaderOptions} from '../../image-loader';\nimport {isSVG, getBlob} from './svg-utils';\nimport parseToImage from './parse-to-image';\n\nconst EMPTY_OBJECT = {};\n\nlet imagebitmapOptionsSupported = true;\n\n/**\n * Asynchronously parses an array buffer into an ImageBitmap - this contains the decoded data\n * ImageBitmaps are supported on worker threads, but not supported on Edge, IE11 and Safari\n * https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap#Browser_compatibility\n *\n * TODO - createImageBitmap supports source rect (5 param overload), pass through?\n */\nexport default async function parseToImageBitmap(\n arrayBuffer: ArrayBuffer,\n options: ImageLoaderOptions,\n url?: string\n): Promise<ImageBitmap> {\n let blob;\n\n // Cannot parse SVG directly to ImageBitmap, parse to Image first\n if (isSVG(url)) {\n // Note: this only works on main thread\n const image = await parseToImage(arrayBuffer, options, url);\n blob = image;\n } else {\n // Create blob from the array buffer\n blob = getBlob(arrayBuffer, url);\n }\n\n const imagebitmapOptions = options && options.imagebitmap;\n\n return await safeCreateImageBitmap(blob, imagebitmapOptions);\n}\n\n/**\n * Safely creates an imageBitmap with options\n * *\n * Firefox crashes if imagebitmapOptions is supplied\n * Avoid supplying if not provided or supported, remember if not supported\n */\nasync function safeCreateImageBitmap(\n blob: Blob,\n imagebitmapOptions: ImageBitmapOptions | null = null\n): Promise<ImageBitmap> {\n if (isEmptyObject(imagebitmapOptions) || !imagebitmapOptionsSupported) {\n imagebitmapOptions = null;\n }\n\n if (imagebitmapOptions) {\n try {\n // @ts-ignore Options\n return await createImageBitmap(blob, imagebitmapOptions);\n } catch (error) {\n console.warn(error); // eslint-disable-line\n imagebitmapOptionsSupported = false;\n }\n }\n\n return await createImageBitmap(blob);\n}\n\nfunction isEmptyObject(object) {\n // @ts-ignore\n for (const key in object || EMPTY_OBJECT) {\n return false;\n }\n return true;\n}\n"],"file":"parse-to-image-bitmap.js"}
|
|
@@ -25,7 +25,7 @@ export async function loadToImage(url, options) {
|
|
|
25
25
|
try {
|
|
26
26
|
image.onload = () => resolve(image);
|
|
27
27
|
|
|
28
|
-
image.onerror = err => reject(new Error(
|
|
28
|
+
image.onerror = err => reject(new Error("Could not load image ".concat(url, ": ").concat(err)));
|
|
29
29
|
} catch (error) {
|
|
30
30
|
reject(error);
|
|
31
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/parsers/parse-to-image.ts"],"names":["getBlobOrSVGDataUrl","parseToImage","arrayBuffer","options","url","blobOrDataUrl","URL","self","webkitURL","objectUrl","createObjectURL","loadToImage","revokeObjectURL","image","Image","src","decode","Promise","resolve","reject","onload","onerror","err","Error","error"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/parsers/parse-to-image.ts"],"names":["getBlobOrSVGDataUrl","parseToImage","arrayBuffer","options","url","blobOrDataUrl","URL","self","webkitURL","objectUrl","createObjectURL","loadToImage","revokeObjectURL","image","Image","src","decode","Promise","resolve","reject","onload","onerror","err","Error","error"],"mappings":"AACA,SAAQA,mBAAR,QAAkC,aAAlC;AAGA,eAAe,eAAeC,YAAf,CACbC,WADa,EAEbC,OAFa,EAGbC,GAHa,EAIc;AAK3B,QAAMC,aAAa,GAAGL,mBAAmB,CAACE,WAAD,EAAcE,GAAd,CAAzC;AACA,QAAME,GAAG,GAAGC,IAAI,CAACD,GAAL,IAAYC,IAAI,CAACC,SAA7B;AACA,QAAMC,SAAS,GAAG,OAAOJ,aAAP,KAAyB,QAAzB,IAAqCC,GAAG,CAACI,eAAJ,CAAoBL,aAApB,CAAvD;;AACA,MAAI;AACF,WAAO,MAAMM,WAAW,CAACF,SAAS,IAAIJ,aAAd,EAA6BF,OAA7B,CAAxB;AACD,GAFD,SAEU;AACR,QAAIM,SAAJ,EAAe;AACbH,MAAAA,GAAG,CAACM,eAAJ,CAAoBH,SAApB;AACD;AACF;AACF;AAED,OAAO,eAAeE,WAAf,CAA2BP,GAA3B,EAAgCD,OAAhC,EAAoE;AACzE,QAAMU,KAAK,GAAG,IAAIC,KAAJ,EAAd;AACAD,EAAAA,KAAK,CAACE,GAAN,GAAYX,GAAZ;;AASA,MAAID,OAAO,CAACU,KAAR,IAAiBV,OAAO,CAACU,KAAR,CAAcG,MAA/B,IAAyCH,KAAK,CAACG,MAAnD,EAA2D;AACzD,UAAMH,KAAK,CAACG,MAAN,EAAN;AACA,WAAOH,KAAP;AACD;;AAGD,SAAO,MAAM,IAAII,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;AAC5C,QAAI;AACFN,MAAAA,KAAK,CAACO,MAAN,GAAe,MAAMF,OAAO,CAACL,KAAD,CAA5B;;AACAA,MAAAA,KAAK,CAACQ,OAAN,GAAiBC,GAAD,IAASH,MAAM,CAAC,IAAII,KAAJ,gCAAkCnB,GAAlC,eAA0CkB,GAA1C,EAAD,CAA/B;AACD,KAHD,CAGE,OAAOE,KAAP,EAAc;AACdL,MAAAA,MAAM,CAACK,KAAD,CAAN;AACD;AACF,GAPY,CAAb;AAQD","sourcesContent":["import type {ImageLoaderOptions} from '../../image-loader';\nimport {getBlobOrSVGDataUrl} from './svg-utils';\n\n// Parses html image from array buffer\nexport default async function parseToImage(\n arrayBuffer: ArrayBuffer,\n options: ImageLoaderOptions,\n url?: string\n): Promise<HTMLImageElement> {\n // Note: image parsing requires conversion to Blob (for createObjectURL).\n // Potentially inefficient for not using `response.blob()` (and for File / Blob inputs)...\n // But presumably not worth adding 'blob' flag to loader objects?\n\n const blobOrDataUrl = getBlobOrSVGDataUrl(arrayBuffer, url);\n const URL = self.URL || self.webkitURL;\n const objectUrl = typeof blobOrDataUrl !== 'string' && URL.createObjectURL(blobOrDataUrl);\n try {\n return await loadToImage(objectUrl || blobOrDataUrl, options);\n } finally {\n if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n }\n }\n}\n\nexport async function loadToImage(url, options): Promise<HTMLImageElement> {\n const image = new Image();\n image.src = url;\n\n // The `image.onload()` callback does not guarantee that the image has been decoded\n // so a main thread \"freeze\" can be incurred when using the image for the first time.\n // `Image.decode()` returns a promise that completes when image is decoded.\n\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/decode\n // Note: When calling `img.decode()`, we do not need to wait for `img.onload()`\n // Note: `HTMLImageElement.decode()` is not available in Edge and IE11\n if (options.image && options.image.decode && image.decode) {\n await image.decode();\n return image;\n }\n\n // Create a promise that tracks onload/onerror callbacks\n return await new Promise((resolve, reject) => {\n try {\n image.onload = () => resolve(image);\n image.onerror = (err) => reject(new Error(`Could not load image ${url}: ${err}`));\n } catch (error) {\n reject(error);\n }\n });\n}\n"],"file":"parse-to-image.js"}
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { assert } from '../utils/assert';
|
|
1
|
+
import { assert } from '@loaders.gl/loader-utils';
|
|
3
2
|
import { getBinaryImageMetadata } from '../category-api/binary-image-api';
|
|
4
|
-
export default function parseToNodeImage(arrayBuffer, options) {
|
|
3
|
+
export default async function parseToNodeImage(arrayBuffer, options) {
|
|
5
4
|
const {
|
|
6
5
|
mimeType
|
|
7
6
|
} = getBinaryImageMetadata(arrayBuffer) || {};
|
|
8
|
-
const
|
|
9
|
-
_parseImageNode
|
|
10
|
-
} = global;
|
|
7
|
+
const _parseImageNode = globalThis._parseImageNode;
|
|
11
8
|
assert(_parseImageNode);
|
|
12
|
-
return _parseImageNode(arrayBuffer, mimeType
|
|
9
|
+
return await _parseImageNode(arrayBuffer, mimeType);
|
|
13
10
|
}
|
|
14
11
|
//# sourceMappingURL=parse-to-node-image.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/parsers/parse-to-node-image.ts"],"names":["
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/parsers/parse-to-node-image.ts"],"names":["assert","getBinaryImageMetadata","parseToNodeImage","arrayBuffer","options","mimeType","_parseImageNode","globalThis"],"mappings":"AAEA,SAAQA,MAAR,QAAqB,0BAArB;AACA,SAAQC,sBAAR,QAAqC,kCAArC;AAgBA,eAAe,eAAeC,gBAAf,CACbC,WADa,EAEbC,OAFa,EAGW;AACxB,QAAM;AAACC,IAAAA;AAAD,MAAaJ,sBAAsB,CAACE,WAAD,CAAtB,IAAuC,EAA1D;AAGA,QAAMG,eAA+B,GAAGC,UAAU,CAACD,eAAnD;AACAN,EAAAA,MAAM,CAACM,eAAD,CAAN;AAGA,SAAO,MAAMA,eAAe,CAACH,WAAD,EAAcE,QAAd,CAA5B;AACD","sourcesContent":["import type {ImageLoaderOptions} from '../../image-loader';\nimport type {ImageDataType} from '../../types';\nimport {assert} from '@loaders.gl/loader-utils';\nimport {getBinaryImageMetadata} from '../category-api/binary-image-api';\n\n// Note: These types should be consistent with loaders.gl/polyfills\n\ntype NDArray = {\n shape: number[];\n data: Uint8Array;\n width: number;\n height: number;\n components: number;\n layers: number[];\n};\n\ntype ParseImageNode = (arrayBuffer: ArrayBuffer, mimeType: string) => Promise<NDArray>;\n\n// Use polyfills if installed to parsed image using get-pixels\nexport default async function parseToNodeImage(\n arrayBuffer: ArrayBuffer,\n options: ImageLoaderOptions\n): Promise<ImageDataType> {\n const {mimeType} = getBinaryImageMetadata(arrayBuffer) || {};\n\n // @ts-ignore\n const _parseImageNode: ParseImageNode = globalThis._parseImageNode;\n assert(_parseImageNode); // '@loaders.gl/polyfills not installed'\n\n // @ts-expect-error TODO should we throw error in this case?\n return await _parseImageNode(arrayBuffer, mimeType);\n}\n"],"file":"parse-to-node-image.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/parsers/svg-utils.ts"],"names":["SVG_DATA_URL_PATTERN","SVG_URL_PATTERN","isSVG","url","test","getBlobOrSVGDataUrl","arrayBuffer","textDecoder","TextDecoder","xmlText","decode","unescape","encodeURIComponent","error","Error","message","src","btoa","getBlob","Blob","Uint8Array"],"mappings":"AAGA,MAAMA,oBAAoB,GAAG,uBAA7B;AACA,MAAMC,eAAe,GAAG,mBAAxB;AAEA,OAAO,SAASC,KAAT,CAAeC,GAAf,EAAoB;AACzB,SAAOA,GAAG,KAAKH,oBAAoB,CAACI,IAArB,CAA0BD,GAA1B,KAAkCF,eAAe,CAACG,IAAhB,CAAqBD,GAArB,CAAvC,CAAV;AACD;AAED,OAAO,SAASE,mBAAT,CAA6BC,WAA7B,
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/parsers/svg-utils.ts"],"names":["SVG_DATA_URL_PATTERN","SVG_URL_PATTERN","isSVG","url","test","getBlobOrSVGDataUrl","arrayBuffer","textDecoder","TextDecoder","xmlText","decode","unescape","encodeURIComponent","error","Error","message","src","btoa","getBlob","Blob","Uint8Array"],"mappings":"AAGA,MAAMA,oBAAoB,GAAG,uBAA7B;AACA,MAAMC,eAAe,GAAG,mBAAxB;AAEA,OAAO,SAASC,KAAT,CAAeC,GAAf,EAAoB;AACzB,SAAOA,GAAG,KAAKH,oBAAoB,CAACI,IAArB,CAA0BD,GAA1B,KAAkCF,eAAe,CAACG,IAAhB,CAAqBD,GAArB,CAAvC,CAAV;AACD;AAED,OAAO,SAASE,mBAAT,CAA6BC,WAA7B,EAAuDH,GAAvD,EAAoF;AACzF,MAAID,KAAK,CAACC,GAAD,CAAT,EAAgB;AAEd,UAAMI,WAAW,GAAG,IAAIC,WAAJ,EAApB;AACA,QAAIC,OAAO,GAAGF,WAAW,CAACG,MAAZ,CAAmBJ,WAAnB,CAAd;;AAEA,QAAI;AACF,UAAI,OAAOK,QAAP,KAAoB,UAApB,IAAkC,OAAOC,kBAAP,KAA8B,UAApE,EAAgF;AAC9EH,QAAAA,OAAO,GAAGE,QAAQ,CAACC,kBAAkB,CAACH,OAAD,CAAnB,CAAlB;AACD;AACF,KAJD,CAIE,OAAOI,KAAP,EAAc;AACd,YAAM,IAAIC,KAAJ,CAAWD,KAAD,CAAiBE,OAA3B,CAAN;AACD;;AAED,UAAMC,GAAG,uCAAgCC,IAAI,CAACR,OAAD,CAApC,CAAT;AACA,WAAOO,GAAP;AACD;;AACD,SAAOE,OAAO,CAACZ,WAAD,EAAcH,GAAd,CAAd;AACD;AAED,OAAO,SAASe,OAAT,CAAiBZ,WAAjB,EAA2CH,GAA3C,EAA+D;AACpE,MAAID,KAAK,CAACC,GAAD,CAAT,EAAgB;AAGd,UAAM,IAAIW,KAAJ,CAAU,8CAAV,CAAN;AACD;;AAED,SAAO,IAAIK,IAAJ,CAAS,CAAC,IAAIC,UAAJ,CAAed,WAAf,CAAD,CAAT,CAAP;AACD","sourcesContent":["// SVG parsing has limitations, e.g:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=606319\n\nconst SVG_DATA_URL_PATTERN = /^data:image\\/svg\\+xml/;\nconst SVG_URL_PATTERN = /\\.svg((\\?|#).*)?$/;\n\nexport function isSVG(url) {\n return url && (SVG_DATA_URL_PATTERN.test(url) || SVG_URL_PATTERN.test(url));\n}\n\nexport function getBlobOrSVGDataUrl(arrayBuffer: ArrayBuffer, url?: string): Blob | string {\n if (isSVG(url)) {\n // Prepare a properly tagged data URL, and load using normal mechanism\n const textDecoder = new TextDecoder();\n let xmlText = textDecoder.decode(arrayBuffer);\n // TODO Escape in browser to support e.g. Chinese characters\n try {\n if (typeof unescape === 'function' && typeof encodeURIComponent === 'function') {\n xmlText = unescape(encodeURIComponent(xmlText));\n }\n } catch (error) {\n throw new Error((error as Error).message);\n }\n // base64 encoding is safer. utf-8 fails in some browsers\n const src = `data:image/svg+xml;base64,${btoa(xmlText)}`;\n return src;\n }\n return getBlob(arrayBuffer, url);\n}\n\nexport function getBlob(arrayBuffer: ArrayBuffer, url?: string): Blob {\n if (isSVG(url)) {\n // https://bugs.chromium.org/p/chromium/issues/detail?id=606319\n // return new Blob([new Uint8Array(arrayBuffer)], {type: 'image/svg+xml'});\n throw new Error('SVG cannot be parsed directly to imagebitmap');\n }\n // TODO - how to determine mime type? Param? Sniff here?\n return new Blob([new Uint8Array(arrayBuffer)]); // MIME type not needed?\n}\n"],"file":"svg-utils.js"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { resolvePath } from '@loaders.gl/loader-utils';
|
|
2
|
-
import { assert } from '../utils/assert';
|
|
1
|
+
import { resolvePath, assert } from '@loaders.gl/loader-utils';
|
|
3
2
|
export function generateUrl(getUrl, options, urlOptions) {
|
|
4
3
|
let url = getUrl;
|
|
5
4
|
|
|
@@ -15,7 +14,7 @@ export function generateUrl(getUrl, options, urlOptions) {
|
|
|
15
14
|
} = options;
|
|
16
15
|
|
|
17
16
|
if (baseUrl) {
|
|
18
|
-
url = baseUrl[baseUrl.length - 1] === '/' ?
|
|
17
|
+
url = baseUrl[baseUrl.length - 1] === '/' ? "".concat(baseUrl).concat(url) : "".concat(baseUrl, "/").concat(url);
|
|
19
18
|
}
|
|
20
19
|
|
|
21
20
|
return resolvePath(url);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/texture-api/generate-url.ts"],"names":["resolvePath","assert","generateUrl","getUrl","options","urlOptions","url","baseUrl","length"],"mappings":"AAAA,SAAQA,WAAR,
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/texture-api/generate-url.ts"],"names":["resolvePath","assert","generateUrl","getUrl","options","urlOptions","url","baseUrl","length"],"mappings":"AAAA,SAAQA,WAAR,EAAqBC,MAArB,QAAkC,0BAAlC;AAGA,OAAO,SAASC,WAAT,CAAqBC,MAArB,EAA6BC,OAA7B,EAAsCC,UAAtC,EAAkD;AAEvD,MAAIC,GAAG,GAAGH,MAAV;;AACA,MAAI,OAAOA,MAAP,KAAkB,UAAtB,EAAkC;AAChCG,IAAAA,GAAG,GAAGH,MAAM,CAAC,EAAC,GAAGC,OAAJ;AAAa,SAAGC;AAAhB,KAAD,CAAZ;AACD;;AACDJ,EAAAA,MAAM,CAAC,OAAOK,GAAP,KAAe,QAAhB,CAAN;AAGA,QAAM;AAACC,IAAAA;AAAD,MAAYH,OAAlB;;AACA,MAAIG,OAAJ,EAAa;AACXD,IAAAA,GAAG,GAAGC,OAAO,CAACA,OAAO,CAACC,MAAR,GAAiB,CAAlB,CAAP,KAAgC,GAAhC,aAAyCD,OAAzC,SAAmDD,GAAnD,cAA8DC,OAA9D,cAAyED,GAAzE,CAAN;AACD;;AAED,SAAON,WAAW,CAACM,GAAD,CAAlB;AACD","sourcesContent":["import {resolvePath, assert} from '@loaders.gl/loader-utils';\n\n// Generate a url by calling getUrl with mix of options, applying options.baseUrl\nexport function generateUrl(getUrl, options, urlOptions) {\n // Get url\n let url = getUrl;\n if (typeof getUrl === 'function') {\n url = getUrl({...options, ...urlOptions});\n }\n assert(typeof url === 'string');\n\n // Apply options.baseUrl\n const {baseUrl} = options;\n if (baseUrl) {\n url = baseUrl[baseUrl.length - 1] === '/' ? `${baseUrl}${url}` : `${baseUrl}/${url}`;\n }\n\n return resolvePath(url);\n}\n"],"file":"generate-url.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/texture-api/load-image.ts"],"names":["assert","parseImage","getImageSize","generateUrl","deepLoad","shallowLoad","loadImage","getUrl","options","imageUrls","getImageUrls","urlOptions","mipLevels","image","getMipmappedImageUrls","urls","url","lod","width","height","getMipLevels","push","mipLevel","length","Math","floor","log2","max"],"mappings":"AAAA,SAAQA,MAAR,QAAqB,
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/texture-api/load-image.ts"],"names":["assert","parseImage","getImageSize","generateUrl","deepLoad","shallowLoad","loadImage","getUrl","options","imageUrls","getImageUrls","urlOptions","mipLevels","image","getMipmappedImageUrls","urls","url","lod","width","height","getMipLevels","push","mipLevel","length","Math","floor","log2","max"],"mappings":"AAAA,SAAQA,MAAR,QAAqB,0BAArB;AACA,OAAOC,UAAP,MAAuB,wBAAvB;AACA,SAAQC,YAAR,QAA2B,kCAA3B;AACA,SAAQC,WAAR,QAA0B,gBAA1B;AACA,SAAQC,QAAR,EAAkBC,WAAlB,QAAoC,aAApC;AAEA,OAAO,eAAeC,SAAf,CAAyBC,MAAzB,EAAiCC,OAAO,GAAG,EAA3C,EAA+C;AACpD,QAAMC,SAAS,GAAG,MAAMC,YAAY,CAACH,MAAD,EAASC,OAAT,CAApC;AACA,SAAO,MAAMJ,QAAQ,CAACK,SAAD,EAAYR,UAAZ,EAAwBO,OAAxB,CAArB;AACD;AAED,OAAO,eAAeE,YAAf,CAA4BH,MAA5B,EAAoCC,OAApC,EAA6CG,UAAU,GAAG,EAA1D,EAA8D;AACnE,QAAMC,SAAS,GAAIJ,OAAO,IAAIA,OAAO,CAACK,KAAnB,IAA4BL,OAAO,CAACK,KAAR,CAAcD,SAA3C,IAAyD,CAA3E;AACA,SAAOA,SAAS,KAAK,CAAd,GACH,MAAME,qBAAqB,CAACP,MAAD,EAASK,SAAT,EAAoBJ,OAApB,EAA6BG,UAA7B,CADxB,GAEHR,WAAW,CAACI,MAAD,EAASC,OAAT,EAAkBG,UAAlB,CAFf;AAGD;;AAED,eAAeG,qBAAf,CAAqCP,MAArC,EAA6CK,SAA7C,EAAwDJ,OAAxD,EAAiEG,UAAjE,EAA6E;AAC3E,QAAMI,IAAc,GAAG,EAAvB;;AAGA,MAAIH,SAAS,KAAK,MAAlB,EAA0B;AACxB,UAAMI,GAAG,GAAGb,WAAW,CAACI,MAAD,EAASC,OAAT,EAAkB,EAAC,GAAGG,UAAJ;AAAgBM,MAAAA,GAAG,EAAE;AAArB,KAAlB,CAAvB;AACA,UAAMJ,KAAK,GAAG,MAAMR,WAAW,CAACW,GAAD,EAAMf,UAAN,EAAkBO,OAAlB,CAA/B;AAEA,UAAM;AAACU,MAAAA,KAAD;AAAQC,MAAAA;AAAR,QAAkBjB,YAAY,CAACW,KAAD,CAApC;AACAD,IAAAA,SAAS,GAAGQ,YAAY,CAAC;AAACF,MAAAA,KAAD;AAAQC,MAAAA;AAAR,KAAD,CAAxB;AAGAJ,IAAAA,IAAI,CAACM,IAAL,CAAUL,GAAV;AACD;;AAGDhB,EAAAA,MAAM,CAACY,SAAS,GAAG,CAAb,CAAN;;AAEA,OAAK,IAAIU,QAAQ,GAAGP,IAAI,CAACQ,MAAzB,EAAiCD,QAAQ,GAAGV,SAA5C,EAAuD,EAAEU,QAAzD,EAAmE;AACjE,UAAMN,GAAG,GAAGb,WAAW,CAACI,MAAD,EAASC,OAAT,EAAkB,EAAC,GAAGG,UAAJ;AAAgBM,MAAAA,GAAG,EAAEK;AAArB,KAAlB,CAAvB;AACAP,IAAAA,IAAI,CAACM,IAAL,CAAUL,GAAV;AACD;;AAED,SAAOD,IAAP;AACD;;AAGD,OAAO,SAASK,YAAT,CAAsB;AAACF,EAAAA,KAAD;AAAQC,EAAAA;AAAR,CAAtB,EAAuC;AAC5C,SAAO,IAAIK,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,IAAL,CAAUF,IAAI,CAACG,GAAL,CAAST,KAAT,EAAgBC,MAAhB,CAAV,CAAX,CAAX;AACD","sourcesContent":["import {assert} from '@loaders.gl/loader-utils';\nimport parseImage from '../parsers/parse-image';\nimport {getImageSize} from '../category-api/parsed-image-api';\nimport {generateUrl} from './generate-url';\nimport {deepLoad, shallowLoad} from './deep-load';\n\nexport async function loadImage(getUrl, options = {}) {\n const imageUrls = await getImageUrls(getUrl, options);\n return await deepLoad(imageUrls, parseImage, options);\n}\n\nexport async function getImageUrls(getUrl, options, urlOptions = {}) {\n const mipLevels = (options && options.image && options.image.mipLevels) || 0;\n return mipLevels !== 0\n ? await getMipmappedImageUrls(getUrl, mipLevels, options, urlOptions)\n : generateUrl(getUrl, options, urlOptions);\n}\n\nasync function getMipmappedImageUrls(getUrl, mipLevels, options, urlOptions) {\n const urls: string[] = [];\n\n // If no mip levels supplied, we need to load the level 0 image and calculate based on size\n if (mipLevels === 'auto') {\n const url = generateUrl(getUrl, options, {...urlOptions, lod: 0});\n const image = await shallowLoad(url, parseImage, options);\n\n const {width, height} = getImageSize(image);\n mipLevels = getMipLevels({width, height});\n\n // TODO - push image and make `deepLoad` pass through non-url values, avoid loading twice?\n urls.push(url);\n }\n\n // We now know how many mipLevels we need, remaining image urls can now be constructed\n assert(mipLevels > 0);\n\n for (let mipLevel = urls.length; mipLevel < mipLevels; ++mipLevel) {\n const url = generateUrl(getUrl, options, {...urlOptions, lod: mipLevel});\n urls.push(url);\n }\n\n return urls;\n}\n\n// Calculates number of mipmaps based on texture size (log2)\nexport function getMipLevels({width, height}) {\n return 1 + Math.floor(Math.log2(Math.max(width, height)));\n}\n"],"file":"load-image.js"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const VERSION = typeof "
|
|
1
|
+
export const VERSION = typeof "4.0.0-alpha.3" !== 'undefined' ? "4.0.0-alpha.3" : 'latest';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loaders.gl/images",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0-alpha.3",
|
|
4
4
|
"description": "Framework-independent loaders and writers for images (PNG, JPG, ...)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -29,11 +29,10 @@
|
|
|
29
29
|
],
|
|
30
30
|
"scripts": {
|
|
31
31
|
"pre-build": "npm run build-bundle",
|
|
32
|
-
"build-bundle": "webpack --display=minimal --config ../../scripts/webpack/bundle.js"
|
|
33
|
-
"build-worker": "webpack --entry ./src/image-worker.js --output ./dist/image-worker.js --config ../../scripts/webpack/worker.js"
|
|
32
|
+
"build-bundle": "webpack --display=minimal --config ../../scripts/webpack/bundle.js"
|
|
34
33
|
},
|
|
35
34
|
"dependencies": {
|
|
36
|
-
"@loaders.gl/loader-utils": "
|
|
35
|
+
"@loaders.gl/loader-utils": "4.0.0-alpha.3"
|
|
37
36
|
},
|
|
38
|
-
"gitHead": "
|
|
37
|
+
"gitHead": "ded84630d02ba4fc97277ebecea3e42ae1bc2616"
|
|
39
38
|
}
|
package/src/bundle.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
2
|
const moduleExports = require('./index');
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
module.exports = Object.assign(_global.loaders, moduleExports);
|
|
3
|
+
globalThis.loaders = globalThis.loaders || {};
|
|
4
|
+
module.exports = Object.assign(globalThis.loaders, moduleExports);
|
package/src/image-loader.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {LoaderWithParser} from '@loaders.gl/loader-utils';
|
|
1
|
+
import type {LoaderOptions, LoaderWithParser} from '@loaders.gl/loader-utils';
|
|
2
2
|
import {VERSION} from './lib/utils/version';
|
|
3
3
|
import parseImage from './lib/parsers/parse-image';
|
|
4
4
|
import {getBinaryImageMetadata} from './lib/category-api/binary-image-api';
|
|
@@ -14,6 +14,22 @@ const MIME_TYPES = [
|
|
|
14
14
|
'image/svg+xml'
|
|
15
15
|
];
|
|
16
16
|
|
|
17
|
+
export type ImageLoaderOptions = LoaderOptions & {
|
|
18
|
+
image?: {
|
|
19
|
+
type?: 'auto' | 'data' | 'imagebitmap' | 'image';
|
|
20
|
+
decode?: boolean;
|
|
21
|
+
};
|
|
22
|
+
imagebitmap?: ImageBitmapOptions;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const DEFAULT_IMAGE_LOADER_OPTIONS: ImageLoaderOptions = {
|
|
26
|
+
image: {
|
|
27
|
+
type: 'auto',
|
|
28
|
+
decode: true // if format is HTML
|
|
29
|
+
}
|
|
30
|
+
// imagebitmap: {} - passes (platform dependent) parameters to ImageBitmap constructor
|
|
31
|
+
};
|
|
32
|
+
|
|
17
33
|
/**
|
|
18
34
|
* Loads a platform-specific image type
|
|
19
35
|
* Note: This type can be used as input data to WebGL texture creation
|
|
@@ -28,13 +44,7 @@ export const ImageLoader = {
|
|
|
28
44
|
parse: parseImage,
|
|
29
45
|
// TODO: byteOffset, byteLength;
|
|
30
46
|
tests: [(arrayBuffer) => Boolean(getBinaryImageMetadata(new DataView(arrayBuffer)))],
|
|
31
|
-
options:
|
|
32
|
-
image: {
|
|
33
|
-
type: 'auto',
|
|
34
|
-
decode: true // if format is HTML
|
|
35
|
-
}
|
|
36
|
-
// imagebitmap: {} - passes (platform dependent) parameters to ImageBitmap constructor
|
|
37
|
-
}
|
|
47
|
+
options: DEFAULT_IMAGE_LOADER_OPTIONS
|
|
38
48
|
};
|
|
39
49
|
|
|
40
50
|
export const _typecheckImageLoader: LoaderWithParser = ImageLoader;
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// TYPES
|
|
2
2
|
export type {ImageDataType, ImageType, ImageTypeEnum} from './types';
|
|
3
|
+
export type {ImageLoaderOptions} from './image-loader';
|
|
3
4
|
|
|
4
5
|
// LOADERS AND WRITERS
|
|
5
6
|
export {ImageLoader} from './image-loader';
|
|
@@ -20,5 +21,8 @@ export {
|
|
|
20
21
|
getImageData
|
|
21
22
|
} from './lib/category-api/parsed-image-api';
|
|
22
23
|
|
|
24
|
+
// EXPERIMENTAL
|
|
25
|
+
export {_isImageFormatSupported} from './lib/category-api/image-format';
|
|
26
|
+
|
|
23
27
|
// DEPRECATED - Remove in V3 (fix dependency in luma.gl)
|
|
24
28
|
export {loadImage} from './lib/texture-api/load-image';
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import {isBrowser} from '@loaders.gl/loader-utils';
|
|
2
|
+
|
|
3
|
+
// The following formats are supported by loaders.gl polyfills
|
|
4
|
+
const NODE_FORMAT_SUPPORT = ['image/png', 'image/jpeg', 'image/gif'];
|
|
5
|
+
|
|
6
|
+
/** Cache values for speed */
|
|
7
|
+
const mimeTypeSupported: {[mimeType: string]: boolean} = {};
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Check if image MIME type is supported. Result is cached.
|
|
11
|
+
*/
|
|
12
|
+
export function _isImageFormatSupported(mimeType: string): boolean {
|
|
13
|
+
if (mimeTypeSupported[mimeType] === undefined) {
|
|
14
|
+
mimeTypeSupported[mimeType] = checkFormatSupport(mimeType);
|
|
15
|
+
}
|
|
16
|
+
return mimeTypeSupported[mimeType];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Check if image MIME type is supported.
|
|
21
|
+
*/
|
|
22
|
+
function checkFormatSupport(mimeType: string): boolean {
|
|
23
|
+
switch (mimeType) {
|
|
24
|
+
case 'image/webp':
|
|
25
|
+
return checkWebPSupport();
|
|
26
|
+
case 'image/svg':
|
|
27
|
+
return isBrowser;
|
|
28
|
+
default:
|
|
29
|
+
if (!isBrowser) {
|
|
30
|
+
// @ts-ignore
|
|
31
|
+
const {_parseImageNode} = globalThis;
|
|
32
|
+
return Boolean(_parseImageNode) && NODE_FORMAT_SUPPORT.includes(mimeType);
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Check WebPSupport synchronously */
|
|
39
|
+
function checkWebPSupport() {
|
|
40
|
+
if (!isBrowser) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const element = document.createElement('canvas');
|
|
45
|
+
return element.toDataURL('image/webp').indexOf('data:image/webp') === 0;
|
|
46
|
+
} catch {
|
|
47
|
+
// Probably Safari...
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Note: better test but asynchronous
|
|
53
|
+
|
|
54
|
+
// Lossy test image. Support for lossy images doesn't guarantee support for all WebP images.
|
|
55
|
+
// https://stackoverflow.com/questions/5573096/detecting-webp-support
|
|
56
|
+
// const WEBP_TEST_IMAGE = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';
|
|
57
|
+
|
|
58
|
+
// Check WebPSupport asynchronously
|
|
59
|
+
// async function isWebPSupported() {
|
|
60
|
+
// return new Promise( resolve => {
|
|
61
|
+
// const image = new Image();
|
|
62
|
+
// image.src = WEBP_TEST_IMAGE;
|
|
63
|
+
// image.onload = image.onerror = function () {
|
|
64
|
+
// resolve( image.height === 1 );
|
|
65
|
+
// }
|
|
66
|
+
// }
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import {isBrowser} from '@loaders.gl/loader-utils';
|
|
1
2
|
import type {ImageTypeEnum} from '../../types';
|
|
2
|
-
import {global, isBrowser} from '../utils/globals';
|
|
3
3
|
|
|
4
4
|
// @ts-ignore TS2339: Property does not exist on type
|
|
5
|
-
const {_parseImageNode} =
|
|
5
|
+
const {_parseImageNode} = globalThis;
|
|
6
6
|
|
|
7
7
|
const IMAGE_SUPPORTED = typeof Image !== 'undefined'; // NOTE: "false" positives if jsdom is installed
|
|
8
8
|
const IMAGE_BITMAP_SUPPORTED = typeof ImageBitmap !== 'undefined';
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
// Image loading/saving for browser and Node.js
|
|
2
|
-
import {global} from '../utils/globals';
|
|
3
2
|
import {getImageSize} from '../category-api/parsed-image-api';
|
|
4
3
|
|
|
5
4
|
// @ts-ignore TS2339: Property does not exist on type
|
|
6
|
-
const {_encodeImageNode} =
|
|
5
|
+
const {_encodeImageNode} = globalThis;
|
|
7
6
|
|
|
8
7
|
/**
|
|
9
8
|
* Returns data bytes representing a compressed image in PNG or JPG format,
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type {LoaderContext} from '@loaders.gl/loader-utils';
|
|
2
|
+
import {assert} from '@loaders.gl/loader-utils';
|
|
3
|
+
import type {ImageType} from '../../types';
|
|
4
|
+
import type {ImageLoaderOptions} from '../../image-loader';
|
|
2
5
|
import {isImageTypeSupported, getDefaultImageType} from '../category-api/image-type';
|
|
3
6
|
import {getImageData} from '../category-api/parsed-image-api';
|
|
4
7
|
import parseToImage from './parse-to-image';
|
|
@@ -7,7 +10,11 @@ import parseToNodeImage from './parse-to-node-image';
|
|
|
7
10
|
|
|
8
11
|
// Parse to platform defined image type (data on node, ImageBitmap or HTMLImage on browser)
|
|
9
12
|
// eslint-disable-next-line complexity
|
|
10
|
-
export default async function parseImage(
|
|
13
|
+
export default async function parseImage(
|
|
14
|
+
arrayBuffer: ArrayBuffer,
|
|
15
|
+
options?: ImageLoaderOptions,
|
|
16
|
+
context?: LoaderContext
|
|
17
|
+
): Promise<ImageType> {
|
|
11
18
|
options = options || {};
|
|
12
19
|
const imageOptions = options.image || {};
|
|
13
20
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type {ImageLoaderOptions} from '../../image-loader';
|
|
1
2
|
import {isSVG, getBlob} from './svg-utils';
|
|
2
3
|
import parseToImage from './parse-to-image';
|
|
3
4
|
|
|
@@ -12,7 +13,11 @@ let imagebitmapOptionsSupported = true;
|
|
|
12
13
|
*
|
|
13
14
|
* TODO - createImageBitmap supports source rect (5 param overload), pass through?
|
|
14
15
|
*/
|
|
15
|
-
export default async function parseToImageBitmap(
|
|
16
|
+
export default async function parseToImageBitmap(
|
|
17
|
+
arrayBuffer: ArrayBuffer,
|
|
18
|
+
options: ImageLoaderOptions,
|
|
19
|
+
url?: string
|
|
20
|
+
): Promise<ImageBitmap> {
|
|
16
21
|
let blob;
|
|
17
22
|
|
|
18
23
|
// Cannot parse SVG directly to ImageBitmap, parse to Image first
|
|
@@ -36,7 +41,10 @@ export default async function parseToImageBitmap(arrayBuffer, options, url) {
|
|
|
36
41
|
* Firefox crashes if imagebitmapOptions is supplied
|
|
37
42
|
* Avoid supplying if not provided or supported, remember if not supported
|
|
38
43
|
*/
|
|
39
|
-
async function safeCreateImageBitmap(
|
|
44
|
+
async function safeCreateImageBitmap(
|
|
45
|
+
blob: Blob,
|
|
46
|
+
imagebitmapOptions: ImageBitmapOptions | null = null
|
|
47
|
+
): Promise<ImageBitmap> {
|
|
40
48
|
if (isEmptyObject(imagebitmapOptions) || !imagebitmapOptionsSupported) {
|
|
41
49
|
imagebitmapOptions = null;
|
|
42
50
|
}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
import type {ImageLoaderOptions} from '../../image-loader';
|
|
1
2
|
import {getBlobOrSVGDataUrl} from './svg-utils';
|
|
2
3
|
|
|
3
4
|
// Parses html image from array buffer
|
|
4
|
-
export default async function parseToImage(
|
|
5
|
+
export default async function parseToImage(
|
|
6
|
+
arrayBuffer: ArrayBuffer,
|
|
7
|
+
options: ImageLoaderOptions,
|
|
8
|
+
url?: string
|
|
9
|
+
): Promise<HTMLImageElement> {
|
|
5
10
|
// Note: image parsing requires conversion to Blob (for createObjectURL).
|
|
6
11
|
// Potentially inefficient for not using `response.blob()` (and for File / Blob inputs)...
|
|
7
12
|
// But presumably not worth adding 'blob' flag to loader objects?
|
|
@@ -18,7 +23,7 @@ export default async function parseToImage(arrayBuffer, options, url) {
|
|
|
18
23
|
}
|
|
19
24
|
}
|
|
20
25
|
|
|
21
|
-
export async function loadToImage(url, options) {
|
|
26
|
+
export async function loadToImage(url, options): Promise<HTMLImageElement> {
|
|
22
27
|
const image = new Image();
|
|
23
28
|
image.src = url;
|
|
24
29
|
|
|
@@ -1,14 +1,32 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type {ImageLoaderOptions} from '../../image-loader';
|
|
2
|
+
import type {ImageDataType} from '../../types';
|
|
3
|
+
import {assert} from '@loaders.gl/loader-utils';
|
|
3
4
|
import {getBinaryImageMetadata} from '../category-api/binary-image-api';
|
|
4
5
|
|
|
5
|
-
//
|
|
6
|
-
|
|
6
|
+
// Note: These types should be consistent with loaders.gl/polyfills
|
|
7
|
+
|
|
8
|
+
type NDArray = {
|
|
9
|
+
shape: number[];
|
|
10
|
+
data: Uint8Array;
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
components: number;
|
|
14
|
+
layers: number[];
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
type ParseImageNode = (arrayBuffer: ArrayBuffer, mimeType: string) => Promise<NDArray>;
|
|
18
|
+
|
|
19
|
+
// Use polyfills if installed to parsed image using get-pixels
|
|
20
|
+
export default async function parseToNodeImage(
|
|
21
|
+
arrayBuffer: ArrayBuffer,
|
|
22
|
+
options: ImageLoaderOptions
|
|
23
|
+
): Promise<ImageDataType> {
|
|
7
24
|
const {mimeType} = getBinaryImageMetadata(arrayBuffer) || {};
|
|
8
25
|
|
|
9
26
|
// @ts-ignore
|
|
10
|
-
const
|
|
27
|
+
const _parseImageNode: ParseImageNode = globalThis._parseImageNode;
|
|
11
28
|
assert(_parseImageNode); // '@loaders.gl/polyfills not installed'
|
|
12
29
|
|
|
13
|
-
|
|
30
|
+
// @ts-expect-error TODO should we throw error in this case?
|
|
31
|
+
return await _parseImageNode(arrayBuffer, mimeType);
|
|
14
32
|
}
|
|
@@ -8,7 +8,7 @@ export function isSVG(url) {
|
|
|
8
8
|
return url && (SVG_DATA_URL_PATTERN.test(url) || SVG_URL_PATTERN.test(url));
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
export function getBlobOrSVGDataUrl(arrayBuffer, url) {
|
|
11
|
+
export function getBlobOrSVGDataUrl(arrayBuffer: ArrayBuffer, url?: string): Blob | string {
|
|
12
12
|
if (isSVG(url)) {
|
|
13
13
|
// Prepare a properly tagged data URL, and load using normal mechanism
|
|
14
14
|
const textDecoder = new TextDecoder();
|
|
@@ -28,7 +28,7 @@ export function getBlobOrSVGDataUrl(arrayBuffer, url) {
|
|
|
28
28
|
return getBlob(arrayBuffer, url);
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
export function getBlob(arrayBuffer, url) {
|
|
31
|
+
export function getBlob(arrayBuffer: ArrayBuffer, url?: string): Blob {
|
|
32
32
|
if (isSVG(url)) {
|
|
33
33
|
// https://bugs.chromium.org/p/chromium/issues/detail?id=606319
|
|
34
34
|
// return new Blob([new Uint8Array(arrayBuffer)], {type: 'image/svg+xml'});
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {resolvePath} from '@loaders.gl/loader-utils';
|
|
2
|
-
import {assert} from '../utils/assert';
|
|
1
|
+
import {resolvePath, assert} from '@loaders.gl/loader-utils';
|
|
3
2
|
|
|
4
3
|
// Generate a url by calling getUrl with mix of options, applying options.baseUrl
|
|
5
4
|
export function generateUrl(getUrl, options, urlOptions) {
|
package/dist/lib/utils/assert.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/utils/assert.js"],"names":["assert","condition","message","Error"],"mappings":"AAAA,OAAO,SAASA,MAAT,CAAgBC,SAAhB,EAA2BC,OAA3B,EAAoC;AACzC,MAAI,CAACD,SAAL,EAAgB;AACd,UAAM,IAAIE,KAAJ,CAAUD,OAAV,CAAN;AACD;AACF","sourcesContent":["export function assert(condition, message) {\n if (!condition) {\n throw new Error(message);\n }\n}\n"],"file":"assert.js"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
const globals = {
|
|
2
|
-
self: typeof self !== 'undefined' && self,
|
|
3
|
-
window: typeof window !== 'undefined' && window,
|
|
4
|
-
global: typeof global !== 'undefined' && global,
|
|
5
|
-
document: typeof document !== 'undefined' && document
|
|
6
|
-
};
|
|
7
|
-
const self_ = globals.self || globals.window || globals.global;
|
|
8
|
-
const window_ = globals.window || globals.self || globals.global;
|
|
9
|
-
const global_ = globals.global || globals.self || globals.window;
|
|
10
|
-
const document_ = globals.document || {};
|
|
11
|
-
export { self_ as self, window_ as window, global_ as global, document_ as document };
|
|
12
|
-
export const isBrowser = typeof process !== 'object' || String(process) !== '[object process]' || process.browser;
|
|
13
|
-
export const isWorker = typeof importScripts === 'function';
|
|
14
|
-
const matches = typeof process !== 'undefined' && process.version && /v([0-9]*)/.exec(process.version);
|
|
15
|
-
export const nodeVersion = matches && parseFloat(matches[1]) || 0;
|
|
16
|
-
//# sourceMappingURL=globals.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/utils/globals.ts"],"names":["globals","self","window","global","document","self_","window_","global_","document_","isBrowser","process","String","browser","isWorker","importScripts","matches","version","exec","nodeVersion","parseFloat"],"mappings":"AAwBA,MAAMA,OAAO,GAAG;AACdC,EAAAA,IAAI,EAAE,OAAOA,IAAP,KAAgB,WAAhB,IAA+BA,IADvB;AAEdC,EAAAA,MAAM,EAAE,OAAOA,MAAP,KAAkB,WAAlB,IAAiCA,MAF3B;AAGdC,EAAAA,MAAM,EAAE,OAAOA,MAAP,KAAkB,WAAlB,IAAiCA,MAH3B;AAIdC,EAAAA,QAAQ,EAAE,OAAOA,QAAP,KAAoB,WAApB,IAAmCA;AAJ/B,CAAhB;AAOA,MAAMC,KAAK,GAAGL,OAAO,CAACC,IAAR,IAAgBD,OAAO,CAACE,MAAxB,IAAkCF,OAAO,CAACG,MAAxD;AACA,MAAMG,OAAO,GAAGN,OAAO,CAACE,MAAR,IAAkBF,OAAO,CAACC,IAA1B,IAAkCD,OAAO,CAACG,MAA1D;AACA,MAAMI,OAAO,GAAGP,OAAO,CAACG,MAAR,IAAkBH,OAAO,CAACC,IAA1B,IAAkCD,OAAO,CAACE,MAA1D;AACA,MAAMM,SAAS,GAAGR,OAAO,CAACI,QAAR,IAAoB,EAAtC;AAEA,SAAQC,KAAK,IAAIJ,IAAjB,EAAuBK,OAAO,IAAIJ,MAAlC,EAA0CK,OAAO,IAAIJ,MAArD,EAA6DK,SAAS,IAAIJ,QAA1E;AAEA,OAAO,MAAMK,SAAS,GAEpB,OAAOC,OAAP,KAAmB,QAAnB,IAA+BC,MAAM,CAACD,OAAD,CAAN,KAAoB,kBAAnD,IAAyEA,OAAO,CAACE,OAF5E;AAIP,OAAO,MAAMC,QAAQ,GAAG,OAAOC,aAAP,KAAyB,UAA1C;AAGP,MAAMC,OAAO,GACX,OAAOL,OAAP,KAAmB,WAAnB,IAAkCA,OAAO,CAACM,OAA1C,IAAqD,YAAYC,IAAZ,CAAiBP,OAAO,CAACM,OAAzB,CADvD;AAEA,OAAO,MAAME,WAAW,GAAIH,OAAO,IAAII,UAAU,CAACJ,OAAO,CAAC,CAAD,CAAR,CAAtB,IAAuC,CAA3D","sourcesContent":["// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n// Purpose: include this in your module to avoids adding dependencies on\n// micro modules like 'global' and 'is-browser';\n\n/* eslint-disable no-restricted-globals */\nconst globals = {\n self: typeof self !== 'undefined' && self,\n window: typeof window !== 'undefined' && window,\n global: typeof global !== 'undefined' && global,\n document: typeof document !== 'undefined' && document\n};\n\nconst self_ = globals.self || globals.window || globals.global;\nconst window_ = globals.window || globals.self || globals.global;\nconst global_ = globals.global || globals.self || globals.window;\nconst document_ = globals.document || {};\n\nexport {self_ as self, window_ as window, global_ as global, document_ as document};\n\nexport const isBrowser =\n // @ts-ignore\n typeof process !== 'object' || String(process) !== '[object process]' || process.browser;\n\nexport const isWorker = typeof importScripts === 'function';\n\n// Extract node major version\nconst matches =\n typeof process !== 'undefined' && process.version && /v([0-9]*)/.exec(process.version);\nexport const nodeVersion = (matches && parseFloat(matches[1])) || 0;\n"],"file":"globals.js"}
|