|
@@ -43,25 +43,23 @@ export async function loadImage(url: string): Promise<HTMLImageElement> {
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
+
|
|
-const weakedMapDataUrls = new WeakMap<Object, Map<string, string>>();
|
|
+let objectUrlMap = new Map<string, string>();
|
|
|
|
+const OBJECT_URLS_MAP_MAX_SIZE = 100;
|
|
|
|
+
|
|
export async function getDataUrlForSliceConfig(
|
|
export async function getDataUrlForSliceConfig(
|
|
image: HTMLImageElement,
|
|
image: HTMLImageElement,
|
|
sliceConfig: PictureSlice,
|
|
sliceConfig: PictureSlice,
|
|
maxSliceWidth: number,
|
|
maxSliceWidth: number,
|
|
urlForCache: string
|
|
urlForCache: string
|
|
) {
|
|
) {
|
|
-
|
|
+ const { i, x, y, w, h } = sliceConfig;
|
|
-
|
|
+ const key = `${urlForCache}-${i}-${x}-${y}-${w}-${h}`;
|
|
-
|
|
+
|
|
-
|
|
+ if (objectUrlMap.get(key)) {
|
|
-
|
|
+ console.log("cached slice objectUrl");
|
|
-
|
|
+ return objectUrlMap.get(key);
|
|
-
|
|
+ }
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
|
|
|
|
const canvas = document.createElement("canvas");
|
|
const canvas = document.createElement("canvas");
|
|
canvas.width = Math.max(sliceConfig.w, maxSliceWidth);
|
|
canvas.width = Math.max(sliceConfig.w, maxSliceWidth);
|
|
@@ -91,15 +89,17 @@ export async function getDataUrlForSliceConfig(
|
|
canvas.toBlob(res);
|
|
canvas.toBlob(res);
|
|
});
|
|
});
|
|
const dataurl = URL.createObjectURL(blob);
|
|
const dataurl = URL.createObjectURL(blob);
|
|
-
|
|
+
|
|
-
|
|
+ if (objectUrlMap.size > OBJECT_URLS_MAP_MAX_SIZE) {
|
|
-
|
|
+ const ary = [...objectUrlMap.entries()];
|
|
-
|
|
+ const toRelease = ary.splice(0, 10);
|
|
-
|
|
+ for (const u of toRelease) {
|
|
-
|
|
+ URL.revokeObjectURL(u[1]);
|
|
-
|
|
+ }
|
|
-
|
|
+ objectUrlMap = new Map(ary);
|
|
-
|
|
+ }
|
|
|
|
+
|
|
|
|
+ objectUrlMap.set(key, dataurl);
|
|
|
|
|
|
return dataurl;
|
|
return dataurl;
|
|
}
|
|
}
|
|
@@ -111,15 +111,12 @@ export async function getDataUrlForSplitConfig(
|
|
urlForCache: string
|
|
urlForCache: string
|
|
) {
|
|
) {
|
|
const [start, end] = config;
|
|
const [start, end] = config;
|
|
-
|
|
+ const key = `${urlForCache}-${start}-${end}`;
|
|
-
|
|
+
|
|
-
|
|
+ if (objectUrlMap.get(key)) {
|
|
-
|
|
+ console.log("cached split objectUrl");
|
|
-
|
|
+ return objectUrlMap.get(key);
|
|
-
|
|
+ }
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
|
|
|
|
const width = image.naturalWidth * (end - start);
|
|
const width = image.naturalWidth * (end - start);
|
|
const canvas = document.createElement("canvas");
|
|
const canvas = document.createElement("canvas");
|
|
@@ -148,14 +145,16 @@ export async function getDataUrlForSplitConfig(
|
|
canvas.toBlob(res);
|
|
canvas.toBlob(res);
|
|
});
|
|
});
|
|
const dataurl = URL.createObjectURL(blob);
|
|
const dataurl = URL.createObjectURL(blob);
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
|
|
|
|
|
|
+ if (objectUrlMap.size > OBJECT_URLS_MAP_MAX_SIZE) {
|
|
|
|
+ const ary = [...objectUrlMap.entries()];
|
|
|
|
+ const toRelease = ary.splice(0, 10);
|
|
|
|
+ for (const u of toRelease) {
|
|
|
|
+ URL.revokeObjectURL(u[1]);
|
|
|
|
+ }
|
|
|
|
+ objectUrlMap = new Map(ary);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ objectUrlMap.set(key, dataurl);
|
|
return dataurl;
|
|
return dataurl;
|
|
}
|
|
}
|