Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | import { ImageLoadListener } from '../types';
import { ImageQualityStatus } from '../enums';
/** Actually fills the nearby frames from the given frame */
export function fillNearbyFrames(
listener: ImageLoadListener,
imageQualityStatusMap: Map<string, ImageQualityStatus>,
request,
image,
options
) {
if (!request?.nearbyRequests?.length) {
return;
}
const {
arrayBuffer,
offset: srcOffset,
type,
length: frameLength,
} = options.targetBuffer;
if (!arrayBuffer || srcOffset === undefined || !type) {
return;
}
const scalarData = new Float32Array(arrayBuffer);
const bytesPerPixel = scalarData.byteLength / scalarData.length;
const offset = options.targetBuffer.offset / bytesPerPixel; // in bytes
// since set is based on the underlying type,
// we need to divide the offset bytes by the byte type
const src = scalarData.slice(offset, offset + frameLength);
for (const nearbyItem of request.nearbyRequests) {
try {
const { itemId: targetId, imageQualityStatus } = nearbyItem;
const targetStatus = imageQualityStatusMap.get(targetId);
if (targetStatus !== undefined && targetStatus >= imageQualityStatus) {
continue;
}
const targetOptions = listener.getLoaderImageOptions(targetId);
const { offset: targetOffset } = targetOptions.targetBuffer as any;
scalarData.set(src, targetOffset / bytesPerPixel);
const nearbyImage = {
...image,
imageQualityStatus,
};
listener.successCallback(targetId, nearbyImage);
imageQualityStatusMap.set(targetId, imageQualityStatus);
} catch (e) {
console.log("Couldn't fill nearby item ", nearbyItem.itemId, e);
}
}
}
|