157 lines
4.9 KiB
JavaScript
157 lines
4.9 KiB
JavaScript
// Metro module 4812 (f4813).
|
|
import { get64BitValue } from "./Module4813";
|
|
export function parseItemLocationBox(a0, a1, a2, a3) {
|
|
let r2, r31, r125, baseOffset2, extentCount, extentIndex, extentLength2, extentOffset2, items2;
|
|
const offsetSize = a2 + 3;
|
|
const r23 = {
|
|
item: {
|
|
dataReferenceIndex: 2,
|
|
extentCount: 2,
|
|
extent: {}
|
|
}
|
|
};
|
|
if (a1 < 2) {
|
|
r23.itemCount = 2;
|
|
r23.item.itemId = 2;
|
|
} else if (a1 === 2) {
|
|
r23.itemCount = 4;
|
|
r23.item.itemId = 4;
|
|
}
|
|
const item = r23.item;
|
|
const r15 = a1 === 1;
|
|
item.constructionMethod = r15 ? 2 : a1 === 2 ? 2 : 0;
|
|
const baseOffsetSize = offsetSize + 1;
|
|
const r41 = {
|
|
offsetSize,
|
|
lengthSize: offsetSize,
|
|
baseOffsetSize,
|
|
indexSize: baseOffsetSize,
|
|
itemCount: offsetSize + 2
|
|
};
|
|
r41.items = r41.itemCount + r23.itemCount;
|
|
r41.item = {
|
|
itemId: 0
|
|
};
|
|
r41.item.constructionMethod = r41.item.itemId + r23.item.itemId;
|
|
r41.item.dataReferenceIndex = r41.item.constructionMethod + r23.item.constructionMethod;
|
|
const extentOffset = a0.getUint8(r41.offsetSize) >> 4;
|
|
r23.item.extent.extentOffset = extentOffset;
|
|
const extentLength = 15 & a0.getUint8(r41.lengthSize);
|
|
r23.item.extent.extentLength = extentLength;
|
|
r23.item.baseOffset = a0.getUint8(r41.baseOffsetSize) >> 4;
|
|
const indexSize = r41.indexSize;
|
|
const r14 = r15 ? 15 & a0.getUint8(indexSize) : a1 === 2 ? 15 & a0.getUint8(indexSize) : void 0;
|
|
r23.item.extent.extentIndex = r14 !== void 0 ? r14 : 0;
|
|
const itemCount = r41.itemCount;
|
|
const r21 = a1 < 2 ? a0.getUint16(itemCount) : a1 === 2 ? a0.getUint32(itemCount) : void 0;
|
|
if (r21 === void 0) {
|
|
items2 = [];
|
|
} else {
|
|
const r20 = [];
|
|
let items = r41.items;
|
|
const r82 = 0 < r21;
|
|
const r84 = "This file uses an 8-bit offset which is currently not supported by ExifReader. Contact the maintainer to get it fixed.";
|
|
let r85 = 0;
|
|
items2 = r20;
|
|
if (r82) {
|
|
do {
|
|
const r5 = r85;
|
|
const itemId = a1 < 2 ? a0.getUint16(items) : a1 === 2 ? a0.getUint32(items) : void 0;
|
|
const r91 = items + r23.item.itemId;
|
|
const constructionMethod = r15 ? 15 & a0.getUint16(r91) : a1 === 2 ? 15 & a0.getUint16(r91) : void 0;
|
|
const r97 = r91 + r23.item.constructionMethod;
|
|
const r28 = {
|
|
extents: [],
|
|
itemId,
|
|
constructionMethod,
|
|
dataReferenceIndex: a0.getUint16(r97)
|
|
};
|
|
const r102 = r97 + r23.item.dataReferenceIndex;
|
|
const baseOffset = r23.item.baseOffset;
|
|
if (baseOffset === 4) {
|
|
baseOffset2 = a0.getUint32(r102);
|
|
} else {
|
|
baseOffset2 = 0;
|
|
if (baseOffset === 8) {
|
|
console.warn(r84);
|
|
baseOffset2 = get64BitValue(a0, r102);
|
|
}
|
|
}
|
|
r28.baseOffset = baseOffset2;
|
|
const r116 = r102 + r23.item.baseOffset;
|
|
r28.extentCount = a0.getUint16(r116);
|
|
let r121 = r116 + r23.item.extentCount;
|
|
const r123 = 0 < r28.extentCount;
|
|
let r0 = 0;
|
|
let r124 = r121;
|
|
if (r123) {
|
|
do {
|
|
L41: {
|
|
r2 = r0;
|
|
r125 = r121;
|
|
if (!r15) {
|
|
extentIndex = void 0;
|
|
if (a1 !== 2) {
|
|
break L41;
|
|
}
|
|
}
|
|
extentIndex = void 0;
|
|
if (r14 > 0) {
|
|
if (r14 === 4) {
|
|
r31 = a0.getUint32(r125);
|
|
} else {
|
|
r31 = 0;
|
|
if (r14 === 8) {
|
|
console.warn(r84);
|
|
r31 = get64BitValue(a0, r125);
|
|
}
|
|
}
|
|
extentIndex = r31;
|
|
}
|
|
}
|
|
const r138 = r125 + r23.item.extent.extentIndex;
|
|
if (extentOffset === 4) {
|
|
extentOffset2 = a0.getUint32(r138);
|
|
} else {
|
|
extentOffset2 = 0;
|
|
if (extentOffset === 8) {
|
|
console.warn(r84);
|
|
extentOffset2 = get64BitValue(a0, r138);
|
|
}
|
|
}
|
|
const r152 = r138 + r23.item.extent.extentOffset;
|
|
if (extentLength === 4) {
|
|
extentLength2 = a0.getUint32(r152);
|
|
} else {
|
|
extentLength2 = 0;
|
|
if (extentLength === 8) {
|
|
console.warn(r84);
|
|
extentLength2 = get64BitValue(a0, r152);
|
|
}
|
|
}
|
|
const r134 = {
|
|
extentIndex,
|
|
extentOffset: extentOffset2,
|
|
extentLength: extentLength2
|
|
};
|
|
r121 = r152 + r23.item.extent.extentLength;
|
|
r28.extents.push(r134);
|
|
r0 = r2 + 1;
|
|
extentCount = r28.extentCount;
|
|
r124 = r121;
|
|
} while (r0 < extentCount);
|
|
}
|
|
r20.push(r28);
|
|
r85 = r5 + 1;
|
|
items = r124;
|
|
items2 = r20;
|
|
} while (r85 < r21);
|
|
}
|
|
}
|
|
return {
|
|
type: "iloc",
|
|
items: items2,
|
|
length: a3
|
|
};
|
|
}
|