@loaders.gl/images 4.0.0-beta.5 → 4.0.0-beta.6
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/dist.dev.js +2 -125
- package/dist/index.cjs +3 -94
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/category-api/image-format.js +2 -2
- package/dist/lib/category-api/image-format.js.map +1 -1
- package/package.json +3 -3
- package/src/index.ts +0 -3
- package/src/lib/category-api/image-format.ts +1 -2
- package/dist/lib/texture-api/async-deep-map.d.ts +0 -3
- package/dist/lib/texture-api/async-deep-map.d.ts.map +0 -1
- package/dist/lib/texture-api/async-deep-map.js +0 -34
- package/dist/lib/texture-api/async-deep-map.js.map +0 -1
- package/dist/lib/texture-api/deep-load.d.ts +0 -3
- package/dist/lib/texture-api/deep-load.d.ts.map +0 -1
- package/dist/lib/texture-api/deep-load.js +0 -10
- package/dist/lib/texture-api/deep-load.js.map +0 -1
- package/dist/lib/texture-api/generate-url.d.ts +0 -2
- package/dist/lib/texture-api/generate-url.d.ts.map +0 -1
- package/dist/lib/texture-api/generate-url.js +0 -19
- package/dist/lib/texture-api/generate-url.js.map +0 -1
- package/dist/lib/texture-api/load-image.d.ts +0 -7
- package/dist/lib/texture-api/load-image.d.ts.map +0 -1
- package/dist/lib/texture-api/load-image.js +0 -51
- package/dist/lib/texture-api/load-image.js.map +0 -1
- package/src/lib/texture-api/async-deep-map.ts +0 -62
- package/src/lib/texture-api/deep-load.ts +0 -11
- package/src/lib/texture-api/generate-url.ts +0 -19
- package/src/lib/texture-api/load-image.ts +0 -48
package/dist/dist.dev.js
CHANGED
|
@@ -37,8 +37,7 @@ var __exports__ = (() => {
|
|
|
37
37
|
getSupportedImageFormats: () => getSupportedImageFormats,
|
|
38
38
|
isImage: () => isImage,
|
|
39
39
|
isImageFormatSupported: () => isImageFormatSupported,
|
|
40
|
-
isImageTypeSupported: () => isImageTypeSupported
|
|
41
|
-
loadImage: () => loadImage
|
|
40
|
+
isImageTypeSupported: () => isImageTypeSupported
|
|
42
41
|
});
|
|
43
42
|
|
|
44
43
|
// src/lib/utils/version.ts
|
|
@@ -66,22 +65,6 @@ var __exports__ = (() => {
|
|
|
66
65
|
var matches = typeof process !== "undefined" && process.version && /v([0-9]*)/.exec(process.version);
|
|
67
66
|
var nodeVersion = matches && parseFloat(matches[1]) || 0;
|
|
68
67
|
|
|
69
|
-
// ../loader-utils/src/lib/path-utils/file-aliases.ts
|
|
70
|
-
var pathPrefix = "";
|
|
71
|
-
var fileAliases = {};
|
|
72
|
-
function resolvePath(filename) {
|
|
73
|
-
for (const alias in fileAliases) {
|
|
74
|
-
if (filename.startsWith(alias)) {
|
|
75
|
-
const replacement = fileAliases[alias];
|
|
76
|
-
filename = filename.replace(alias, replacement);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
if (!filename.startsWith("http://") && !filename.startsWith("https://")) {
|
|
80
|
-
filename = `${pathPrefix}${filename}`;
|
|
81
|
-
}
|
|
82
|
-
return filename;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
68
|
// src/lib/category-api/image-type.ts
|
|
86
69
|
var parseImageNode = globalThis.loaders?.parseImageNode;
|
|
87
70
|
var IMAGE_SUPPORTED = typeof Image !== "undefined";
|
|
@@ -571,8 +554,8 @@ var __exports__ = (() => {
|
|
|
571
554
|
}
|
|
572
555
|
function checkNodeImageFormatSupport(mimeType) {
|
|
573
556
|
const NODE_FORMAT_SUPPORT = ["image/png", "image/jpeg", "image/gif"];
|
|
574
|
-
const parseImageNode2 = globalThis.loaders?.parseImageNode;
|
|
575
557
|
const imageFormatsNode = globalThis.loaders?.imageFormatsNode || NODE_FORMAT_SUPPORT;
|
|
558
|
+
const parseImageNode2 = globalThis.loaders?.parseImageNode;
|
|
576
559
|
return Boolean(parseImageNode2) && imageFormatsNode.includes(mimeType);
|
|
577
560
|
}
|
|
578
561
|
function checkBrowserImageFormatSupport(mimeType) {
|
|
@@ -609,112 +592,6 @@ var __exports__ = (() => {
|
|
|
609
592
|
image.onerror = () => resolve(false);
|
|
610
593
|
});
|
|
611
594
|
}
|
|
612
|
-
|
|
613
|
-
// src/lib/texture-api/generate-url.ts
|
|
614
|
-
function generateUrl(getUrl, options, urlOptions) {
|
|
615
|
-
let url = getUrl;
|
|
616
|
-
if (typeof getUrl === "function") {
|
|
617
|
-
url = getUrl({
|
|
618
|
-
...options,
|
|
619
|
-
...urlOptions
|
|
620
|
-
});
|
|
621
|
-
}
|
|
622
|
-
assert(typeof url === "string");
|
|
623
|
-
const {
|
|
624
|
-
baseUrl
|
|
625
|
-
} = options;
|
|
626
|
-
if (baseUrl) {
|
|
627
|
-
url = baseUrl[baseUrl.length - 1] === "/" ? `${baseUrl}${url}` : `${baseUrl}/${url}`;
|
|
628
|
-
}
|
|
629
|
-
return resolvePath(url);
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
// src/lib/texture-api/async-deep-map.ts
|
|
633
|
-
var isObject = (value) => value && typeof value === "object";
|
|
634
|
-
async function asyncDeepMap(tree, func, options = {}) {
|
|
635
|
-
return await mapSubtree(tree, func, options);
|
|
636
|
-
}
|
|
637
|
-
async function mapSubtree(object, func, options) {
|
|
638
|
-
if (Array.isArray(object)) {
|
|
639
|
-
return await mapArray(object, func, options);
|
|
640
|
-
}
|
|
641
|
-
if (isObject(object)) {
|
|
642
|
-
return await mapObject(object, func, options);
|
|
643
|
-
}
|
|
644
|
-
const url = object;
|
|
645
|
-
return await func(url, options);
|
|
646
|
-
}
|
|
647
|
-
async function mapObject(object, func, options) {
|
|
648
|
-
const promises = [];
|
|
649
|
-
const values = {};
|
|
650
|
-
for (const key in object) {
|
|
651
|
-
const url = object[key];
|
|
652
|
-
const promise = mapSubtree(url, func, options).then((value) => {
|
|
653
|
-
values[key] = value;
|
|
654
|
-
});
|
|
655
|
-
promises.push(promise);
|
|
656
|
-
}
|
|
657
|
-
await Promise.all(promises);
|
|
658
|
-
return values;
|
|
659
|
-
}
|
|
660
|
-
async function mapArray(urlArray, func, options = {}) {
|
|
661
|
-
const promises = urlArray.map((url) => mapSubtree(url, func, options));
|
|
662
|
-
return await Promise.all(promises);
|
|
663
|
-
}
|
|
664
|
-
|
|
665
|
-
// src/lib/texture-api/deep-load.ts
|
|
666
|
-
async function deepLoad(urlTree, load, options) {
|
|
667
|
-
return await asyncDeepMap(urlTree, (url) => shallowLoad(url, load, options));
|
|
668
|
-
}
|
|
669
|
-
async function shallowLoad(url, load, options) {
|
|
670
|
-
const response = await fetch(url, options.fetch);
|
|
671
|
-
const arrayBuffer = await response.arrayBuffer();
|
|
672
|
-
return await load(arrayBuffer, options);
|
|
673
|
-
}
|
|
674
|
-
|
|
675
|
-
// src/lib/texture-api/load-image.ts
|
|
676
|
-
async function loadImage(getUrl, options = {}) {
|
|
677
|
-
const imageUrls = await getImageUrls(getUrl, options);
|
|
678
|
-
return await deepLoad(imageUrls, parseImage, options);
|
|
679
|
-
}
|
|
680
|
-
async function getImageUrls(getUrl, options, urlOptions = {}) {
|
|
681
|
-
const mipLevels = options && options.image && options.image.mipLevels || 0;
|
|
682
|
-
return mipLevels !== 0 ? await getMipmappedImageUrls(getUrl, mipLevels, options, urlOptions) : generateUrl(getUrl, options, urlOptions);
|
|
683
|
-
}
|
|
684
|
-
async function getMipmappedImageUrls(getUrl, mipLevels, options, urlOptions) {
|
|
685
|
-
const urls = [];
|
|
686
|
-
if (mipLevels === "auto") {
|
|
687
|
-
const url = generateUrl(getUrl, options, {
|
|
688
|
-
...urlOptions,
|
|
689
|
-
lod: 0
|
|
690
|
-
});
|
|
691
|
-
const image = await shallowLoad(url, parseImage, options);
|
|
692
|
-
const {
|
|
693
|
-
width,
|
|
694
|
-
height
|
|
695
|
-
} = getImageSize(image);
|
|
696
|
-
mipLevels = getMipLevels({
|
|
697
|
-
width,
|
|
698
|
-
height
|
|
699
|
-
});
|
|
700
|
-
urls.push(url);
|
|
701
|
-
}
|
|
702
|
-
assert(mipLevels > 0);
|
|
703
|
-
for (let mipLevel = urls.length; mipLevel < mipLevels; ++mipLevel) {
|
|
704
|
-
const url = generateUrl(getUrl, options, {
|
|
705
|
-
...urlOptions,
|
|
706
|
-
lod: mipLevel
|
|
707
|
-
});
|
|
708
|
-
urls.push(url);
|
|
709
|
-
}
|
|
710
|
-
return urls;
|
|
711
|
-
}
|
|
712
|
-
function getMipLevels({
|
|
713
|
-
width,
|
|
714
|
-
height
|
|
715
|
-
}) {
|
|
716
|
-
return 1 + Math.floor(Math.log2(Math.max(width, height)));
|
|
717
|
-
}
|
|
718
595
|
return __toCommonJS(src_exports);
|
|
719
596
|
})();
|
|
720
597
|
return __exports__;
|
package/dist/index.cjs
CHANGED
|
@@ -30,8 +30,7 @@ __export(src_exports, {
|
|
|
30
30
|
getSupportedImageFormats: () => getSupportedImageFormats,
|
|
31
31
|
isImage: () => isImage,
|
|
32
32
|
isImageFormatSupported: () => isImageFormatSupported,
|
|
33
|
-
isImageTypeSupported: () => isImageTypeSupported
|
|
34
|
-
loadImage: () => loadImage
|
|
33
|
+
isImageTypeSupported: () => isImageTypeSupported
|
|
35
34
|
});
|
|
36
35
|
module.exports = __toCommonJS(src_exports);
|
|
37
36
|
|
|
@@ -560,8 +559,8 @@ function isImageFormatSupported(mimeType) {
|
|
|
560
559
|
function checkNodeImageFormatSupport(mimeType) {
|
|
561
560
|
var _a3, _b;
|
|
562
561
|
const NODE_FORMAT_SUPPORT = ["image/png", "image/jpeg", "image/gif"];
|
|
563
|
-
const
|
|
564
|
-
const
|
|
562
|
+
const imageFormatsNode = ((_a3 = globalThis.loaders) == null ? void 0 : _a3.imageFormatsNode) || NODE_FORMAT_SUPPORT;
|
|
563
|
+
const parseImageNode2 = (_b = globalThis.loaders) == null ? void 0 : _b.parseImageNode;
|
|
565
564
|
return Boolean(parseImageNode2) && imageFormatsNode.includes(mimeType);
|
|
566
565
|
}
|
|
567
566
|
function checkBrowserImageFormatSupport(mimeType) {
|
|
@@ -599,93 +598,3 @@ async function testBrowserImageFormatSupportAsync(testImageDataURL) {
|
|
|
599
598
|
image.onerror = () => resolve(false);
|
|
600
599
|
});
|
|
601
600
|
}
|
|
602
|
-
|
|
603
|
-
// src/lib/texture-api/load-image.ts
|
|
604
|
-
var import_loader_utils6 = require("@loaders.gl/loader-utils");
|
|
605
|
-
|
|
606
|
-
// src/lib/texture-api/generate-url.ts
|
|
607
|
-
var import_loader_utils5 = require("@loaders.gl/loader-utils");
|
|
608
|
-
function generateUrl(getUrl, options, urlOptions) {
|
|
609
|
-
let url = getUrl;
|
|
610
|
-
if (typeof getUrl === "function") {
|
|
611
|
-
url = getUrl({ ...options, ...urlOptions });
|
|
612
|
-
}
|
|
613
|
-
(0, import_loader_utils5.assert)(typeof url === "string");
|
|
614
|
-
const { baseUrl } = options;
|
|
615
|
-
if (baseUrl) {
|
|
616
|
-
url = baseUrl[baseUrl.length - 1] === "/" ? `${baseUrl}${url}` : `${baseUrl}/${url}`;
|
|
617
|
-
}
|
|
618
|
-
return (0, import_loader_utils5.resolvePath)(url);
|
|
619
|
-
}
|
|
620
|
-
|
|
621
|
-
// src/lib/texture-api/async-deep-map.ts
|
|
622
|
-
var isObject = (value) => value && typeof value === "object";
|
|
623
|
-
async function asyncDeepMap(tree, func, options = {}) {
|
|
624
|
-
return await mapSubtree(tree, func, options);
|
|
625
|
-
}
|
|
626
|
-
async function mapSubtree(object, func, options) {
|
|
627
|
-
if (Array.isArray(object)) {
|
|
628
|
-
return await mapArray(object, func, options);
|
|
629
|
-
}
|
|
630
|
-
if (isObject(object)) {
|
|
631
|
-
return await mapObject(object, func, options);
|
|
632
|
-
}
|
|
633
|
-
const url = object;
|
|
634
|
-
return await func(url, options);
|
|
635
|
-
}
|
|
636
|
-
async function mapObject(object, func, options) {
|
|
637
|
-
const promises = [];
|
|
638
|
-
const values = {};
|
|
639
|
-
for (const key in object) {
|
|
640
|
-
const url = object[key];
|
|
641
|
-
const promise = mapSubtree(url, func, options).then((value) => {
|
|
642
|
-
values[key] = value;
|
|
643
|
-
});
|
|
644
|
-
promises.push(promise);
|
|
645
|
-
}
|
|
646
|
-
await Promise.all(promises);
|
|
647
|
-
return values;
|
|
648
|
-
}
|
|
649
|
-
async function mapArray(urlArray, func, options = {}) {
|
|
650
|
-
const promises = urlArray.map((url) => mapSubtree(url, func, options));
|
|
651
|
-
return await Promise.all(promises);
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
// src/lib/texture-api/deep-load.ts
|
|
655
|
-
async function deepLoad(urlTree, load, options) {
|
|
656
|
-
return await asyncDeepMap(urlTree, (url) => shallowLoad(url, load, options));
|
|
657
|
-
}
|
|
658
|
-
async function shallowLoad(url, load, options) {
|
|
659
|
-
const response = await fetch(url, options.fetch);
|
|
660
|
-
const arrayBuffer = await response.arrayBuffer();
|
|
661
|
-
return await load(arrayBuffer, options);
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
// src/lib/texture-api/load-image.ts
|
|
665
|
-
async function loadImage(getUrl, options = {}) {
|
|
666
|
-
const imageUrls = await getImageUrls(getUrl, options);
|
|
667
|
-
return await deepLoad(imageUrls, parseImage, options);
|
|
668
|
-
}
|
|
669
|
-
async function getImageUrls(getUrl, options, urlOptions = {}) {
|
|
670
|
-
const mipLevels = options && options.image && options.image.mipLevels || 0;
|
|
671
|
-
return mipLevels !== 0 ? await getMipmappedImageUrls(getUrl, mipLevels, options, urlOptions) : generateUrl(getUrl, options, urlOptions);
|
|
672
|
-
}
|
|
673
|
-
async function getMipmappedImageUrls(getUrl, mipLevels, options, urlOptions) {
|
|
674
|
-
const urls = [];
|
|
675
|
-
if (mipLevels === "auto") {
|
|
676
|
-
const url = generateUrl(getUrl, options, { ...urlOptions, lod: 0 });
|
|
677
|
-
const image = await shallowLoad(url, parseImage, options);
|
|
678
|
-
const { width, height } = getImageSize(image);
|
|
679
|
-
mipLevels = getMipLevels({ width, height });
|
|
680
|
-
urls.push(url);
|
|
681
|
-
}
|
|
682
|
-
(0, import_loader_utils6.assert)(mipLevels > 0);
|
|
683
|
-
for (let mipLevel = urls.length; mipLevel < mipLevels; ++mipLevel) {
|
|
684
|
-
const url = generateUrl(getUrl, options, { ...urlOptions, lod: mipLevel });
|
|
685
|
-
urls.push(url);
|
|
686
|
-
}
|
|
687
|
-
return urls;
|
|
688
|
-
}
|
|
689
|
-
function getMipLevels({ width, height }) {
|
|
690
|
-
return 1 + Math.floor(Math.log2(Math.max(width, height)));
|
|
691
|
-
}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,5 +7,4 @@ export { isImageTypeSupported, getDefaultImageType } from './lib/category-api/im
|
|
|
7
7
|
export { isImage, getImageType, getImageSize, getImageData } from './lib/category-api/parsed-image-api';
|
|
8
8
|
export { getSupportedImageFormats } from './lib/category-api/image-format';
|
|
9
9
|
export { isImageFormatSupported } from './lib/category-api/image-format';
|
|
10
|
-
export { loadImage } from './lib/texture-api/load-image';
|
|
11
10
|
//# 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":"AACA,YAAY,EAAC,aAAa,EAAE,SAAS,EAAE,aAAa,EAAC,MAAM,SAAS,CAAC;AACrE,YAAY,EAAC,kBAAkB,EAAC,MAAM,gBAAgB,CAAC;AAGvD,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAK3C,OAAO,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAG3E,OAAO,EAAC,oBAAoB,EAAE,mBAAmB,EAAC,MAAM,+BAA+B,CAAC;AAExF,OAAO,EACL,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,YAAY,EACb,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EAAC,wBAAwB,EAAC,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAC,sBAAsB,EAAC,MAAM,iCAAiC,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAC,aAAa,EAAE,SAAS,EAAE,aAAa,EAAC,MAAM,SAAS,CAAC;AACrE,YAAY,EAAC,kBAAkB,EAAC,MAAM,gBAAgB,CAAC;AAGvD,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAK3C,OAAO,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAG3E,OAAO,EAAC,oBAAoB,EAAE,mBAAmB,EAAC,MAAM,+BAA+B,CAAC;AAExF,OAAO,EACL,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,YAAY,EACb,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EAAC,wBAAwB,EAAC,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAC,sBAAsB,EAAC,MAAM,iCAAiC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,5 +5,4 @@ export { isImageTypeSupported, getDefaultImageType } from "./lib/category-api/im
|
|
|
5
5
|
export { isImage, getImageType, getImageSize, getImageData } from "./lib/category-api/parsed-image-api.js";
|
|
6
6
|
export { getSupportedImageFormats } from "./lib/category-api/image-format.js";
|
|
7
7
|
export { isImageFormatSupported } from "./lib/category-api/image-format.js";
|
|
8
|
-
export { loadImage } from "./lib/texture-api/load-image.js";
|
|
9
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["ImageLoader","ImageWriter","getBinaryImageMetadata","isImageTypeSupported","getDefaultImageType","isImage","getImageType","getImageSize","getImageData","getSupportedImageFormats","isImageFormatSupported"
|
|
1
|
+
{"version":3,"file":"index.js","names":["ImageLoader","ImageWriter","getBinaryImageMetadata","isImageTypeSupported","getDefaultImageType","isImage","getImageType","getImageSize","getImageData","getSupportedImageFormats","isImageFormatSupported"],"sources":["../src/index.ts"],"sourcesContent":["// TYPES\nexport type {ImageDataType, ImageType, ImageTypeEnum} from './types';\nexport type {ImageLoaderOptions} from './image-loader';\n\n// LOADERS AND WRITERS\nexport {ImageLoader} from './image-loader';\nexport {ImageWriter} from './image-writer';\n\n// IMAGE CATEGORY API\n\n// Binary Image API\nexport {getBinaryImageMetadata} from './lib/category-api/binary-image-api';\n\n// Parsed Image API\nexport {isImageTypeSupported, getDefaultImageType} from './lib/category-api/image-type';\n\nexport {\n isImage,\n getImageType,\n getImageSize,\n getImageData\n} from './lib/category-api/parsed-image-api';\n\n// EXPERIMENTAL\nexport {getSupportedImageFormats} from './lib/category-api/image-format';\nexport {isImageFormatSupported} from './lib/category-api/image-format';\n"],"mappings":"SAKQA,WAAW;AAAA,SACXC,WAAW;AAAA,SAKXC,sBAAsB;AAAA,SAGtBC,oBAAoB,EAAEC,mBAAmB;AAAA,SAG/CC,OAAO,EACPC,YAAY,EACZC,YAAY,EACZC,YAAY;AAAA,SAINC,wBAAwB;AAAA,SACxBC,sBAAsB"}
|
|
@@ -25,8 +25,8 @@ export function isImageFormatSupported(mimeType) {
|
|
|
25
25
|
function checkNodeImageFormatSupport(mimeType) {
|
|
26
26
|
var _globalThis$loaders, _globalThis$loaders2;
|
|
27
27
|
const NODE_FORMAT_SUPPORT = ['image/png', 'image/jpeg', 'image/gif'];
|
|
28
|
-
const
|
|
29
|
-
const
|
|
28
|
+
const imageFormatsNode = ((_globalThis$loaders = globalThis.loaders) === null || _globalThis$loaders === void 0 ? void 0 : _globalThis$loaders.imageFormatsNode) || NODE_FORMAT_SUPPORT;
|
|
29
|
+
const parseImageNode = (_globalThis$loaders2 = globalThis.loaders) === null || _globalThis$loaders2 === void 0 ? void 0 : _globalThis$loaders2.parseImageNode;
|
|
30
30
|
return Boolean(parseImageNode) && imageFormatsNode.includes(mimeType);
|
|
31
31
|
}
|
|
32
32
|
function checkBrowserImageFormatSupport(mimeType) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-format.js","names":["isBrowser","MIME_TYPES","mimeTypeSupportedPromise","getSupportedImageFormats","supportedMimeTypes","Set","mimeType","supported","checkBrowserImageFormatSupportAsync","checkNodeImageFormatSupport","add","mimeTypeSupportedSync","isImageFormatSupported","undefined","checkBrowserImageFormatSupport","_globalThis$loaders","_globalThis$loaders2","NODE_FORMAT_SUPPORT","
|
|
1
|
+
{"version":3,"file":"image-format.js","names":["isBrowser","MIME_TYPES","mimeTypeSupportedPromise","getSupportedImageFormats","supportedMimeTypes","Set","mimeType","supported","checkBrowserImageFormatSupportAsync","checkNodeImageFormatSupport","add","mimeTypeSupportedSync","isImageFormatSupported","undefined","checkBrowserImageFormatSupport","_globalThis$loaders","_globalThis$loaders2","NODE_FORMAT_SUPPORT","imageFormatsNode","globalThis","loaders","parseImageNode","Boolean","includes","testBrowserImageFormatSupport","TEST_IMAGE","dataURL","testBrowserImageFormatSupportAsync","element","document","createElement","toDataURL","indexOf","testImageDataURL","Promise","resolve","image","Image","src","onload","height","onerror"],"sources":["../../../src/lib/category-api/image-format.ts"],"sourcesContent":["// loaders.gl, MIT license\n\nimport {isBrowser} from '@loaders.gl/loader-utils';\n\nconst MIME_TYPES = [\n 'image/png',\n 'image/jpeg',\n 'image/gif',\n 'image/webp',\n 'image/avif',\n 'image/tiff',\n // TODO - what is the correct type for SVG\n 'image/svg',\n 'image/svg+xml',\n 'image/bmp',\n 'image/vnd.microsoft.icon'\n];\n\n/** Only one round of tests is performed */\nconst mimeTypeSupportedPromise: Promise<Set<string>> | null = null;\n\n/** Run-time browser detection of file formats requires async tests for most precise results */\nexport async function getSupportedImageFormats(): Promise<Set<string>> {\n if (mimeTypeSupportedPromise) {\n return await mimeTypeSupportedPromise;\n }\n\n const supportedMimeTypes = new Set<string>();\n for (const mimeType of MIME_TYPES) {\n const supported = isBrowser\n ? await checkBrowserImageFormatSupportAsync(mimeType)\n : checkNodeImageFormatSupport(mimeType);\n if (supported) {\n supportedMimeTypes.add(mimeType);\n }\n }\n\n return supportedMimeTypes;\n}\n\n/** Cache sync values for speed */\nconst mimeTypeSupportedSync: {[mimeType: string]: boolean} = {};\n\n/**\n * Check if image MIME type is supported. Result is cached to avoid repeated tests.\n */\nexport function isImageFormatSupported(mimeType: string): boolean {\n if (mimeTypeSupportedSync[mimeType] === undefined) {\n const supported = isBrowser\n ? checkBrowserImageFormatSupport(mimeType)\n : checkNodeImageFormatSupport(mimeType);\n mimeTypeSupportedSync[mimeType] = supported;\n }\n return mimeTypeSupportedSync[mimeType];\n}\n\n/**\n * Checks that polyfills are installed and that mimeType is supported by polyfills\n * @todo Ideally polyfills should declare what formats they support, instead of storing that data here.\n */\nfunction checkNodeImageFormatSupport(mimeType: string): boolean {\n const NODE_FORMAT_SUPPORT = ['image/png', 'image/jpeg', 'image/gif'];\n const imageFormatsNode = globalThis.loaders?.imageFormatsNode || NODE_FORMAT_SUPPORT;\n const parseImageNode = globalThis.loaders?.parseImageNode;\n return Boolean(parseImageNode) && imageFormatsNode.includes(mimeType);\n}\n\n/** Checks image format support synchronously.\n * @note Unreliable, fails on AVIF\n */\nfunction checkBrowserImageFormatSupport(mimeType: string): boolean {\n switch (mimeType) {\n case 'image/avif': // Will fail\n case 'image/webp':\n return testBrowserImageFormatSupport(mimeType);\n default:\n return true;\n }\n}\n\nconst TEST_IMAGE = {\n 'image/avif':\n 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A=',\n // Lossy test image. Support for lossy images doesn't guarantee support for all WebP images.\n 'image/webp': 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA'\n};\n\n/** Checks WebP and AVIF support asynchronously */\nasync function checkBrowserImageFormatSupportAsync(mimeType: string): Promise<boolean> {\n const dataURL = TEST_IMAGE[mimeType];\n return dataURL ? await testBrowserImageFormatSupportAsync(dataURL) : true;\n}\n\n/**\n * Checks browser synchronously\n * Checks if toDataURL supports the mimeType.\n * @note Imperfect testOn Chrome this is true for WebP but not for AVIF\n */\nfunction testBrowserImageFormatSupport(mimeType: string): boolean {\n try {\n const element = document.createElement('canvas');\n const dataURL = element.toDataURL(mimeType);\n return dataURL.indexOf(`data:${mimeType}`) === 0;\n } catch {\n // Probably Safari...\n return false;\n }\n}\n\n// Check WebPSupport asynchronously\nasync function testBrowserImageFormatSupportAsync(testImageDataURL: string): Promise<boolean> {\n return new Promise((resolve) => {\n const image = new Image();\n image.src = testImageDataURL;\n image.onload = () => resolve(image.height > 0);\n image.onerror = () => resolve(false);\n });\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loaders.gl/images",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.6",
|
|
4
4
|
"description": "Framework-independent loaders and writers for images (PNG, JPG, ...)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -40,9 +40,9 @@
|
|
|
40
40
|
"build-bundle": "ocular-bundle ./src/index.ts"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@loaders.gl/loader-utils": "4.0.0-beta.
|
|
43
|
+
"@loaders.gl/loader-utils": "4.0.0-beta.6"
|
|
44
44
|
},
|
|
45
|
-
"gitHead": "
|
|
45
|
+
"gitHead": "2840f605b7a551e2ffef5f960231d989a0414c50",
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@types/get-pixels": "^3.3.2"
|
|
48
48
|
}
|
package/src/index.ts
CHANGED
|
@@ -24,6 +24,3 @@ export {
|
|
|
24
24
|
// EXPERIMENTAL
|
|
25
25
|
export {getSupportedImageFormats} from './lib/category-api/image-format';
|
|
26
26
|
export {isImageFormatSupported} from './lib/category-api/image-format';
|
|
27
|
-
|
|
28
|
-
// DEPRECATED - Remove in V4 (fix dependency in luma.gl)
|
|
29
|
-
export {loadImage} from './lib/texture-api/load-image';
|
|
@@ -59,10 +59,9 @@ export function isImageFormatSupported(mimeType: string): boolean {
|
|
|
59
59
|
* @todo Ideally polyfills should declare what formats they support, instead of storing that data here.
|
|
60
60
|
*/
|
|
61
61
|
function checkNodeImageFormatSupport(mimeType: string): boolean {
|
|
62
|
-
/** @deprecated Remove these in 4.0 and rely on polyfills to inject them */
|
|
63
62
|
const NODE_FORMAT_SUPPORT = ['image/png', 'image/jpeg', 'image/gif'];
|
|
64
|
-
const parseImageNode = globalThis.loaders?.parseImageNode;
|
|
65
63
|
const imageFormatsNode = globalThis.loaders?.imageFormatsNode || NODE_FORMAT_SUPPORT;
|
|
64
|
+
const parseImageNode = globalThis.loaders?.parseImageNode;
|
|
66
65
|
return Boolean(parseImageNode) && imageFormatsNode.includes(mimeType);
|
|
67
66
|
}
|
|
68
67
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"async-deep-map.d.ts","sourceRoot":"","sources":["../../../src/lib/texture-api/async-deep-map.ts"],"names":[],"mappings":"AAqBA,wBAAsB,YAAY,CAAC,IAAI,KAAA,EAAE,IAAI,KAAA,EAAE,OAAO,KAAK,gBAE1D;AAED,wBAAsB,UAAU,CAAC,MAAM,KAAA,EAAE,IAAI,KAAA,EAAE,OAAO,KAAA,gBAYrD"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
const isObject = value => value && typeof value === 'object';
|
|
2
|
-
export async function asyncDeepMap(tree, func) {
|
|
3
|
-
let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
4
|
-
return await mapSubtree(tree, func, options);
|
|
5
|
-
}
|
|
6
|
-
export async function mapSubtree(object, func, options) {
|
|
7
|
-
if (Array.isArray(object)) {
|
|
8
|
-
return await mapArray(object, func, options);
|
|
9
|
-
}
|
|
10
|
-
if (isObject(object)) {
|
|
11
|
-
return await mapObject(object, func, options);
|
|
12
|
-
}
|
|
13
|
-
const url = object;
|
|
14
|
-
return await func(url, options);
|
|
15
|
-
}
|
|
16
|
-
async function mapObject(object, func, options) {
|
|
17
|
-
const promises = [];
|
|
18
|
-
const values = {};
|
|
19
|
-
for (const key in object) {
|
|
20
|
-
const url = object[key];
|
|
21
|
-
const promise = mapSubtree(url, func, options).then(value => {
|
|
22
|
-
values[key] = value;
|
|
23
|
-
});
|
|
24
|
-
promises.push(promise);
|
|
25
|
-
}
|
|
26
|
-
await Promise.all(promises);
|
|
27
|
-
return values;
|
|
28
|
-
}
|
|
29
|
-
async function mapArray(urlArray, func) {
|
|
30
|
-
let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
31
|
-
const promises = urlArray.map(url => mapSubtree(url, func, options));
|
|
32
|
-
return await Promise.all(promises);
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=async-deep-map.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"async-deep-map.js","names":["isObject","value","asyncDeepMap","tree","func","options","arguments","length","undefined","mapSubtree","object","Array","isArray","mapArray","mapObject","url","promises","values","key","promise","then","push","Promise","all","urlArray","map"],"sources":["../../../src/lib/texture-api/async-deep-map.ts"],"sourcesContent":["/*\nAsynchronously maps a deep structure of values (e.g. objects and arrays of urls).\n\nE.g. a mipmapped cubemap\n{\n [CUBE_FACE_FRONT]: [\n \"image-front-0.jpg\",\n \"image-front-1.jpg\",\n \"image-front-2.jpg\",\n ],\n [CUBE_MAP_BACK]: [\n ...\n ]\n}\n*/\n\nconst isObject = (value) => value && typeof value === 'object';\n\n// Loads a deep structure of urls (objects and arrays of urls)\n// Returns an object with six key-value pairs containing the images (or image mip arrays)\n// for each cube face\nexport async function asyncDeepMap(tree, func, options = {}) {\n return await mapSubtree(tree, func, options);\n}\n\nexport async function mapSubtree(object, func, options) {\n if (Array.isArray(object)) {\n return await mapArray(object, func, options);\n }\n\n if (isObject(object)) {\n return await mapObject(object, func, options);\n }\n\n // TODO - ignore non-urls, non-arraybuffers?\n const url = object;\n return await func(url, options);\n}\n\n// HELPERS\n\nasync function mapObject(object, func, options) {\n const promises: Promise<any>[] = [];\n const values = {};\n\n for (const key in object) {\n const url = object[key];\n const promise = mapSubtree(url, func, options).then((value) => {\n values[key] = value;\n });\n promises.push(promise);\n }\n\n await Promise.all(promises);\n\n return values;\n}\n\nasync function mapArray(urlArray, func, options = {}) {\n const promises = urlArray.map((url) => mapSubtree(url, func, options));\n return await Promise.all(promises);\n}\n"],"mappings":"AAgBA,MAAMA,QAAQ,GAAIC,KAAK,IAAKA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ;AAK9D,OAAO,eAAeC,YAAYA,CAACC,IAAI,EAAEC,IAAI,EAAgB;EAAA,IAAdC,OAAO,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EACzD,OAAO,MAAMG,UAAU,CAACN,IAAI,EAAEC,IAAI,EAAEC,OAAO,CAAC;AAC9C;AAEA,OAAO,eAAeI,UAAUA,CAACC,MAAM,EAAEN,IAAI,EAAEC,OAAO,EAAE;EACtD,IAAIM,KAAK,CAACC,OAAO,CAACF,MAAM,CAAC,EAAE;IACzB,OAAO,MAAMG,QAAQ,CAACH,MAAM,EAAEN,IAAI,EAAEC,OAAO,CAAC;EAC9C;EAEA,IAAIL,QAAQ,CAACU,MAAM,CAAC,EAAE;IACpB,OAAO,MAAMI,SAAS,CAACJ,MAAM,EAAEN,IAAI,EAAEC,OAAO,CAAC;EAC/C;EAGA,MAAMU,GAAG,GAAGL,MAAM;EAClB,OAAO,MAAMN,IAAI,CAACW,GAAG,EAAEV,OAAO,CAAC;AACjC;AAIA,eAAeS,SAASA,CAACJ,MAAM,EAAEN,IAAI,EAAEC,OAAO,EAAE;EAC9C,MAAMW,QAAwB,GAAG,EAAE;EACnC,MAAMC,MAAM,GAAG,CAAC,CAAC;EAEjB,KAAK,MAAMC,GAAG,IAAIR,MAAM,EAAE;IACxB,MAAMK,GAAG,GAAGL,MAAM,CAACQ,GAAG,CAAC;IACvB,MAAMC,OAAO,GAAGV,UAAU,CAACM,GAAG,EAAEX,IAAI,EAAEC,OAAO,CAAC,CAACe,IAAI,CAAEnB,KAAK,IAAK;MAC7DgB,MAAM,CAACC,GAAG,CAAC,GAAGjB,KAAK;IACrB,CAAC,CAAC;IACFe,QAAQ,CAACK,IAAI,CAACF,OAAO,CAAC;EACxB;EAEA,MAAMG,OAAO,CAACC,GAAG,CAACP,QAAQ,CAAC;EAE3B,OAAOC,MAAM;AACf;AAEA,eAAeJ,QAAQA,CAACW,QAAQ,EAAEpB,IAAI,EAAgB;EAAA,IAAdC,OAAO,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAClD,MAAMU,QAAQ,GAAGQ,QAAQ,CAACC,GAAG,CAAEV,GAAG,IAAKN,UAAU,CAACM,GAAG,EAAEX,IAAI,EAAEC,OAAO,CAAC,CAAC;EACtE,OAAO,MAAMiB,OAAO,CAACC,GAAG,CAACP,QAAQ,CAAC;AACpC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deep-load.d.ts","sourceRoot":"","sources":["../../../src/lib/texture-api/deep-load.ts"],"names":[],"mappings":"AAEA,wBAAsB,QAAQ,CAAC,OAAO,KAAA,EAAE,IAAI,KAAA,EAAE,OAAO,KAAA,gBAEpD;AAED,wBAAsB,WAAW,CAAC,GAAG,KAAA,EAAE,IAAI,KAAA,EAAE,OAAO,KAAA,gBAInD"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { asyncDeepMap } from "./async-deep-map.js";
|
|
2
|
-
export async function deepLoad(urlTree, load, options) {
|
|
3
|
-
return await asyncDeepMap(urlTree, url => shallowLoad(url, load, options));
|
|
4
|
-
}
|
|
5
|
-
export async function shallowLoad(url, load, options) {
|
|
6
|
-
const response = await fetch(url, options.fetch);
|
|
7
|
-
const arrayBuffer = await response.arrayBuffer();
|
|
8
|
-
return await load(arrayBuffer, options);
|
|
9
|
-
}
|
|
10
|
-
//# sourceMappingURL=deep-load.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deep-load.js","names":["asyncDeepMap","deepLoad","urlTree","load","options","url","shallowLoad","response","fetch","arrayBuffer"],"sources":["../../../src/lib/texture-api/deep-load.ts"],"sourcesContent":["import {asyncDeepMap} from './async-deep-map';\n\nexport async function deepLoad(urlTree, load, options) {\n return await asyncDeepMap(urlTree, (url) => shallowLoad(url, load, options));\n}\n\nexport async function shallowLoad(url, load, options) {\n const response = await fetch(url, options.fetch);\n const arrayBuffer = await response.arrayBuffer();\n return await load(arrayBuffer, options);\n}\n"],"mappings":"SAAQA,YAAY;AAEpB,OAAO,eAAeC,QAAQA,CAACC,OAAO,EAAEC,IAAI,EAAEC,OAAO,EAAE;EACrD,OAAO,MAAMJ,YAAY,CAACE,OAAO,EAAGG,GAAG,IAAKC,WAAW,CAACD,GAAG,EAAEF,IAAI,EAAEC,OAAO,CAAC,CAAC;AAC9E;AAEA,OAAO,eAAeE,WAAWA,CAACD,GAAG,EAAEF,IAAI,EAAEC,OAAO,EAAE;EACpD,MAAMG,QAAQ,GAAG,MAAMC,KAAK,CAACH,GAAG,EAAED,OAAO,CAACI,KAAK,CAAC;EAChD,MAAMC,WAAW,GAAG,MAAMF,QAAQ,CAACE,WAAW,CAAC,CAAC;EAChD,OAAO,MAAMN,IAAI,CAACM,WAAW,EAAEL,OAAO,CAAC;AACzC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate-url.d.ts","sourceRoot":"","sources":["../../../src/lib/texture-api/generate-url.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,CAAC,MAAM,KAAA,EAAE,OAAO,KAAA,EAAE,UAAU,KAAA,UAetD"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { resolvePath, assert } from '@loaders.gl/loader-utils';
|
|
2
|
-
export function generateUrl(getUrl, options, urlOptions) {
|
|
3
|
-
let url = getUrl;
|
|
4
|
-
if (typeof getUrl === 'function') {
|
|
5
|
-
url = getUrl({
|
|
6
|
-
...options,
|
|
7
|
-
...urlOptions
|
|
8
|
-
});
|
|
9
|
-
}
|
|
10
|
-
assert(typeof url === 'string');
|
|
11
|
-
const {
|
|
12
|
-
baseUrl
|
|
13
|
-
} = options;
|
|
14
|
-
if (baseUrl) {
|
|
15
|
-
url = baseUrl[baseUrl.length - 1] === '/' ? `${baseUrl}${url}` : `${baseUrl}/${url}`;
|
|
16
|
-
}
|
|
17
|
-
return resolvePath(url);
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=generate-url.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate-url.js","names":["resolvePath","assert","generateUrl","getUrl","options","urlOptions","url","baseUrl","length"],"sources":["../../../src/lib/texture-api/generate-url.ts"],"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"],"mappings":"AAAA,SAAQA,WAAW,EAAEC,MAAM,QAAO,0BAA0B;AAG5D,OAAO,SAASC,WAAWA,CAACC,MAAM,EAAEC,OAAO,EAAEC,UAAU,EAAE;EAEvD,IAAIC,GAAG,GAAGH,MAAM;EAChB,IAAI,OAAOA,MAAM,KAAK,UAAU,EAAE;IAChCG,GAAG,GAAGH,MAAM,CAAC;MAAC,GAAGC,OAAO;MAAE,GAAGC;IAAU,CAAC,CAAC;EAC3C;EACAJ,MAAM,CAAC,OAAOK,GAAG,KAAK,QAAQ,CAAC;EAG/B,MAAM;IAACC;EAAO,CAAC,GAAGH,OAAO;EACzB,IAAIG,OAAO,EAAE;IACXD,GAAG,GAAGC,OAAO,CAACA,OAAO,CAACC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,GAAI,GAAED,OAAQ,GAAED,GAAI,EAAC,GAAI,GAAEC,OAAQ,IAAGD,GAAI,EAAC;EACtF;EAEA,OAAON,WAAW,CAACM,GAAG,CAAC;AACzB"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export declare function loadImage(getUrl: any, options?: {}): Promise<any>;
|
|
2
|
-
export declare function getImageUrls(getUrl: any, options: any, urlOptions?: {}): Promise<string | string[]>;
|
|
3
|
-
export declare function getMipLevels({ width, height }: {
|
|
4
|
-
width: any;
|
|
5
|
-
height: any;
|
|
6
|
-
}): number;
|
|
7
|
-
//# sourceMappingURL=load-image.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"load-image.d.ts","sourceRoot":"","sources":["../../../src/lib/texture-api/load-image.ts"],"names":[],"mappings":"AAMA,wBAAsB,SAAS,CAAC,MAAM,KAAA,EAAE,OAAO,KAAK,gBAGnD;AAED,wBAAsB,YAAY,CAAC,MAAM,KAAA,EAAE,OAAO,KAAA,EAAE,UAAU,KAAK,8BAKlE;AA6BD,wBAAgB,YAAY,CAAC,EAAC,KAAK,EAAE,MAAM,EAAC;;;CAAA,UAE3C"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { assert } from '@loaders.gl/loader-utils';
|
|
2
|
-
import { parseImage } from "../parsers/parse-image.js";
|
|
3
|
-
import { getImageSize } from "../category-api/parsed-image-api.js";
|
|
4
|
-
import { generateUrl } from "./generate-url.js";
|
|
5
|
-
import { deepLoad, shallowLoad } from "./deep-load.js";
|
|
6
|
-
export async function loadImage(getUrl) {
|
|
7
|
-
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
8
|
-
const imageUrls = await getImageUrls(getUrl, options);
|
|
9
|
-
return await deepLoad(imageUrls, parseImage, options);
|
|
10
|
-
}
|
|
11
|
-
export async function getImageUrls(getUrl, options) {
|
|
12
|
-
let urlOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
13
|
-
const mipLevels = options && options.image && options.image.mipLevels || 0;
|
|
14
|
-
return mipLevels !== 0 ? await getMipmappedImageUrls(getUrl, mipLevels, options, urlOptions) : generateUrl(getUrl, options, urlOptions);
|
|
15
|
-
}
|
|
16
|
-
async function getMipmappedImageUrls(getUrl, mipLevels, options, urlOptions) {
|
|
17
|
-
const urls = [];
|
|
18
|
-
if (mipLevels === 'auto') {
|
|
19
|
-
const url = generateUrl(getUrl, options, {
|
|
20
|
-
...urlOptions,
|
|
21
|
-
lod: 0
|
|
22
|
-
});
|
|
23
|
-
const image = await shallowLoad(url, parseImage, options);
|
|
24
|
-
const {
|
|
25
|
-
width,
|
|
26
|
-
height
|
|
27
|
-
} = getImageSize(image);
|
|
28
|
-
mipLevels = getMipLevels({
|
|
29
|
-
width,
|
|
30
|
-
height
|
|
31
|
-
});
|
|
32
|
-
urls.push(url);
|
|
33
|
-
}
|
|
34
|
-
assert(mipLevels > 0);
|
|
35
|
-
for (let mipLevel = urls.length; mipLevel < mipLevels; ++mipLevel) {
|
|
36
|
-
const url = generateUrl(getUrl, options, {
|
|
37
|
-
...urlOptions,
|
|
38
|
-
lod: mipLevel
|
|
39
|
-
});
|
|
40
|
-
urls.push(url);
|
|
41
|
-
}
|
|
42
|
-
return urls;
|
|
43
|
-
}
|
|
44
|
-
export function getMipLevels(_ref) {
|
|
45
|
-
let {
|
|
46
|
-
width,
|
|
47
|
-
height
|
|
48
|
-
} = _ref;
|
|
49
|
-
return 1 + Math.floor(Math.log2(Math.max(width, height)));
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=load-image.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"load-image.js","names":["assert","parseImage","getImageSize","generateUrl","deepLoad","shallowLoad","loadImage","getUrl","options","arguments","length","undefined","imageUrls","getImageUrls","urlOptions","mipLevels","image","getMipmappedImageUrls","urls","url","lod","width","height","getMipLevels","push","mipLevel","_ref","Math","floor","log2","max"],"sources":["../../../src/lib/texture-api/load-image.ts"],"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"],"mappings":"AAAA,SAAQA,MAAM,QAAO,0BAA0B;AAAC,SACxCC,UAAU;AAAA,SACVC,YAAY;AAAA,SACZC,WAAW;AAAA,SACXC,QAAQ,EAAEC,WAAW;AAE7B,OAAO,eAAeC,SAASA,CAACC,MAAM,EAAgB;EAAA,IAAdC,OAAO,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAClD,MAAMG,SAAS,GAAG,MAAMC,YAAY,CAACN,MAAM,EAAEC,OAAO,CAAC;EACrD,OAAO,MAAMJ,QAAQ,CAACQ,SAAS,EAAEX,UAAU,EAAEO,OAAO,CAAC;AACvD;AAEA,OAAO,eAAeK,YAAYA,CAACN,MAAM,EAAEC,OAAO,EAAmB;EAAA,IAAjBM,UAAU,GAAAL,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EACjE,MAAMM,SAAS,GAAIP,OAAO,IAAIA,OAAO,CAACQ,KAAK,IAAIR,OAAO,CAACQ,KAAK,CAACD,SAAS,IAAK,CAAC;EAC5E,OAAOA,SAAS,KAAK,CAAC,GAClB,MAAME,qBAAqB,CAACV,MAAM,EAAEQ,SAAS,EAAEP,OAAO,EAAEM,UAAU,CAAC,GACnEX,WAAW,CAACI,MAAM,EAAEC,OAAO,EAAEM,UAAU,CAAC;AAC9C;AAEA,eAAeG,qBAAqBA,CAACV,MAAM,EAAEQ,SAAS,EAAEP,OAAO,EAAEM,UAAU,EAAE;EAC3E,MAAMI,IAAc,GAAG,EAAE;EAGzB,IAAIH,SAAS,KAAK,MAAM,EAAE;IACxB,MAAMI,GAAG,GAAGhB,WAAW,CAACI,MAAM,EAAEC,OAAO,EAAE;MAAC,GAAGM,UAAU;MAAEM,GAAG,EAAE;IAAC,CAAC,CAAC;IACjE,MAAMJ,KAAK,GAAG,MAAMX,WAAW,CAACc,GAAG,EAAElB,UAAU,EAAEO,OAAO,CAAC;IAEzD,MAAM;MAACa,KAAK;MAAEC;IAAM,CAAC,GAAGpB,YAAY,CAACc,KAAK,CAAC;IAC3CD,SAAS,GAAGQ,YAAY,CAAC;MAACF,KAAK;MAAEC;IAAM,CAAC,CAAC;IAGzCJ,IAAI,CAACM,IAAI,CAACL,GAAG,CAAC;EAChB;EAGAnB,MAAM,CAACe,SAAS,GAAG,CAAC,CAAC;EAErB,KAAK,IAAIU,QAAQ,GAAGP,IAAI,CAACR,MAAM,EAAEe,QAAQ,GAAGV,SAAS,EAAE,EAAEU,QAAQ,EAAE;IACjE,MAAMN,GAAG,GAAGhB,WAAW,CAACI,MAAM,EAAEC,OAAO,EAAE;MAAC,GAAGM,UAAU;MAAEM,GAAG,EAAEK;IAAQ,CAAC,CAAC;IACxEP,IAAI,CAACM,IAAI,CAACL,GAAG,CAAC;EAChB;EAEA,OAAOD,IAAI;AACb;AAGA,OAAO,SAASK,YAAYA,CAAAG,IAAA,EAAkB;EAAA,IAAjB;IAACL,KAAK;IAAEC;EAAM,CAAC,GAAAI,IAAA;EAC1C,OAAO,CAAC,GAAGC,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,IAAI,CAACF,IAAI,CAACG,GAAG,CAACT,KAAK,EAAEC,MAAM,CAAC,CAAC,CAAC;AAC3D"}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
Asynchronously maps a deep structure of values (e.g. objects and arrays of urls).
|
|
3
|
-
|
|
4
|
-
E.g. a mipmapped cubemap
|
|
5
|
-
{
|
|
6
|
-
[CUBE_FACE_FRONT]: [
|
|
7
|
-
"image-front-0.jpg",
|
|
8
|
-
"image-front-1.jpg",
|
|
9
|
-
"image-front-2.jpg",
|
|
10
|
-
],
|
|
11
|
-
[CUBE_MAP_BACK]: [
|
|
12
|
-
...
|
|
13
|
-
]
|
|
14
|
-
}
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
const isObject = (value) => value && typeof value === 'object';
|
|
18
|
-
|
|
19
|
-
// Loads a deep structure of urls (objects and arrays of urls)
|
|
20
|
-
// Returns an object with six key-value pairs containing the images (or image mip arrays)
|
|
21
|
-
// for each cube face
|
|
22
|
-
export async function asyncDeepMap(tree, func, options = {}) {
|
|
23
|
-
return await mapSubtree(tree, func, options);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export async function mapSubtree(object, func, options) {
|
|
27
|
-
if (Array.isArray(object)) {
|
|
28
|
-
return await mapArray(object, func, options);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
if (isObject(object)) {
|
|
32
|
-
return await mapObject(object, func, options);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// TODO - ignore non-urls, non-arraybuffers?
|
|
36
|
-
const url = object;
|
|
37
|
-
return await func(url, options);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// HELPERS
|
|
41
|
-
|
|
42
|
-
async function mapObject(object, func, options) {
|
|
43
|
-
const promises: Promise<any>[] = [];
|
|
44
|
-
const values = {};
|
|
45
|
-
|
|
46
|
-
for (const key in object) {
|
|
47
|
-
const url = object[key];
|
|
48
|
-
const promise = mapSubtree(url, func, options).then((value) => {
|
|
49
|
-
values[key] = value;
|
|
50
|
-
});
|
|
51
|
-
promises.push(promise);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
await Promise.all(promises);
|
|
55
|
-
|
|
56
|
-
return values;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
async function mapArray(urlArray, func, options = {}) {
|
|
60
|
-
const promises = urlArray.map((url) => mapSubtree(url, func, options));
|
|
61
|
-
return await Promise.all(promises);
|
|
62
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import {asyncDeepMap} from './async-deep-map';
|
|
2
|
-
|
|
3
|
-
export async function deepLoad(urlTree, load, options) {
|
|
4
|
-
return await asyncDeepMap(urlTree, (url) => shallowLoad(url, load, options));
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export async function shallowLoad(url, load, options) {
|
|
8
|
-
const response = await fetch(url, options.fetch);
|
|
9
|
-
const arrayBuffer = await response.arrayBuffer();
|
|
10
|
-
return await load(arrayBuffer, options);
|
|
11
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import {resolvePath, assert} from '@loaders.gl/loader-utils';
|
|
2
|
-
|
|
3
|
-
// Generate a url by calling getUrl with mix of options, applying options.baseUrl
|
|
4
|
-
export function generateUrl(getUrl, options, urlOptions) {
|
|
5
|
-
// Get url
|
|
6
|
-
let url = getUrl;
|
|
7
|
-
if (typeof getUrl === 'function') {
|
|
8
|
-
url = getUrl({...options, ...urlOptions});
|
|
9
|
-
}
|
|
10
|
-
assert(typeof url === 'string');
|
|
11
|
-
|
|
12
|
-
// Apply options.baseUrl
|
|
13
|
-
const {baseUrl} = options;
|
|
14
|
-
if (baseUrl) {
|
|
15
|
-
url = baseUrl[baseUrl.length - 1] === '/' ? `${baseUrl}${url}` : `${baseUrl}/${url}`;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
return resolvePath(url);
|
|
19
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import {assert} from '@loaders.gl/loader-utils';
|
|
2
|
-
import {parseImage} from '../parsers/parse-image';
|
|
3
|
-
import {getImageSize} from '../category-api/parsed-image-api';
|
|
4
|
-
import {generateUrl} from './generate-url';
|
|
5
|
-
import {deepLoad, shallowLoad} from './deep-load';
|
|
6
|
-
|
|
7
|
-
export async function loadImage(getUrl, options = {}) {
|
|
8
|
-
const imageUrls = await getImageUrls(getUrl, options);
|
|
9
|
-
return await deepLoad(imageUrls, parseImage, options);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export async function getImageUrls(getUrl, options, urlOptions = {}) {
|
|
13
|
-
const mipLevels = (options && options.image && options.image.mipLevels) || 0;
|
|
14
|
-
return mipLevels !== 0
|
|
15
|
-
? await getMipmappedImageUrls(getUrl, mipLevels, options, urlOptions)
|
|
16
|
-
: generateUrl(getUrl, options, urlOptions);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
async function getMipmappedImageUrls(getUrl, mipLevels, options, urlOptions) {
|
|
20
|
-
const urls: string[] = [];
|
|
21
|
-
|
|
22
|
-
// If no mip levels supplied, we need to load the level 0 image and calculate based on size
|
|
23
|
-
if (mipLevels === 'auto') {
|
|
24
|
-
const url = generateUrl(getUrl, options, {...urlOptions, lod: 0});
|
|
25
|
-
const image = await shallowLoad(url, parseImage, options);
|
|
26
|
-
|
|
27
|
-
const {width, height} = getImageSize(image);
|
|
28
|
-
mipLevels = getMipLevels({width, height});
|
|
29
|
-
|
|
30
|
-
// TODO - push image and make `deepLoad` pass through non-url values, avoid loading twice?
|
|
31
|
-
urls.push(url);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// We now know how many mipLevels we need, remaining image urls can now be constructed
|
|
35
|
-
assert(mipLevels > 0);
|
|
36
|
-
|
|
37
|
-
for (let mipLevel = urls.length; mipLevel < mipLevels; ++mipLevel) {
|
|
38
|
-
const url = generateUrl(getUrl, options, {...urlOptions, lod: mipLevel});
|
|
39
|
-
urls.push(url);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
return urls;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// Calculates number of mipmaps based on texture size (log2)
|
|
46
|
-
export function getMipLevels({width, height}) {
|
|
47
|
-
return 1 + Math.floor(Math.log2(Math.max(width, height)));
|
|
48
|
-
}
|