@huh-david/bmp-js 0.7.0 → 0.8.1
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/README.md +11 -0
- package/dist/index.cjs +37 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -3
- package/dist/index.d.ts +14 -3
- package/dist/index.js +35 -1
- package/dist/index.js.map +1 -1
- package/dist/sharp/index.d.cts +1 -1
- package/dist/sharp/index.d.ts +1 -1
- package/dist/{types-CzYgOtEn.d.cts → types-BGopbNUS.d.cts} +6 -1
- package/dist/{types-CzYgOtEn.d.ts → types-BGopbNUS.d.ts} +6 -1
- package/package.json +11 -7
package/README.md
CHANGED
|
@@ -90,10 +90,20 @@ const decoded = decode(inputBytes, {
|
|
|
90
90
|
});
|
|
91
91
|
```
|
|
92
92
|
|
|
93
|
+
### Output format helpers (non-breaking)
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
import { decodeRgb, decodeRgba } from "@huh-david/bmp-js";
|
|
97
|
+
|
|
98
|
+
const rgba = decodeRgba(inputBytes); // DecodedBmp with RGBA data
|
|
99
|
+
const rgb = decodeRgb(inputBytes); // { data, width, height, channels: 3, format: "rgb" }
|
|
100
|
+
```
|
|
101
|
+
|
|
93
102
|
## Data layout
|
|
94
103
|
|
|
95
104
|
Decoded pixel data is a byte buffer in `ABGR` order by default.
|
|
96
105
|
If `toRGBA: true` is provided to `decode`, output is returned in `RGBA`.
|
|
106
|
+
`decodeRgba` and `decodeRgb` are explicit opt-in helpers for RGBA/RGB consumers.
|
|
97
107
|
|
|
98
108
|
- `A`: alpha
|
|
99
109
|
- `B`: blue
|
|
@@ -161,6 +171,7 @@ Useful scripts:
|
|
|
161
171
|
|
|
162
172
|
- `pnpm build`
|
|
163
173
|
- `pnpm test`
|
|
174
|
+
- `pnpm test:browser`
|
|
164
175
|
- `pnpm test:watch`
|
|
165
176
|
- `pnpm lint`
|
|
166
177
|
- `pnpm format`
|
package/dist/index.cjs
CHANGED
|
@@ -23,6 +23,8 @@ __export(index_exports, {
|
|
|
23
23
|
BmpDecoder: () => BmpDecoder,
|
|
24
24
|
BmpEncoder: () => BmpEncoder,
|
|
25
25
|
decode: () => decode,
|
|
26
|
+
decodeRgb: () => decodeRgb,
|
|
27
|
+
decodeRgba: () => decodeRgba,
|
|
26
28
|
default: () => index_default,
|
|
27
29
|
encode: () => encode
|
|
28
30
|
});
|
|
@@ -853,10 +855,42 @@ function encode(imgData, qualityOrOptions) {
|
|
|
853
855
|
};
|
|
854
856
|
}
|
|
855
857
|
|
|
858
|
+
// src/output-format.ts
|
|
859
|
+
function rgbaToRgb(rgba) {
|
|
860
|
+
if (rgba.length % 4 !== 0) {
|
|
861
|
+
throw new Error("RGBA input length must be a multiple of 4.");
|
|
862
|
+
}
|
|
863
|
+
const rgb = new Uint8Array(rgba.length / 4 * 3);
|
|
864
|
+
for (let src = 0, dst = 0; src < rgba.length; src += 4, dst += 3) {
|
|
865
|
+
const red = rgba[src] ?? 0;
|
|
866
|
+
const green = rgba[src + 1] ?? 0;
|
|
867
|
+
const blue = rgba[src + 2] ?? 0;
|
|
868
|
+
rgb[dst] = red;
|
|
869
|
+
rgb[dst + 1] = green;
|
|
870
|
+
rgb[dst + 2] = blue;
|
|
871
|
+
}
|
|
872
|
+
return rgb;
|
|
873
|
+
}
|
|
874
|
+
function decodeRgba(bmpData, options = {}) {
|
|
875
|
+
return decode(bmpData, { ...options, toRGBA: true });
|
|
876
|
+
}
|
|
877
|
+
function decodeRgb(bmpData, options = {}) {
|
|
878
|
+
const rgbaDecoded = decodeRgba(bmpData, options);
|
|
879
|
+
return {
|
|
880
|
+
data: rgbaToRgb(rgbaDecoded.data),
|
|
881
|
+
width: rgbaDecoded.width,
|
|
882
|
+
height: rgbaDecoded.height,
|
|
883
|
+
channels: 3,
|
|
884
|
+
format: "rgb"
|
|
885
|
+
};
|
|
886
|
+
}
|
|
887
|
+
|
|
856
888
|
// src/index.ts
|
|
857
889
|
var bmp = {
|
|
858
890
|
encode,
|
|
859
|
-
decode
|
|
891
|
+
decode,
|
|
892
|
+
decodeRgba,
|
|
893
|
+
decodeRgb
|
|
860
894
|
};
|
|
861
895
|
var index_default = bmp;
|
|
862
896
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -864,6 +898,8 @@ var index_default = bmp;
|
|
|
864
898
|
BmpDecoder,
|
|
865
899
|
BmpEncoder,
|
|
866
900
|
decode,
|
|
901
|
+
decodeRgb,
|
|
902
|
+
decodeRgba,
|
|
867
903
|
encode
|
|
868
904
|
});
|
|
869
905
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/binary.ts","../src/decoder.ts","../src/encoder.ts"],"sourcesContent":["import { decode } from \"./decoder\";\nimport { encode } from \"./encoder\";\n\nexport type {\n BmpBinaryInput,\n EncodeBitDepth,\n BmpImageData,\n BmpPaletteColor,\n DecodeOptions,\n DecodedBmp,\n EncodeOptions,\n EncodedBmp,\n} from \"./types\";\nexport { BmpDecoder } from \"./decoder\";\nexport { BmpEncoder } from \"./encoder\";\nexport { encode, decode };\n\nconst bmp = {\n encode,\n decode,\n};\n\nexport default bmp;\n","import type { BmpBinaryInput } from \"./types\";\n\nexport function toUint8Array(input: BmpBinaryInput): Uint8Array {\n if (input instanceof ArrayBuffer) {\n return new Uint8Array(input);\n }\n\n return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n}\n\nexport function assertInteger(name: string, value: number): void {\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`${name} must be a positive integer`);\n }\n}\n","import { toUint8Array } from \"./binary\";\nimport type { BmpBinaryInput, BmpPaletteColor, DecodeOptions, DecodedBmp } from \"./types\";\n\nconst FILE_HEADER_SIZE = 14;\nconst INFO_HEADER_MIN = 40;\nconst CORE_HEADER_SIZE = 12;\n\nfunction rowStride(width: number, bitPP: number): number {\n return Math.floor((bitPP * width + 31) / 32) * 4;\n}\n\nclass BmpDecoder implements DecodedBmp {\n private pos = 0;\n private readonly bytes: Uint8Array;\n private readonly view: DataView;\n private readonly options: Required<DecodeOptions>;\n private bottomUp = true;\n private dibStart = FILE_HEADER_SIZE;\n private paletteEntrySize = 4;\n private externalMaskOffset = 0;\n\n private maskRed = 0;\n private maskGreen = 0;\n private maskBlue = 0;\n private maskAlpha = 0;\n\n fileSize!: number;\n reserved!: number;\n offset!: number;\n headerSize!: number;\n width!: number;\n height!: number;\n planes!: number;\n bitPP!: number;\n compress!: number;\n rawSize!: number;\n hr!: number;\n vr!: number;\n colors!: number;\n importantColors!: number;\n palette?: BmpPaletteColor[];\n data!: Uint8Array;\n\n constructor(input: BmpBinaryInput, options: DecodeOptions = {}) {\n this.bytes = toUint8Array(input);\n this.view = new DataView(this.bytes.buffer, this.bytes.byteOffset, this.bytes.byteLength);\n this.options = {\n treat16BitAs15BitAlpha: options.treat16BitAs15BitAlpha ?? false,\n toRGBA: options.toRGBA ?? false,\n };\n\n this.parseFileHeader();\n this.parseDibHeader();\n this.parsePalette();\n this.pos = this.offset;\n this.parseRGBA();\n this.transformToRgbaIfNeeded();\n }\n\n private ensureReadable(offset: number, size: number, context: string): void {\n if (offset < 0 || size < 0 || offset + size > this.bytes.length) {\n throw new Error(`BMP decode out-of-range while reading ${context}`);\n }\n }\n\n private readUInt8(offset = this.pos): number {\n this.ensureReadable(offset, 1, \"uint8\");\n if (offset === this.pos) this.pos += 1;\n return this.view.getUint8(offset);\n }\n\n private readUInt16LE(offset = this.pos): number {\n this.ensureReadable(offset, 2, \"uint16\");\n if (offset === this.pos) this.pos += 2;\n return this.view.getUint16(offset, true);\n }\n\n private readInt16LE(offset = this.pos): number {\n this.ensureReadable(offset, 2, \"int16\");\n if (offset === this.pos) this.pos += 2;\n return this.view.getInt16(offset, true);\n }\n\n private readUInt32LE(offset = this.pos): number {\n this.ensureReadable(offset, 4, \"uint32\");\n if (offset === this.pos) this.pos += 4;\n return this.view.getUint32(offset, true);\n }\n\n private readInt32LE(offset = this.pos): number {\n this.ensureReadable(offset, 4, \"int32\");\n if (offset === this.pos) this.pos += 4;\n return this.view.getInt32(offset, true);\n }\n\n private parseFileHeader(): void {\n this.ensureReadable(0, FILE_HEADER_SIZE, \"file header\");\n if (this.bytes[0] !== 0x42 || this.bytes[1] !== 0x4d) {\n throw new Error(\"Invalid BMP file signature\");\n }\n\n this.pos = 2;\n this.fileSize = this.readUInt32LE();\n this.reserved = this.readUInt32LE();\n this.offset = this.readUInt32LE();\n\n if (this.offset < FILE_HEADER_SIZE || this.offset > this.bytes.length) {\n throw new Error(`Invalid pixel data offset: ${this.offset}`);\n }\n }\n\n private parseDibHeader(): void {\n this.pos = this.dibStart;\n this.headerSize = this.readUInt32LE();\n if (this.headerSize < CORE_HEADER_SIZE) {\n throw new Error(`Unsupported DIB header size: ${this.headerSize}`);\n }\n this.ensureReadable(this.dibStart, this.headerSize, \"DIB header\");\n\n if (this.headerSize === CORE_HEADER_SIZE) {\n this.parseCoreHeader();\n return;\n }\n\n if (this.headerSize < INFO_HEADER_MIN) {\n throw new Error(`Unsupported DIB header size: ${this.headerSize}`);\n }\n\n this.parseInfoHeader();\n }\n\n private parseCoreHeader(): void {\n const width = this.readUInt16LE(this.dibStart + 4);\n const height = this.readUInt16LE(this.dibStart + 6);\n\n this.width = width;\n this.height = height;\n this.planes = this.readUInt16LE(this.dibStart + 8);\n this.bitPP = this.readUInt16LE(this.dibStart + 10);\n this.compress = 0;\n this.rawSize = 0;\n this.hr = 0;\n this.vr = 0;\n this.colors = 0;\n this.importantColors = 0;\n this.bottomUp = true;\n this.paletteEntrySize = 3;\n this.externalMaskOffset = this.dibStart + this.headerSize;\n\n this.validateDimensions();\n }\n\n private parseInfoHeader(): void {\n const rawWidth = this.readInt32LE(this.dibStart + 4);\n const rawHeight = this.readInt32LE(this.dibStart + 8);\n\n this.width = rawWidth;\n this.height = rawHeight;\n this.planes = this.readUInt16LE(this.dibStart + 12);\n this.bitPP = this.readUInt16LE(this.dibStart + 14);\n this.compress = this.readUInt32LE(this.dibStart + 16);\n this.rawSize = this.readUInt32LE(this.dibStart + 20);\n this.hr = this.readUInt32LE(this.dibStart + 24);\n this.vr = this.readUInt32LE(this.dibStart + 28);\n this.colors = this.readUInt32LE(this.dibStart + 32);\n this.importantColors = this.readUInt32LE(this.dibStart + 36);\n this.paletteEntrySize = 4;\n this.externalMaskOffset = this.dibStart + this.headerSize;\n\n if (this.height < 0) {\n this.height *= -1;\n this.bottomUp = false;\n }\n\n if (this.width < 0) {\n this.width *= -1;\n }\n\n if (this.bitPP === 16 && this.options.treat16BitAs15BitAlpha) {\n this.bitPP = 15;\n }\n\n this.validateDimensions();\n this.parseBitMasks();\n }\n\n private validateDimensions(): void {\n if (\n !Number.isInteger(this.width) ||\n !Number.isInteger(this.height) ||\n this.width <= 0 ||\n this.height <= 0\n ) {\n throw new Error(`Invalid BMP dimensions: ${this.width}x${this.height}`);\n }\n }\n\n private parseBitMasks(): void {\n if (\n !(this.bitPP === 16 || this.bitPP === 32) ||\n !(this.compress === 3 || this.compress === 6)\n ) {\n return;\n }\n\n const inHeaderMaskStart = this.dibStart + 40;\n const hasMasksInHeader = this.headerSize >= 52;\n const maskStart = hasMasksInHeader ? inHeaderMaskStart : this.externalMaskOffset;\n const maskCount = this.compress === 6 || this.headerSize >= 56 ? 4 : 3;\n this.ensureReadable(maskStart, maskCount * 4, \"bit masks\");\n\n this.maskRed = this.readUInt32LE(maskStart);\n this.maskGreen = this.readUInt32LE(maskStart + 4);\n this.maskBlue = this.readUInt32LE(maskStart + 8);\n this.maskAlpha = maskCount >= 4 ? this.readUInt32LE(maskStart + 12) : 0;\n\n if (!hasMasksInHeader) {\n this.externalMaskOffset += maskCount * 4;\n }\n }\n\n private parsePalette(): void {\n if (this.bitPP >= 16) {\n return;\n }\n\n const colorCount = this.colors === 0 ? 1 << this.bitPP : this.colors;\n if (colorCount <= 0) {\n return;\n }\n\n const paletteStart = this.externalMaskOffset;\n const paletteSize = colorCount * this.paletteEntrySize;\n if (paletteStart + paletteSize > this.offset) {\n throw new Error(\"Palette data overlaps or exceeds pixel data offset\");\n }\n\n this.palette = new Array(colorCount);\n for (let i = 0; i < colorCount; i += 1) {\n const base = paletteStart + i * this.paletteEntrySize;\n const blue = this.readUInt8(base);\n const green = this.readUInt8(base + 1);\n const red = this.readUInt8(base + 2);\n const quad = this.paletteEntrySize === 4 ? this.readUInt8(base + 3) : 0;\n this.palette[i] = { red, green, blue, quad };\n }\n }\n\n private parseRGBA(): void {\n const pixelCount = this.width * this.height;\n const len = pixelCount * 4;\n this.data = new Uint8Array(len);\n\n switch (this.bitPP) {\n case 1:\n this.bit1();\n return;\n case 4:\n this.bit4();\n return;\n case 8:\n this.bit8();\n return;\n case 15:\n this.bit15();\n return;\n case 16:\n this.bit16();\n return;\n case 24:\n this.bit24();\n return;\n case 32:\n this.bit32();\n return;\n default:\n throw new Error(`Unsupported BMP bit depth: ${this.bitPP}`);\n }\n }\n\n private transformToRgbaIfNeeded(): void {\n if (!this.options.toRGBA) {\n return;\n }\n\n for (let i = 0; i < this.data.length; i += 4) {\n const alpha = this.data[i] ?? 0;\n const blue = this.data[i + 1] ?? 0;\n const green = this.data[i + 2] ?? 0;\n const red = this.data[i + 3] ?? 0;\n\n this.data[i] = red;\n this.data[i + 1] = green;\n this.data[i + 2] = blue;\n this.data[i + 3] = alpha;\n }\n }\n\n private getPaletteColor(index: number): BmpPaletteColor {\n const color = this.palette?.[index];\n if (color) {\n return color;\n }\n\n return { red: 0xff, green: 0xff, blue: 0xff, quad: 0x00 };\n }\n\n private setPixel(\n destY: number,\n x: number,\n alpha: number,\n blue: number,\n green: number,\n red: number,\n ): void {\n const base = (destY * this.width + x) * 4;\n this.data[base] = alpha;\n this.data[base + 1] = blue;\n this.data[base + 2] = green;\n this.data[base + 3] = red;\n }\n\n private bit1(): void {\n const stride = rowStride(this.width, 1);\n const bytesPerRow = Math.ceil(this.width / 8);\n\n for (let srcRow = 0; srcRow < this.height; srcRow += 1) {\n const rowStart = this.offset + srcRow * stride;\n this.ensureReadable(rowStart, bytesPerRow, \"1-bit row\");\n const destY = this.bottomUp ? this.height - 1 - srcRow : srcRow;\n\n for (let x = 0; x < this.width; x += 1) {\n const packed = this.readUInt8(rowStart + Math.floor(x / 8));\n const bit = (packed >> (7 - (x % 8))) & 0x01;\n const rgb = this.getPaletteColor(bit);\n this.setPixel(destY, x, 0xff, rgb.blue, rgb.green, rgb.red);\n }\n }\n }\n\n private bit4(): void {\n if (this.compress === 2) {\n this.bit4Rle();\n return;\n }\n\n const stride = rowStride(this.width, 4);\n const bytesPerRow = Math.ceil(this.width / 2);\n\n for (let srcRow = 0; srcRow < this.height; srcRow += 1) {\n const rowStart = this.offset + srcRow * stride;\n this.ensureReadable(rowStart, bytesPerRow, \"4-bit row\");\n const destY = this.bottomUp ? this.height - 1 - srcRow : srcRow;\n\n for (let x = 0; x < this.width; x += 1) {\n const packed = this.readUInt8(rowStart + Math.floor(x / 2));\n const idx = x % 2 === 0 ? (packed & 0xf0) >> 4 : packed & 0x0f;\n const rgb = this.getPaletteColor(idx);\n this.setPixel(destY, x, 0xff, rgb.blue, rgb.green, rgb.red);\n }\n }\n }\n\n private bit8(): void {\n if (this.compress === 1) {\n this.bit8Rle();\n return;\n }\n\n const stride = rowStride(this.width, 8);\n const bytesPerRow = this.width;\n\n for (let srcRow = 0; srcRow < this.height; srcRow += 1) {\n const rowStart = this.offset + srcRow * stride;\n this.ensureReadable(rowStart, bytesPerRow, \"8-bit row\");\n const destY = this.bottomUp ? this.height - 1 - srcRow : srcRow;\n\n for (let x = 0; x < this.width; x += 1) {\n const idx = this.readUInt8(rowStart + x);\n const rgb = this.getPaletteColor(idx);\n this.setPixel(destY, x, 0xff, rgb.blue, rgb.green, rgb.red);\n }\n }\n }\n\n private bit15(): void {\n const stride = rowStride(this.width, 16);\n const max = 0b11111;\n\n for (let srcRow = 0; srcRow < this.height; srcRow += 1) {\n const rowStart = this.offset + srcRow * stride;\n this.ensureReadable(rowStart, this.width * 2, \"15-bit row\");\n const destY = this.bottomUp ? this.height - 1 - srcRow : srcRow;\n\n for (let x = 0; x < this.width; x += 1) {\n const value = this.readUInt16LE(rowStart + x * 2);\n const blue = (((value >> 0) & max) / max) * 255;\n const green = (((value >> 5) & max) / max) * 255;\n const red = (((value >> 10) & max) / max) * 255;\n const alpha = (value & 0x8000) !== 0 ? 0xff : 0x00;\n\n this.setPixel(destY, x, alpha, blue | 0, green | 0, red | 0);\n }\n }\n }\n\n private scaleMasked(value: number, mask: number): number {\n if (mask === 0) return 0;\n let shift = 0;\n let bits = 0;\n let m = mask;\n while ((m & 1) === 0) {\n shift += 1;\n m >>>= 1;\n }\n while ((m & 1) === 1) {\n bits += 1;\n m >>>= 1;\n }\n\n const component = (value & mask) >>> shift;\n if (bits >= 8) {\n return component >>> (bits - 8);\n }\n\n return (component << (8 - bits)) & 0xff;\n }\n\n private bit16(): void {\n if (this.maskRed === 0 && this.maskGreen === 0 && this.maskBlue === 0) {\n this.maskRed = 0x7c00;\n this.maskGreen = 0x03e0;\n this.maskBlue = 0x001f;\n }\n\n const stride = rowStride(this.width, 16);\n\n for (let srcRow = 0; srcRow < this.height; srcRow += 1) {\n const rowStart = this.offset + srcRow * stride;\n this.ensureReadable(rowStart, this.width * 2, \"16-bit row\");\n const destY = this.bottomUp ? this.height - 1 - srcRow : srcRow;\n\n for (let x = 0; x < this.width; x += 1) {\n const value = this.readUInt16LE(rowStart + x * 2);\n const blue = this.scaleMasked(value, this.maskBlue);\n const green = this.scaleMasked(value, this.maskGreen);\n const red = this.scaleMasked(value, this.maskRed);\n const alpha = this.maskAlpha !== 0 ? this.scaleMasked(value, this.maskAlpha) : 0xff;\n this.setPixel(destY, x, alpha, blue, green, red);\n }\n }\n }\n\n private bit24(): void {\n const stride = rowStride(this.width, 24);\n\n for (let srcRow = 0; srcRow < this.height; srcRow += 1) {\n const rowStart = this.offset + srcRow * stride;\n this.ensureReadable(rowStart, this.width * 3, \"24-bit row\");\n const destY = this.bottomUp ? this.height - 1 - srcRow : srcRow;\n\n for (let x = 0; x < this.width; x += 1) {\n const base = rowStart + x * 3;\n const blue = this.readUInt8(base);\n const green = this.readUInt8(base + 1);\n const red = this.readUInt8(base + 2);\n this.setPixel(destY, x, 0xff, blue, green, red);\n }\n }\n }\n\n private bit32(): void {\n const stride = rowStride(this.width, 32);\n\n for (let srcRow = 0; srcRow < this.height; srcRow += 1) {\n const rowStart = this.offset + srcRow * stride;\n this.ensureReadable(rowStart, this.width * 4, \"32-bit row\");\n const destY = this.bottomUp ? this.height - 1 - srcRow : srcRow;\n\n for (let x = 0; x < this.width; x += 1) {\n const base = rowStart + x * 4;\n if (this.compress === 3 || this.compress === 6) {\n const pixel = this.readUInt32LE(base);\n const red = this.scaleMasked(pixel, this.maskRed || 0x00ff0000);\n const green = this.scaleMasked(pixel, this.maskGreen || 0x0000ff00);\n const blue = this.scaleMasked(pixel, this.maskBlue || 0x000000ff);\n const alpha = this.maskAlpha === 0 ? 0xff : this.scaleMasked(pixel, this.maskAlpha);\n this.setPixel(destY, x, alpha, blue, green, red);\n } else {\n const blue = this.readUInt8(base);\n const green = this.readUInt8(base + 1);\n const red = this.readUInt8(base + 2);\n const alpha = this.readUInt8(base + 3);\n this.setPixel(destY, x, alpha, blue, green, red);\n }\n }\n }\n }\n\n private bit8Rle(): void {\n this.data.fill(0xff);\n this.pos = this.offset;\n let x = 0;\n let y = this.bottomUp ? this.height - 1 : 0;\n\n while (this.pos < this.bytes.length) {\n const count = this.readUInt8();\n const value = this.readUInt8();\n\n if (count === 0) {\n if (value === 0) {\n x = 0;\n y += this.bottomUp ? -1 : 1;\n continue;\n }\n if (value === 1) {\n break;\n }\n if (value === 2) {\n x += this.readUInt8();\n y += this.bottomUp ? -this.readUInt8() : this.readUInt8();\n continue;\n }\n\n for (let i = 0; i < value; i += 1) {\n const idx = this.readUInt8();\n const rgb = this.getPaletteColor(idx);\n if (x < this.width && y >= 0 && y < this.height) {\n this.setPixel(y, x, 0xff, rgb.blue, rgb.green, rgb.red);\n }\n x += 1;\n }\n if ((value & 1) === 1) {\n this.pos += 1;\n }\n continue;\n }\n\n const rgb = this.getPaletteColor(value);\n for (let i = 0; i < count; i += 1) {\n if (x < this.width && y >= 0 && y < this.height) {\n this.setPixel(y, x, 0xff, rgb.blue, rgb.green, rgb.red);\n }\n x += 1;\n }\n }\n }\n\n private bit4Rle(): void {\n this.data.fill(0xff);\n this.pos = this.offset;\n let x = 0;\n let y = this.bottomUp ? this.height - 1 : 0;\n\n while (this.pos < this.bytes.length) {\n const count = this.readUInt8();\n const value = this.readUInt8();\n\n if (count === 0) {\n if (value === 0) {\n x = 0;\n y += this.bottomUp ? -1 : 1;\n continue;\n }\n if (value === 1) {\n break;\n }\n if (value === 2) {\n x += this.readUInt8();\n y += this.bottomUp ? -this.readUInt8() : this.readUInt8();\n continue;\n }\n\n let current = this.readUInt8();\n for (let i = 0; i < value; i += 1) {\n const nibble = i % 2 === 0 ? (current & 0xf0) >> 4 : current & 0x0f;\n const rgb = this.getPaletteColor(nibble);\n if (x < this.width && y >= 0 && y < this.height) {\n this.setPixel(y, x, 0xff, rgb.blue, rgb.green, rgb.red);\n }\n x += 1;\n if (i % 2 === 1 && i + 1 < value) {\n current = this.readUInt8();\n }\n }\n if ((((value + 1) >> 1) & 1) === 1) {\n this.pos += 1;\n }\n continue;\n }\n\n for (let i = 0; i < count; i += 1) {\n const nibble = i % 2 === 0 ? (value & 0xf0) >> 4 : value & 0x0f;\n const rgb = this.getPaletteColor(nibble);\n if (x < this.width && y >= 0 && y < this.height) {\n this.setPixel(y, x, 0xff, rgb.blue, rgb.green, rgb.red);\n }\n x += 1;\n }\n }\n }\n\n getData(): Uint8Array {\n return this.data;\n }\n}\n\nexport function decode(bmpData: BmpBinaryInput, options?: DecodeOptions): DecodedBmp {\n return new BmpDecoder(bmpData, options);\n}\n\nexport { BmpDecoder };\n","import { assertInteger } from \"./binary\";\nimport type {\n BmpImageData,\n BmpPaletteColor,\n EncodeBitDepth,\n EncodeOptions,\n EncodedBmp,\n} from \"./types\";\n\nconst FILE_HEADER_SIZE = 14;\nconst INFO_HEADER_SIZE = 40;\nconst BYTES_PER_PIXEL_ABGR = 4;\nconst SUPPORTED_BIT_DEPTHS = [1, 4, 8, 16, 24, 32] as const;\n\ntype SupportedBitDepth = (typeof SUPPORTED_BIT_DEPTHS)[number];\ntype ResolvedEncodeOptions = Required<Pick<EncodeOptions, \"orientation\" | \"bitPP\">> & {\n palette: BmpPaletteColor[];\n};\n\nfunction isSupportedBitDepth(value: number): value is SupportedBitDepth {\n return (SUPPORTED_BIT_DEPTHS as readonly number[]).includes(value);\n}\n\nfunction normalizeEncodeOptions(qualityOrOptions?: number | EncodeOptions): ResolvedEncodeOptions {\n if (typeof qualityOrOptions === \"number\" || typeof qualityOrOptions === \"undefined\") {\n return {\n orientation: \"top-down\",\n bitPP: 24,\n palette: [],\n };\n }\n\n return {\n orientation: qualityOrOptions.orientation ?? \"top-down\",\n bitPP: qualityOrOptions.bitPP ?? 24,\n palette: qualityOrOptions.palette ?? [],\n };\n}\n\nclass BmpEncoder {\n private readonly pixelData: Uint8Array;\n private readonly width: number;\n private readonly height: number;\n private readonly options: ResolvedEncodeOptions;\n private readonly palette: BmpPaletteColor[];\n private readonly exactPaletteIndex = new Map<number, number>();\n\n constructor(imgData: BmpImageData, options: ResolvedEncodeOptions) {\n this.pixelData = imgData.data;\n this.width = imgData.width;\n this.height = imgData.height;\n this.options = options;\n this.palette = this.normalizePalette(options);\n\n assertInteger(\"width\", this.width);\n assertInteger(\"height\", this.height);\n\n if (!isSupportedBitDepth(this.options.bitPP)) {\n throw new Error(\n `Unsupported encode bit depth: ${this.options.bitPP}. Supported: 1, 4, 8, 16, 24, 32.`,\n );\n }\n\n const minLength = this.width * this.height * BYTES_PER_PIXEL_ABGR;\n if (this.pixelData.length < minLength) {\n throw new Error(\n `Image data is too short: expected at least ${minLength} bytes for ${this.width}x${this.height} ABGR data.`,\n );\n }\n\n for (let i = 0; i < this.palette.length; i += 1) {\n const color = this.palette[i]!;\n const key = this.paletteKey(color.quad, color.blue, color.green, color.red);\n if (!this.exactPaletteIndex.has(key)) {\n this.exactPaletteIndex.set(key, i);\n }\n }\n }\n\n private normalizePalette(options: ResolvedEncodeOptions): BmpPaletteColor[] {\n if (options.bitPP === 1) {\n const palette = options.palette.length\n ? options.palette\n : [\n { red: 255, green: 255, blue: 255, quad: 0 },\n { red: 0, green: 0, blue: 0, quad: 0 },\n ];\n this.validatePalette(options.bitPP, palette);\n return palette;\n }\n\n if (options.bitPP === 4 || options.bitPP === 8) {\n if (options.palette.length === 0) {\n throw new Error(`Encoding ${options.bitPP}-bit BMP requires a non-empty palette.`);\n }\n this.validatePalette(options.bitPP, options.palette);\n return options.palette;\n }\n\n return [];\n }\n\n private validatePalette(bitPP: 1 | 4 | 8, palette: BmpPaletteColor[]): void {\n const maxSize = 1 << bitPP;\n if (palette.length === 0 || palette.length > maxSize) {\n throw new Error(\n `Palette size ${palette.length} is invalid for ${bitPP}-bit BMP. Expected 1..${maxSize}.`,\n );\n }\n\n for (const color of palette) {\n this.validateChannel(\"palette.red\", color.red);\n this.validateChannel(\"palette.green\", color.green);\n this.validateChannel(\"palette.blue\", color.blue);\n this.validateChannel(\"palette.quad\", color.quad);\n }\n }\n\n private validateChannel(name: string, value: number): void {\n if (!Number.isInteger(value) || value < 0 || value > 255) {\n throw new Error(`${name} must be an integer between 0 and 255.`);\n }\n }\n\n private rowStride(): number {\n return Math.floor((this.options.bitPP * this.width + 31) / 32) * 4;\n }\n\n private sourceY(fileRow: number): number {\n return this.options.orientation === \"top-down\" ? fileRow : this.height - 1 - fileRow;\n }\n\n private sourceOffset(x: number, y: number): number {\n return (y * this.width + x) * BYTES_PER_PIXEL_ABGR;\n }\n\n private paletteKey(alpha: number, blue: number, green: number, red: number): number {\n return (\n (((alpha & 0xff) << 24) | ((blue & 0xff) << 16) | ((green & 0xff) << 8) | (red & 0xff)) >>> 0\n );\n }\n\n private findPaletteIndex(a: number, b: number, g: number, r: number): number {\n const exact = this.exactPaletteIndex.get(this.paletteKey(a, b, g, r));\n if (exact !== undefined) {\n return exact;\n }\n\n let bestIndex = 0;\n let bestDistance = Number.POSITIVE_INFINITY;\n\n for (let i = 0; i < this.palette.length; i += 1) {\n const color = this.palette[i]!;\n const dr = color.red - r;\n const dg = color.green - g;\n const db = color.blue - b;\n const da = color.quad - a;\n const distance = dr * dr + dg * dg + db * db + da * da;\n if (distance < bestDistance) {\n bestDistance = distance;\n bestIndex = i;\n }\n }\n\n return bestIndex;\n }\n\n private writePalette(output: Uint8Array, paletteOffset: number): void {\n for (let i = 0; i < this.palette.length; i += 1) {\n const color = this.palette[i]!;\n const base = paletteOffset + i * 4;\n output[base] = color.blue;\n output[base + 1] = color.green;\n output[base + 2] = color.red;\n output[base + 3] = color.quad;\n }\n }\n\n private encode1Bit(output: Uint8Array, pixelOffset: number, stride: number): void {\n for (let fileRow = 0; fileRow < this.height; fileRow += 1) {\n const srcY = this.sourceY(fileRow);\n const rowStart = pixelOffset + fileRow * stride;\n\n for (let x = 0; x < this.width; x += 8) {\n let packed = 0;\n for (let bit = 0; bit < 8; bit += 1) {\n const px = x + bit;\n if (px >= this.width) {\n break;\n }\n const source = this.sourceOffset(px, srcY);\n const a = this.pixelData[source] ?? 0xff;\n const b = this.pixelData[source + 1] ?? 0;\n const g = this.pixelData[source + 2] ?? 0;\n const r = this.pixelData[source + 3] ?? 0;\n const idx = this.findPaletteIndex(a, b, g, r) & 0x01;\n packed |= idx << (7 - bit);\n }\n output[rowStart + Math.floor(x / 8)] = packed;\n }\n }\n }\n\n private encode4Bit(output: Uint8Array, pixelOffset: number, stride: number): void {\n for (let fileRow = 0; fileRow < this.height; fileRow += 1) {\n const srcY = this.sourceY(fileRow);\n const rowStart = pixelOffset + fileRow * stride;\n\n for (let x = 0; x < this.width; x += 2) {\n const sourceA = this.sourceOffset(x, srcY);\n const idxA = this.findPaletteIndex(\n this.pixelData[sourceA] ?? 0xff,\n this.pixelData[sourceA + 1] ?? 0,\n this.pixelData[sourceA + 2] ?? 0,\n this.pixelData[sourceA + 3] ?? 0,\n );\n\n let idxB = 0;\n if (x + 1 < this.width) {\n const sourceB = this.sourceOffset(x + 1, srcY);\n idxB = this.findPaletteIndex(\n this.pixelData[sourceB] ?? 0xff,\n this.pixelData[sourceB + 1] ?? 0,\n this.pixelData[sourceB + 2] ?? 0,\n this.pixelData[sourceB + 3] ?? 0,\n );\n }\n\n output[rowStart + Math.floor(x / 2)] = ((idxA & 0x0f) << 4) | (idxB & 0x0f);\n }\n }\n }\n\n private encode8Bit(output: Uint8Array, pixelOffset: number, stride: number): void {\n for (let fileRow = 0; fileRow < this.height; fileRow += 1) {\n const srcY = this.sourceY(fileRow);\n const rowStart = pixelOffset + fileRow * stride;\n\n for (let x = 0; x < this.width; x += 1) {\n const source = this.sourceOffset(x, srcY);\n output[rowStart + x] = this.findPaletteIndex(\n this.pixelData[source] ?? 0xff,\n this.pixelData[source + 1] ?? 0,\n this.pixelData[source + 2] ?? 0,\n this.pixelData[source + 3] ?? 0,\n );\n }\n }\n }\n\n private encode16Bit(\n output: Uint8Array,\n view: DataView,\n pixelOffset: number,\n stride: number,\n ): void {\n for (let fileRow = 0; fileRow < this.height; fileRow += 1) {\n const srcY = this.sourceY(fileRow);\n const rowStart = pixelOffset + fileRow * stride;\n\n for (let x = 0; x < this.width; x += 1) {\n const source = this.sourceOffset(x, srcY);\n const b = this.pixelData[source + 1] ?? 0;\n const g = this.pixelData[source + 2] ?? 0;\n const r = this.pixelData[source + 3] ?? 0;\n\n const value = (((r >> 3) & 0x1f) << 10) | (((g >> 3) & 0x1f) << 5) | ((b >> 3) & 0x1f);\n view.setUint16(rowStart + x * 2, value, true);\n }\n }\n }\n\n private encode24Bit(output: Uint8Array, pixelOffset: number, stride: number): void {\n for (let fileRow = 0; fileRow < this.height; fileRow += 1) {\n const srcY = this.sourceY(fileRow);\n const rowStart = pixelOffset + fileRow * stride;\n\n for (let x = 0; x < this.width; x += 1) {\n const source = this.sourceOffset(x, srcY);\n const target = rowStart + x * 3;\n\n output[target] = this.pixelData[source + 1] ?? 0;\n output[target + 1] = this.pixelData[source + 2] ?? 0;\n output[target + 2] = this.pixelData[source + 3] ?? 0;\n }\n }\n }\n\n private encode32Bit(output: Uint8Array, pixelOffset: number, stride: number): void {\n for (let fileRow = 0; fileRow < this.height; fileRow += 1) {\n const srcY = this.sourceY(fileRow);\n const rowStart = pixelOffset + fileRow * stride;\n\n for (let x = 0; x < this.width; x += 1) {\n const source = this.sourceOffset(x, srcY);\n const target = rowStart + x * 4;\n\n output[target] = this.pixelData[source + 1] ?? 0;\n output[target + 1] = this.pixelData[source + 2] ?? 0;\n output[target + 2] = this.pixelData[source + 3] ?? 0;\n output[target + 3] = this.pixelData[source] ?? 0xff;\n }\n }\n }\n\n encode(): Uint8Array {\n const stride = this.rowStride();\n const imageSize = stride * this.height;\n const paletteSize = this.palette.length * 4;\n const offset = FILE_HEADER_SIZE + INFO_HEADER_SIZE + paletteSize;\n const totalSize = offset + imageSize;\n const output = new Uint8Array(totalSize);\n const view = new DataView(output.buffer, output.byteOffset, output.byteLength);\n\n // BITMAPFILEHEADER\n output[0] = 0x42; // B\n output[1] = 0x4d; // M\n view.setUint32(2, totalSize, true);\n view.setUint32(6, 0, true);\n view.setUint32(10, offset, true);\n\n // BITMAPINFOHEADER\n view.setUint32(14, INFO_HEADER_SIZE, true);\n view.setInt32(18, this.width, true);\n const signedHeight = this.options.orientation === \"top-down\" ? -this.height : this.height;\n view.setInt32(22, signedHeight, true);\n view.setUint16(26, 1, true);\n view.setUint16(28, this.options.bitPP, true);\n view.setUint32(30, 0, true);\n view.setUint32(34, imageSize, true);\n view.setUint32(38, 0, true);\n view.setUint32(42, 0, true);\n view.setUint32(46, this.palette.length, true);\n view.setUint32(50, 0, true);\n\n if (this.palette.length > 0) {\n this.writePalette(output, FILE_HEADER_SIZE + INFO_HEADER_SIZE);\n }\n\n switch (this.options.bitPP as EncodeBitDepth) {\n case 1:\n this.encode1Bit(output, offset, stride);\n break;\n case 4:\n this.encode4Bit(output, offset, stride);\n break;\n case 8:\n this.encode8Bit(output, offset, stride);\n break;\n case 16:\n this.encode16Bit(output, view, offset, stride);\n break;\n case 24:\n this.encode24Bit(output, offset, stride);\n break;\n case 32:\n this.encode32Bit(output, offset, stride);\n break;\n }\n\n return output;\n }\n}\n\nexport function encode(\n imgData: BmpImageData,\n qualityOrOptions?: number | EncodeOptions,\n): EncodedBmp {\n const options = normalizeEncodeOptions(qualityOrOptions);\n const encoder = new BmpEncoder(imgData, options);\n const data = encoder.encode();\n\n return {\n data,\n width: imgData.width,\n height: imgData.height,\n };\n}\n\nexport { BmpEncoder };\n"],"mappings":"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","names":["rgb","FILE_HEADER_SIZE"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/binary.ts","../src/decoder.ts","../src/encoder.ts","../src/output-format.ts"],"sourcesContent":["import { decode } from \"./decoder\";\nimport { encode } from \"./encoder\";\nimport { decodeRgb, decodeRgba } from \"./output-format\";\n\nexport type {\n BmpBinaryInput,\n DecodeColorOptions,\n EncodeBitDepth,\n BmpImageData,\n BmpPaletteColor,\n DecodeOptions,\n DecodedBmp,\n DecodedRgb,\n EncodeOptions,\n EncodedBmp,\n} from \"./types\";\nexport { BmpDecoder } from \"./decoder\";\nexport { BmpEncoder } from \"./encoder\";\nexport { encode, decode, decodeRgba, decodeRgb };\n\nconst bmp = {\n encode,\n decode,\n decodeRgba,\n decodeRgb,\n};\n\nexport default bmp;\n","import type { BmpBinaryInput } from \"./types\";\n\nexport function toUint8Array(input: BmpBinaryInput): Uint8Array {\n if (input instanceof ArrayBuffer) {\n return new Uint8Array(input);\n }\n\n return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n}\n\nexport function assertInteger(name: string, value: number): void {\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`${name} must be a positive integer`);\n }\n}\n","import { toUint8Array } from \"./binary\";\nimport type { BmpBinaryInput, BmpPaletteColor, DecodeOptions, DecodedBmp } from \"./types\";\n\nconst FILE_HEADER_SIZE = 14;\nconst INFO_HEADER_MIN = 40;\nconst CORE_HEADER_SIZE = 12;\n\nfunction rowStride(width: number, bitPP: number): number {\n return Math.floor((bitPP * width + 31) / 32) * 4;\n}\n\nclass BmpDecoder implements DecodedBmp {\n private pos = 0;\n private readonly bytes: Uint8Array;\n private readonly view: DataView;\n private readonly options: Required<DecodeOptions>;\n private bottomUp = true;\n private dibStart = FILE_HEADER_SIZE;\n private paletteEntrySize = 4;\n private externalMaskOffset = 0;\n\n private maskRed = 0;\n private maskGreen = 0;\n private maskBlue = 0;\n private maskAlpha = 0;\n\n fileSize!: number;\n reserved!: number;\n offset!: number;\n headerSize!: number;\n width!: number;\n height!: number;\n planes!: number;\n bitPP!: number;\n compress!: number;\n rawSize!: number;\n hr!: number;\n vr!: number;\n colors!: number;\n importantColors!: number;\n palette?: BmpPaletteColor[];\n data!: Uint8Array;\n\n constructor(input: BmpBinaryInput, options: DecodeOptions = {}) {\n this.bytes = toUint8Array(input);\n this.view = new DataView(this.bytes.buffer, this.bytes.byteOffset, this.bytes.byteLength);\n this.options = {\n treat16BitAs15BitAlpha: options.treat16BitAs15BitAlpha ?? false,\n toRGBA: options.toRGBA ?? false,\n };\n\n this.parseFileHeader();\n this.parseDibHeader();\n this.parsePalette();\n this.pos = this.offset;\n this.parseRGBA();\n this.transformToRgbaIfNeeded();\n }\n\n private ensureReadable(offset: number, size: number, context: string): void {\n if (offset < 0 || size < 0 || offset + size > this.bytes.length) {\n throw new Error(`BMP decode out-of-range while reading ${context}`);\n }\n }\n\n private readUInt8(offset = this.pos): number {\n this.ensureReadable(offset, 1, \"uint8\");\n if (offset === this.pos) this.pos += 1;\n return this.view.getUint8(offset);\n }\n\n private readUInt16LE(offset = this.pos): number {\n this.ensureReadable(offset, 2, \"uint16\");\n if (offset === this.pos) this.pos += 2;\n return this.view.getUint16(offset, true);\n }\n\n private readInt16LE(offset = this.pos): number {\n this.ensureReadable(offset, 2, \"int16\");\n if (offset === this.pos) this.pos += 2;\n return this.view.getInt16(offset, true);\n }\n\n private readUInt32LE(offset = this.pos): number {\n this.ensureReadable(offset, 4, \"uint32\");\n if (offset === this.pos) this.pos += 4;\n return this.view.getUint32(offset, true);\n }\n\n private readInt32LE(offset = this.pos): number {\n this.ensureReadable(offset, 4, \"int32\");\n if (offset === this.pos) this.pos += 4;\n return this.view.getInt32(offset, true);\n }\n\n private parseFileHeader(): void {\n this.ensureReadable(0, FILE_HEADER_SIZE, \"file header\");\n if (this.bytes[0] !== 0x42 || this.bytes[1] !== 0x4d) {\n throw new Error(\"Invalid BMP file signature\");\n }\n\n this.pos = 2;\n this.fileSize = this.readUInt32LE();\n this.reserved = this.readUInt32LE();\n this.offset = this.readUInt32LE();\n\n if (this.offset < FILE_HEADER_SIZE || this.offset > this.bytes.length) {\n throw new Error(`Invalid pixel data offset: ${this.offset}`);\n }\n }\n\n private parseDibHeader(): void {\n this.pos = this.dibStart;\n this.headerSize = this.readUInt32LE();\n if (this.headerSize < CORE_HEADER_SIZE) {\n throw new Error(`Unsupported DIB header size: ${this.headerSize}`);\n }\n this.ensureReadable(this.dibStart, this.headerSize, \"DIB header\");\n\n if (this.headerSize === CORE_HEADER_SIZE) {\n this.parseCoreHeader();\n return;\n }\n\n if (this.headerSize < INFO_HEADER_MIN) {\n throw new Error(`Unsupported DIB header size: ${this.headerSize}`);\n }\n\n this.parseInfoHeader();\n }\n\n private parseCoreHeader(): void {\n const width = this.readUInt16LE(this.dibStart + 4);\n const height = this.readUInt16LE(this.dibStart + 6);\n\n this.width = width;\n this.height = height;\n this.planes = this.readUInt16LE(this.dibStart + 8);\n this.bitPP = this.readUInt16LE(this.dibStart + 10);\n this.compress = 0;\n this.rawSize = 0;\n this.hr = 0;\n this.vr = 0;\n this.colors = 0;\n this.importantColors = 0;\n this.bottomUp = true;\n this.paletteEntrySize = 3;\n this.externalMaskOffset = this.dibStart + this.headerSize;\n\n this.validateDimensions();\n }\n\n private parseInfoHeader(): void {\n const rawWidth = this.readInt32LE(this.dibStart + 4);\n const rawHeight = this.readInt32LE(this.dibStart + 8);\n\n this.width = rawWidth;\n this.height = rawHeight;\n this.planes = this.readUInt16LE(this.dibStart + 12);\n this.bitPP = this.readUInt16LE(this.dibStart + 14);\n this.compress = this.readUInt32LE(this.dibStart + 16);\n this.rawSize = this.readUInt32LE(this.dibStart + 20);\n this.hr = this.readUInt32LE(this.dibStart + 24);\n this.vr = this.readUInt32LE(this.dibStart + 28);\n this.colors = this.readUInt32LE(this.dibStart + 32);\n this.importantColors = this.readUInt32LE(this.dibStart + 36);\n this.paletteEntrySize = 4;\n this.externalMaskOffset = this.dibStart + this.headerSize;\n\n if (this.height < 0) {\n this.height *= -1;\n this.bottomUp = false;\n }\n\n if (this.width < 0) {\n this.width *= -1;\n }\n\n if (this.bitPP === 16 && this.options.treat16BitAs15BitAlpha) {\n this.bitPP = 15;\n }\n\n this.validateDimensions();\n this.parseBitMasks();\n }\n\n private validateDimensions(): void {\n if (\n !Number.isInteger(this.width) ||\n !Number.isInteger(this.height) ||\n this.width <= 0 ||\n this.height <= 0\n ) {\n throw new Error(`Invalid BMP dimensions: ${this.width}x${this.height}`);\n }\n }\n\n private parseBitMasks(): void {\n if (\n !(this.bitPP === 16 || this.bitPP === 32) ||\n !(this.compress === 3 || this.compress === 6)\n ) {\n return;\n }\n\n const inHeaderMaskStart = this.dibStart + 40;\n const hasMasksInHeader = this.headerSize >= 52;\n const maskStart = hasMasksInHeader ? inHeaderMaskStart : this.externalMaskOffset;\n const maskCount = this.compress === 6 || this.headerSize >= 56 ? 4 : 3;\n this.ensureReadable(maskStart, maskCount * 4, \"bit masks\");\n\n this.maskRed = this.readUInt32LE(maskStart);\n this.maskGreen = this.readUInt32LE(maskStart + 4);\n this.maskBlue = this.readUInt32LE(maskStart + 8);\n this.maskAlpha = maskCount >= 4 ? this.readUInt32LE(maskStart + 12) : 0;\n\n if (!hasMasksInHeader) {\n this.externalMaskOffset += maskCount * 4;\n }\n }\n\n private parsePalette(): void {\n if (this.bitPP >= 16) {\n return;\n }\n\n const colorCount = this.colors === 0 ? 1 << this.bitPP : this.colors;\n if (colorCount <= 0) {\n return;\n }\n\n const paletteStart = this.externalMaskOffset;\n const paletteSize = colorCount * this.paletteEntrySize;\n if (paletteStart + paletteSize > this.offset) {\n throw new Error(\"Palette data overlaps or exceeds pixel data offset\");\n }\n\n this.palette = new Array(colorCount);\n for (let i = 0; i < colorCount; i += 1) {\n const base = paletteStart + i * this.paletteEntrySize;\n const blue = this.readUInt8(base);\n const green = this.readUInt8(base + 1);\n const red = this.readUInt8(base + 2);\n const quad = this.paletteEntrySize === 4 ? this.readUInt8(base + 3) : 0;\n this.palette[i] = { red, green, blue, quad };\n }\n }\n\n private parseRGBA(): void {\n const pixelCount = this.width * this.height;\n const len = pixelCount * 4;\n this.data = new Uint8Array(len);\n\n switch (this.bitPP) {\n case 1:\n this.bit1();\n return;\n case 4:\n this.bit4();\n return;\n case 8:\n this.bit8();\n return;\n case 15:\n this.bit15();\n return;\n case 16:\n this.bit16();\n return;\n case 24:\n this.bit24();\n return;\n case 32:\n this.bit32();\n return;\n default:\n throw new Error(`Unsupported BMP bit depth: ${this.bitPP}`);\n }\n }\n\n private transformToRgbaIfNeeded(): void {\n if (!this.options.toRGBA) {\n return;\n }\n\n for (let i = 0; i < this.data.length; i += 4) {\n const alpha = this.data[i] ?? 0;\n const blue = this.data[i + 1] ?? 0;\n const green = this.data[i + 2] ?? 0;\n const red = this.data[i + 3] ?? 0;\n\n this.data[i] = red;\n this.data[i + 1] = green;\n this.data[i + 2] = blue;\n this.data[i + 3] = alpha;\n }\n }\n\n private getPaletteColor(index: number): BmpPaletteColor {\n const color = this.palette?.[index];\n if (color) {\n return color;\n }\n\n return { red: 0xff, green: 0xff, blue: 0xff, quad: 0x00 };\n }\n\n private setPixel(\n destY: number,\n x: number,\n alpha: number,\n blue: number,\n green: number,\n red: number,\n ): void {\n const base = (destY * this.width + x) * 4;\n this.data[base] = alpha;\n this.data[base + 1] = blue;\n this.data[base + 2] = green;\n this.data[base + 3] = red;\n }\n\n private bit1(): void {\n const stride = rowStride(this.width, 1);\n const bytesPerRow = Math.ceil(this.width / 8);\n\n for (let srcRow = 0; srcRow < this.height; srcRow += 1) {\n const rowStart = this.offset + srcRow * stride;\n this.ensureReadable(rowStart, bytesPerRow, \"1-bit row\");\n const destY = this.bottomUp ? this.height - 1 - srcRow : srcRow;\n\n for (let x = 0; x < this.width; x += 1) {\n const packed = this.readUInt8(rowStart + Math.floor(x / 8));\n const bit = (packed >> (7 - (x % 8))) & 0x01;\n const rgb = this.getPaletteColor(bit);\n this.setPixel(destY, x, 0xff, rgb.blue, rgb.green, rgb.red);\n }\n }\n }\n\n private bit4(): void {\n if (this.compress === 2) {\n this.bit4Rle();\n return;\n }\n\n const stride = rowStride(this.width, 4);\n const bytesPerRow = Math.ceil(this.width / 2);\n\n for (let srcRow = 0; srcRow < this.height; srcRow += 1) {\n const rowStart = this.offset + srcRow * stride;\n this.ensureReadable(rowStart, bytesPerRow, \"4-bit row\");\n const destY = this.bottomUp ? this.height - 1 - srcRow : srcRow;\n\n for (let x = 0; x < this.width; x += 1) {\n const packed = this.readUInt8(rowStart + Math.floor(x / 2));\n const idx = x % 2 === 0 ? (packed & 0xf0) >> 4 : packed & 0x0f;\n const rgb = this.getPaletteColor(idx);\n this.setPixel(destY, x, 0xff, rgb.blue, rgb.green, rgb.red);\n }\n }\n }\n\n private bit8(): void {\n if (this.compress === 1) {\n this.bit8Rle();\n return;\n }\n\n const stride = rowStride(this.width, 8);\n const bytesPerRow = this.width;\n\n for (let srcRow = 0; srcRow < this.height; srcRow += 1) {\n const rowStart = this.offset + srcRow * stride;\n this.ensureReadable(rowStart, bytesPerRow, \"8-bit row\");\n const destY = this.bottomUp ? this.height - 1 - srcRow : srcRow;\n\n for (let x = 0; x < this.width; x += 1) {\n const idx = this.readUInt8(rowStart + x);\n const rgb = this.getPaletteColor(idx);\n this.setPixel(destY, x, 0xff, rgb.blue, rgb.green, rgb.red);\n }\n }\n }\n\n private bit15(): void {\n const stride = rowStride(this.width, 16);\n const max = 0b11111;\n\n for (let srcRow = 0; srcRow < this.height; srcRow += 1) {\n const rowStart = this.offset + srcRow * stride;\n this.ensureReadable(rowStart, this.width * 2, \"15-bit row\");\n const destY = this.bottomUp ? this.height - 1 - srcRow : srcRow;\n\n for (let x = 0; x < this.width; x += 1) {\n const value = this.readUInt16LE(rowStart + x * 2);\n const blue = (((value >> 0) & max) / max) * 255;\n const green = (((value >> 5) & max) / max) * 255;\n const red = (((value >> 10) & max) / max) * 255;\n const alpha = (value & 0x8000) !== 0 ? 0xff : 0x00;\n\n this.setPixel(destY, x, alpha, blue | 0, green | 0, red | 0);\n }\n }\n }\n\n private scaleMasked(value: number, mask: number): number {\n if (mask === 0) return 0;\n let shift = 0;\n let bits = 0;\n let m = mask;\n while ((m & 1) === 0) {\n shift += 1;\n m >>>= 1;\n }\n while ((m & 1) === 1) {\n bits += 1;\n m >>>= 1;\n }\n\n const component = (value & mask) >>> shift;\n if (bits >= 8) {\n return component >>> (bits - 8);\n }\n\n return (component << (8 - bits)) & 0xff;\n }\n\n private bit16(): void {\n if (this.maskRed === 0 && this.maskGreen === 0 && this.maskBlue === 0) {\n this.maskRed = 0x7c00;\n this.maskGreen = 0x03e0;\n this.maskBlue = 0x001f;\n }\n\n const stride = rowStride(this.width, 16);\n\n for (let srcRow = 0; srcRow < this.height; srcRow += 1) {\n const rowStart = this.offset + srcRow * stride;\n this.ensureReadable(rowStart, this.width * 2, \"16-bit row\");\n const destY = this.bottomUp ? this.height - 1 - srcRow : srcRow;\n\n for (let x = 0; x < this.width; x += 1) {\n const value = this.readUInt16LE(rowStart + x * 2);\n const blue = this.scaleMasked(value, this.maskBlue);\n const green = this.scaleMasked(value, this.maskGreen);\n const red = this.scaleMasked(value, this.maskRed);\n const alpha = this.maskAlpha !== 0 ? this.scaleMasked(value, this.maskAlpha) : 0xff;\n this.setPixel(destY, x, alpha, blue, green, red);\n }\n }\n }\n\n private bit24(): void {\n const stride = rowStride(this.width, 24);\n\n for (let srcRow = 0; srcRow < this.height; srcRow += 1) {\n const rowStart = this.offset + srcRow * stride;\n this.ensureReadable(rowStart, this.width * 3, \"24-bit row\");\n const destY = this.bottomUp ? this.height - 1 - srcRow : srcRow;\n\n for (let x = 0; x < this.width; x += 1) {\n const base = rowStart + x * 3;\n const blue = this.readUInt8(base);\n const green = this.readUInt8(base + 1);\n const red = this.readUInt8(base + 2);\n this.setPixel(destY, x, 0xff, blue, green, red);\n }\n }\n }\n\n private bit32(): void {\n const stride = rowStride(this.width, 32);\n\n for (let srcRow = 0; srcRow < this.height; srcRow += 1) {\n const rowStart = this.offset + srcRow * stride;\n this.ensureReadable(rowStart, this.width * 4, \"32-bit row\");\n const destY = this.bottomUp ? this.height - 1 - srcRow : srcRow;\n\n for (let x = 0; x < this.width; x += 1) {\n const base = rowStart + x * 4;\n if (this.compress === 3 || this.compress === 6) {\n const pixel = this.readUInt32LE(base);\n const red = this.scaleMasked(pixel, this.maskRed || 0x00ff0000);\n const green = this.scaleMasked(pixel, this.maskGreen || 0x0000ff00);\n const blue = this.scaleMasked(pixel, this.maskBlue || 0x000000ff);\n const alpha = this.maskAlpha === 0 ? 0xff : this.scaleMasked(pixel, this.maskAlpha);\n this.setPixel(destY, x, alpha, blue, green, red);\n } else {\n const blue = this.readUInt8(base);\n const green = this.readUInt8(base + 1);\n const red = this.readUInt8(base + 2);\n const alpha = this.readUInt8(base + 3);\n this.setPixel(destY, x, alpha, blue, green, red);\n }\n }\n }\n }\n\n private bit8Rle(): void {\n this.data.fill(0xff);\n this.pos = this.offset;\n let x = 0;\n let y = this.bottomUp ? this.height - 1 : 0;\n\n while (this.pos < this.bytes.length) {\n const count = this.readUInt8();\n const value = this.readUInt8();\n\n if (count === 0) {\n if (value === 0) {\n x = 0;\n y += this.bottomUp ? -1 : 1;\n continue;\n }\n if (value === 1) {\n break;\n }\n if (value === 2) {\n x += this.readUInt8();\n y += this.bottomUp ? -this.readUInt8() : this.readUInt8();\n continue;\n }\n\n for (let i = 0; i < value; i += 1) {\n const idx = this.readUInt8();\n const rgb = this.getPaletteColor(idx);\n if (x < this.width && y >= 0 && y < this.height) {\n this.setPixel(y, x, 0xff, rgb.blue, rgb.green, rgb.red);\n }\n x += 1;\n }\n if ((value & 1) === 1) {\n this.pos += 1;\n }\n continue;\n }\n\n const rgb = this.getPaletteColor(value);\n for (let i = 0; i < count; i += 1) {\n if (x < this.width && y >= 0 && y < this.height) {\n this.setPixel(y, x, 0xff, rgb.blue, rgb.green, rgb.red);\n }\n x += 1;\n }\n }\n }\n\n private bit4Rle(): void {\n this.data.fill(0xff);\n this.pos = this.offset;\n let x = 0;\n let y = this.bottomUp ? this.height - 1 : 0;\n\n while (this.pos < this.bytes.length) {\n const count = this.readUInt8();\n const value = this.readUInt8();\n\n if (count === 0) {\n if (value === 0) {\n x = 0;\n y += this.bottomUp ? -1 : 1;\n continue;\n }\n if (value === 1) {\n break;\n }\n if (value === 2) {\n x += this.readUInt8();\n y += this.bottomUp ? -this.readUInt8() : this.readUInt8();\n continue;\n }\n\n let current = this.readUInt8();\n for (let i = 0; i < value; i += 1) {\n const nibble = i % 2 === 0 ? (current & 0xf0) >> 4 : current & 0x0f;\n const rgb = this.getPaletteColor(nibble);\n if (x < this.width && y >= 0 && y < this.height) {\n this.setPixel(y, x, 0xff, rgb.blue, rgb.green, rgb.red);\n }\n x += 1;\n if (i % 2 === 1 && i + 1 < value) {\n current = this.readUInt8();\n }\n }\n if ((((value + 1) >> 1) & 1) === 1) {\n this.pos += 1;\n }\n continue;\n }\n\n for (let i = 0; i < count; i += 1) {\n const nibble = i % 2 === 0 ? (value & 0xf0) >> 4 : value & 0x0f;\n const rgb = this.getPaletteColor(nibble);\n if (x < this.width && y >= 0 && y < this.height) {\n this.setPixel(y, x, 0xff, rgb.blue, rgb.green, rgb.red);\n }\n x += 1;\n }\n }\n }\n\n getData(): Uint8Array {\n return this.data;\n }\n}\n\nexport function decode(bmpData: BmpBinaryInput, options?: DecodeOptions): DecodedBmp {\n return new BmpDecoder(bmpData, options);\n}\n\nexport { BmpDecoder };\n","import { assertInteger } from \"./binary\";\nimport type {\n BmpImageData,\n BmpPaletteColor,\n EncodeBitDepth,\n EncodeOptions,\n EncodedBmp,\n} from \"./types\";\n\nconst FILE_HEADER_SIZE = 14;\nconst INFO_HEADER_SIZE = 40;\nconst BYTES_PER_PIXEL_ABGR = 4;\nconst SUPPORTED_BIT_DEPTHS = [1, 4, 8, 16, 24, 32] as const;\n\ntype SupportedBitDepth = (typeof SUPPORTED_BIT_DEPTHS)[number];\ntype ResolvedEncodeOptions = Required<Pick<EncodeOptions, \"orientation\" | \"bitPP\">> & {\n palette: BmpPaletteColor[];\n};\n\nfunction isSupportedBitDepth(value: number): value is SupportedBitDepth {\n return (SUPPORTED_BIT_DEPTHS as readonly number[]).includes(value);\n}\n\nfunction normalizeEncodeOptions(qualityOrOptions?: number | EncodeOptions): ResolvedEncodeOptions {\n if (typeof qualityOrOptions === \"number\" || typeof qualityOrOptions === \"undefined\") {\n return {\n orientation: \"top-down\",\n bitPP: 24,\n palette: [],\n };\n }\n\n return {\n orientation: qualityOrOptions.orientation ?? \"top-down\",\n bitPP: qualityOrOptions.bitPP ?? 24,\n palette: qualityOrOptions.palette ?? [],\n };\n}\n\nclass BmpEncoder {\n private readonly pixelData: Uint8Array;\n private readonly width: number;\n private readonly height: number;\n private readonly options: ResolvedEncodeOptions;\n private readonly palette: BmpPaletteColor[];\n private readonly exactPaletteIndex = new Map<number, number>();\n\n constructor(imgData: BmpImageData, options: ResolvedEncodeOptions) {\n this.pixelData = imgData.data;\n this.width = imgData.width;\n this.height = imgData.height;\n this.options = options;\n this.palette = this.normalizePalette(options);\n\n assertInteger(\"width\", this.width);\n assertInteger(\"height\", this.height);\n\n if (!isSupportedBitDepth(this.options.bitPP)) {\n throw new Error(\n `Unsupported encode bit depth: ${this.options.bitPP}. Supported: 1, 4, 8, 16, 24, 32.`,\n );\n }\n\n const minLength = this.width * this.height * BYTES_PER_PIXEL_ABGR;\n if (this.pixelData.length < minLength) {\n throw new Error(\n `Image data is too short: expected at least ${minLength} bytes for ${this.width}x${this.height} ABGR data.`,\n );\n }\n\n for (let i = 0; i < this.palette.length; i += 1) {\n const color = this.palette[i]!;\n const key = this.paletteKey(color.quad, color.blue, color.green, color.red);\n if (!this.exactPaletteIndex.has(key)) {\n this.exactPaletteIndex.set(key, i);\n }\n }\n }\n\n private normalizePalette(options: ResolvedEncodeOptions): BmpPaletteColor[] {\n if (options.bitPP === 1) {\n const palette = options.palette.length\n ? options.palette\n : [\n { red: 255, green: 255, blue: 255, quad: 0 },\n { red: 0, green: 0, blue: 0, quad: 0 },\n ];\n this.validatePalette(options.bitPP, palette);\n return palette;\n }\n\n if (options.bitPP === 4 || options.bitPP === 8) {\n if (options.palette.length === 0) {\n throw new Error(`Encoding ${options.bitPP}-bit BMP requires a non-empty palette.`);\n }\n this.validatePalette(options.bitPP, options.palette);\n return options.palette;\n }\n\n return [];\n }\n\n private validatePalette(bitPP: 1 | 4 | 8, palette: BmpPaletteColor[]): void {\n const maxSize = 1 << bitPP;\n if (palette.length === 0 || palette.length > maxSize) {\n throw new Error(\n `Palette size ${palette.length} is invalid for ${bitPP}-bit BMP. Expected 1..${maxSize}.`,\n );\n }\n\n for (const color of palette) {\n this.validateChannel(\"palette.red\", color.red);\n this.validateChannel(\"palette.green\", color.green);\n this.validateChannel(\"palette.blue\", color.blue);\n this.validateChannel(\"palette.quad\", color.quad);\n }\n }\n\n private validateChannel(name: string, value: number): void {\n if (!Number.isInteger(value) || value < 0 || value > 255) {\n throw new Error(`${name} must be an integer between 0 and 255.`);\n }\n }\n\n private rowStride(): number {\n return Math.floor((this.options.bitPP * this.width + 31) / 32) * 4;\n }\n\n private sourceY(fileRow: number): number {\n return this.options.orientation === \"top-down\" ? fileRow : this.height - 1 - fileRow;\n }\n\n private sourceOffset(x: number, y: number): number {\n return (y * this.width + x) * BYTES_PER_PIXEL_ABGR;\n }\n\n private paletteKey(alpha: number, blue: number, green: number, red: number): number {\n return (\n (((alpha & 0xff) << 24) | ((blue & 0xff) << 16) | ((green & 0xff) << 8) | (red & 0xff)) >>> 0\n );\n }\n\n private findPaletteIndex(a: number, b: number, g: number, r: number): number {\n const exact = this.exactPaletteIndex.get(this.paletteKey(a, b, g, r));\n if (exact !== undefined) {\n return exact;\n }\n\n let bestIndex = 0;\n let bestDistance = Number.POSITIVE_INFINITY;\n\n for (let i = 0; i < this.palette.length; i += 1) {\n const color = this.palette[i]!;\n const dr = color.red - r;\n const dg = color.green - g;\n const db = color.blue - b;\n const da = color.quad - a;\n const distance = dr * dr + dg * dg + db * db + da * da;\n if (distance < bestDistance) {\n bestDistance = distance;\n bestIndex = i;\n }\n }\n\n return bestIndex;\n }\n\n private writePalette(output: Uint8Array, paletteOffset: number): void {\n for (let i = 0; i < this.palette.length; i += 1) {\n const color = this.palette[i]!;\n const base = paletteOffset + i * 4;\n output[base] = color.blue;\n output[base + 1] = color.green;\n output[base + 2] = color.red;\n output[base + 3] = color.quad;\n }\n }\n\n private encode1Bit(output: Uint8Array, pixelOffset: number, stride: number): void {\n for (let fileRow = 0; fileRow < this.height; fileRow += 1) {\n const srcY = this.sourceY(fileRow);\n const rowStart = pixelOffset + fileRow * stride;\n\n for (let x = 0; x < this.width; x += 8) {\n let packed = 0;\n for (let bit = 0; bit < 8; bit += 1) {\n const px = x + bit;\n if (px >= this.width) {\n break;\n }\n const source = this.sourceOffset(px, srcY);\n const a = this.pixelData[source] ?? 0xff;\n const b = this.pixelData[source + 1] ?? 0;\n const g = this.pixelData[source + 2] ?? 0;\n const r = this.pixelData[source + 3] ?? 0;\n const idx = this.findPaletteIndex(a, b, g, r) & 0x01;\n packed |= idx << (7 - bit);\n }\n output[rowStart + Math.floor(x / 8)] = packed;\n }\n }\n }\n\n private encode4Bit(output: Uint8Array, pixelOffset: number, stride: number): void {\n for (let fileRow = 0; fileRow < this.height; fileRow += 1) {\n const srcY = this.sourceY(fileRow);\n const rowStart = pixelOffset + fileRow * stride;\n\n for (let x = 0; x < this.width; x += 2) {\n const sourceA = this.sourceOffset(x, srcY);\n const idxA = this.findPaletteIndex(\n this.pixelData[sourceA] ?? 0xff,\n this.pixelData[sourceA + 1] ?? 0,\n this.pixelData[sourceA + 2] ?? 0,\n this.pixelData[sourceA + 3] ?? 0,\n );\n\n let idxB = 0;\n if (x + 1 < this.width) {\n const sourceB = this.sourceOffset(x + 1, srcY);\n idxB = this.findPaletteIndex(\n this.pixelData[sourceB] ?? 0xff,\n this.pixelData[sourceB + 1] ?? 0,\n this.pixelData[sourceB + 2] ?? 0,\n this.pixelData[sourceB + 3] ?? 0,\n );\n }\n\n output[rowStart + Math.floor(x / 2)] = ((idxA & 0x0f) << 4) | (idxB & 0x0f);\n }\n }\n }\n\n private encode8Bit(output: Uint8Array, pixelOffset: number, stride: number): void {\n for (let fileRow = 0; fileRow < this.height; fileRow += 1) {\n const srcY = this.sourceY(fileRow);\n const rowStart = pixelOffset + fileRow * stride;\n\n for (let x = 0; x < this.width; x += 1) {\n const source = this.sourceOffset(x, srcY);\n output[rowStart + x] = this.findPaletteIndex(\n this.pixelData[source] ?? 0xff,\n this.pixelData[source + 1] ?? 0,\n this.pixelData[source + 2] ?? 0,\n this.pixelData[source + 3] ?? 0,\n );\n }\n }\n }\n\n private encode16Bit(\n output: Uint8Array,\n view: DataView,\n pixelOffset: number,\n stride: number,\n ): void {\n for (let fileRow = 0; fileRow < this.height; fileRow += 1) {\n const srcY = this.sourceY(fileRow);\n const rowStart = pixelOffset + fileRow * stride;\n\n for (let x = 0; x < this.width; x += 1) {\n const source = this.sourceOffset(x, srcY);\n const b = this.pixelData[source + 1] ?? 0;\n const g = this.pixelData[source + 2] ?? 0;\n const r = this.pixelData[source + 3] ?? 0;\n\n const value = (((r >> 3) & 0x1f) << 10) | (((g >> 3) & 0x1f) << 5) | ((b >> 3) & 0x1f);\n view.setUint16(rowStart + x * 2, value, true);\n }\n }\n }\n\n private encode24Bit(output: Uint8Array, pixelOffset: number, stride: number): void {\n for (let fileRow = 0; fileRow < this.height; fileRow += 1) {\n const srcY = this.sourceY(fileRow);\n const rowStart = pixelOffset + fileRow * stride;\n\n for (let x = 0; x < this.width; x += 1) {\n const source = this.sourceOffset(x, srcY);\n const target = rowStart + x * 3;\n\n output[target] = this.pixelData[source + 1] ?? 0;\n output[target + 1] = this.pixelData[source + 2] ?? 0;\n output[target + 2] = this.pixelData[source + 3] ?? 0;\n }\n }\n }\n\n private encode32Bit(output: Uint8Array, pixelOffset: number, stride: number): void {\n for (let fileRow = 0; fileRow < this.height; fileRow += 1) {\n const srcY = this.sourceY(fileRow);\n const rowStart = pixelOffset + fileRow * stride;\n\n for (let x = 0; x < this.width; x += 1) {\n const source = this.sourceOffset(x, srcY);\n const target = rowStart + x * 4;\n\n output[target] = this.pixelData[source + 1] ?? 0;\n output[target + 1] = this.pixelData[source + 2] ?? 0;\n output[target + 2] = this.pixelData[source + 3] ?? 0;\n output[target + 3] = this.pixelData[source] ?? 0xff;\n }\n }\n }\n\n encode(): Uint8Array {\n const stride = this.rowStride();\n const imageSize = stride * this.height;\n const paletteSize = this.palette.length * 4;\n const offset = FILE_HEADER_SIZE + INFO_HEADER_SIZE + paletteSize;\n const totalSize = offset + imageSize;\n const output = new Uint8Array(totalSize);\n const view = new DataView(output.buffer, output.byteOffset, output.byteLength);\n\n // BITMAPFILEHEADER\n output[0] = 0x42; // B\n output[1] = 0x4d; // M\n view.setUint32(2, totalSize, true);\n view.setUint32(6, 0, true);\n view.setUint32(10, offset, true);\n\n // BITMAPINFOHEADER\n view.setUint32(14, INFO_HEADER_SIZE, true);\n view.setInt32(18, this.width, true);\n const signedHeight = this.options.orientation === \"top-down\" ? -this.height : this.height;\n view.setInt32(22, signedHeight, true);\n view.setUint16(26, 1, true);\n view.setUint16(28, this.options.bitPP, true);\n view.setUint32(30, 0, true);\n view.setUint32(34, imageSize, true);\n view.setUint32(38, 0, true);\n view.setUint32(42, 0, true);\n view.setUint32(46, this.palette.length, true);\n view.setUint32(50, 0, true);\n\n if (this.palette.length > 0) {\n this.writePalette(output, FILE_HEADER_SIZE + INFO_HEADER_SIZE);\n }\n\n switch (this.options.bitPP as EncodeBitDepth) {\n case 1:\n this.encode1Bit(output, offset, stride);\n break;\n case 4:\n this.encode4Bit(output, offset, stride);\n break;\n case 8:\n this.encode8Bit(output, offset, stride);\n break;\n case 16:\n this.encode16Bit(output, view, offset, stride);\n break;\n case 24:\n this.encode24Bit(output, offset, stride);\n break;\n case 32:\n this.encode32Bit(output, offset, stride);\n break;\n }\n\n return output;\n }\n}\n\nexport function encode(\n imgData: BmpImageData,\n qualityOrOptions?: number | EncodeOptions,\n): EncodedBmp {\n const options = normalizeEncodeOptions(qualityOrOptions);\n const encoder = new BmpEncoder(imgData, options);\n const data = encoder.encode();\n\n return {\n data,\n width: imgData.width,\n height: imgData.height,\n };\n}\n\nexport { BmpEncoder };\n","import { decode } from \"./decoder\";\nimport type { BmpBinaryInput, DecodeColorOptions, DecodedBmp, DecodedRgb } from \"./types\";\n\nfunction rgbaToRgb(rgba: Uint8Array): Uint8Array {\n if (rgba.length % 4 !== 0) {\n throw new Error(\"RGBA input length must be a multiple of 4.\");\n }\n\n const rgb = new Uint8Array((rgba.length / 4) * 3);\n\n for (let src = 0, dst = 0; src < rgba.length; src += 4, dst += 3) {\n const red = rgba[src] ?? 0;\n const green = rgba[src + 1] ?? 0;\n const blue = rgba[src + 2] ?? 0;\n\n rgb[dst] = red;\n rgb[dst + 1] = green;\n rgb[dst + 2] = blue;\n }\n\n return rgb;\n}\n\n/**\n * Decode BMP data directly to RGBA without changing the default `decode` behavior.\n */\nexport function decodeRgba(bmpData: BmpBinaryInput, options: DecodeColorOptions = {}): DecodedBmp {\n return decode(bmpData, { ...options, toRGBA: true });\n}\n\n/**\n * Decode BMP data to packed RGB bytes (`width * height * 3`).\n */\nexport function decodeRgb(bmpData: BmpBinaryInput, options: DecodeColorOptions = {}): DecodedRgb {\n const rgbaDecoded = decodeRgba(bmpData, options);\n\n return {\n data: rgbaToRgb(rgbaDecoded.data),\n width: rgbaDecoded.width,\n height: rgbaDecoded.height,\n channels: 3,\n format: \"rgb\",\n };\n}\n"],"mappings":"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","names":["rgb","FILE_HEADER_SIZE"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { D as DecodedBmp, B as BmpPaletteColor, a as BmpBinaryInput, b as DecodeOptions, c as BmpImageData, E as EncodeOptions, d as EncodedBmp } from './types-
|
|
2
|
-
export {
|
|
1
|
+
import { D as DecodedBmp, B as BmpPaletteColor, a as BmpBinaryInput, b as DecodeOptions, c as BmpImageData, E as EncodeOptions, d as EncodedBmp, e as DecodeColorOptions, f as DecodedRgb } from './types-BGopbNUS.cjs';
|
|
2
|
+
export { g as EncodeBitDepth } from './types-BGopbNUS.cjs';
|
|
3
3
|
|
|
4
4
|
declare class BmpDecoder implements DecodedBmp {
|
|
5
5
|
private pos;
|
|
@@ -92,9 +92,20 @@ declare class BmpEncoder {
|
|
|
92
92
|
}
|
|
93
93
|
declare function encode(imgData: BmpImageData, qualityOrOptions?: number | EncodeOptions): EncodedBmp;
|
|
94
94
|
|
|
95
|
+
/**
|
|
96
|
+
* Decode BMP data directly to RGBA without changing the default `decode` behavior.
|
|
97
|
+
*/
|
|
98
|
+
declare function decodeRgba(bmpData: BmpBinaryInput, options?: DecodeColorOptions): DecodedBmp;
|
|
99
|
+
/**
|
|
100
|
+
* Decode BMP data to packed RGB bytes (`width * height * 3`).
|
|
101
|
+
*/
|
|
102
|
+
declare function decodeRgb(bmpData: BmpBinaryInput, options?: DecodeColorOptions): DecodedRgb;
|
|
103
|
+
|
|
95
104
|
declare const bmp: {
|
|
96
105
|
encode: typeof encode;
|
|
97
106
|
decode: typeof decode;
|
|
107
|
+
decodeRgba: typeof decodeRgba;
|
|
108
|
+
decodeRgb: typeof decodeRgb;
|
|
98
109
|
};
|
|
99
110
|
|
|
100
|
-
export { BmpBinaryInput, BmpDecoder, BmpEncoder, BmpImageData, BmpPaletteColor, DecodeOptions, DecodedBmp, EncodeOptions, EncodedBmp, decode, bmp as default, encode };
|
|
111
|
+
export { BmpBinaryInput, BmpDecoder, BmpEncoder, BmpImageData, BmpPaletteColor, DecodeColorOptions, DecodeOptions, DecodedBmp, DecodedRgb, EncodeOptions, EncodedBmp, decode, decodeRgb, decodeRgba, bmp as default, encode };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { D as DecodedBmp, B as BmpPaletteColor, a as BmpBinaryInput, b as DecodeOptions, c as BmpImageData, E as EncodeOptions, d as EncodedBmp } from './types-
|
|
2
|
-
export {
|
|
1
|
+
import { D as DecodedBmp, B as BmpPaletteColor, a as BmpBinaryInput, b as DecodeOptions, c as BmpImageData, E as EncodeOptions, d as EncodedBmp, e as DecodeColorOptions, f as DecodedRgb } from './types-BGopbNUS.js';
|
|
2
|
+
export { g as EncodeBitDepth } from './types-BGopbNUS.js';
|
|
3
3
|
|
|
4
4
|
declare class BmpDecoder implements DecodedBmp {
|
|
5
5
|
private pos;
|
|
@@ -92,9 +92,20 @@ declare class BmpEncoder {
|
|
|
92
92
|
}
|
|
93
93
|
declare function encode(imgData: BmpImageData, qualityOrOptions?: number | EncodeOptions): EncodedBmp;
|
|
94
94
|
|
|
95
|
+
/**
|
|
96
|
+
* Decode BMP data directly to RGBA without changing the default `decode` behavior.
|
|
97
|
+
*/
|
|
98
|
+
declare function decodeRgba(bmpData: BmpBinaryInput, options?: DecodeColorOptions): DecodedBmp;
|
|
99
|
+
/**
|
|
100
|
+
* Decode BMP data to packed RGB bytes (`width * height * 3`).
|
|
101
|
+
*/
|
|
102
|
+
declare function decodeRgb(bmpData: BmpBinaryInput, options?: DecodeColorOptions): DecodedRgb;
|
|
103
|
+
|
|
95
104
|
declare const bmp: {
|
|
96
105
|
encode: typeof encode;
|
|
97
106
|
decode: typeof decode;
|
|
107
|
+
decodeRgba: typeof decodeRgba;
|
|
108
|
+
decodeRgb: typeof decodeRgb;
|
|
98
109
|
};
|
|
99
110
|
|
|
100
|
-
export { BmpBinaryInput, BmpDecoder, BmpEncoder, BmpImageData, BmpPaletteColor, DecodeOptions, DecodedBmp, EncodeOptions, EncodedBmp, decode, bmp as default, encode };
|
|
111
|
+
export { BmpBinaryInput, BmpDecoder, BmpEncoder, BmpImageData, BmpPaletteColor, DecodeColorOptions, DecodeOptions, DecodedBmp, DecodedRgb, EncodeOptions, EncodedBmp, decode, decodeRgb, decodeRgba, bmp as default, encode };
|
package/dist/index.js
CHANGED
|
@@ -5,16 +5,50 @@ import {
|
|
|
5
5
|
encode
|
|
6
6
|
} from "./chunk-YH5DJH4H.js";
|
|
7
7
|
|
|
8
|
+
// src/output-format.ts
|
|
9
|
+
function rgbaToRgb(rgba) {
|
|
10
|
+
if (rgba.length % 4 !== 0) {
|
|
11
|
+
throw new Error("RGBA input length must be a multiple of 4.");
|
|
12
|
+
}
|
|
13
|
+
const rgb = new Uint8Array(rgba.length / 4 * 3);
|
|
14
|
+
for (let src = 0, dst = 0; src < rgba.length; src += 4, dst += 3) {
|
|
15
|
+
const red = rgba[src] ?? 0;
|
|
16
|
+
const green = rgba[src + 1] ?? 0;
|
|
17
|
+
const blue = rgba[src + 2] ?? 0;
|
|
18
|
+
rgb[dst] = red;
|
|
19
|
+
rgb[dst + 1] = green;
|
|
20
|
+
rgb[dst + 2] = blue;
|
|
21
|
+
}
|
|
22
|
+
return rgb;
|
|
23
|
+
}
|
|
24
|
+
function decodeRgba(bmpData, options = {}) {
|
|
25
|
+
return decode(bmpData, { ...options, toRGBA: true });
|
|
26
|
+
}
|
|
27
|
+
function decodeRgb(bmpData, options = {}) {
|
|
28
|
+
const rgbaDecoded = decodeRgba(bmpData, options);
|
|
29
|
+
return {
|
|
30
|
+
data: rgbaToRgb(rgbaDecoded.data),
|
|
31
|
+
width: rgbaDecoded.width,
|
|
32
|
+
height: rgbaDecoded.height,
|
|
33
|
+
channels: 3,
|
|
34
|
+
format: "rgb"
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
8
38
|
// src/index.ts
|
|
9
39
|
var bmp = {
|
|
10
40
|
encode,
|
|
11
|
-
decode
|
|
41
|
+
decode,
|
|
42
|
+
decodeRgba,
|
|
43
|
+
decodeRgb
|
|
12
44
|
};
|
|
13
45
|
var index_default = bmp;
|
|
14
46
|
export {
|
|
15
47
|
BmpDecoder,
|
|
16
48
|
BmpEncoder,
|
|
17
49
|
decode,
|
|
50
|
+
decodeRgb,
|
|
51
|
+
decodeRgba,
|
|
18
52
|
index_default as default,
|
|
19
53
|
encode
|
|
20
54
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { decode } from \"./decoder\";\nimport { encode } from \"./encoder\";\n\nexport type {\n BmpBinaryInput,\n EncodeBitDepth,\n BmpImageData,\n BmpPaletteColor,\n DecodeOptions,\n DecodedBmp,\n EncodeOptions,\n EncodedBmp,\n} from \"./types\";\nexport { BmpDecoder } from \"./decoder\";\nexport { BmpEncoder } from \"./encoder\";\nexport { encode, decode };\n\nconst bmp = {\n encode,\n decode,\n};\n\nexport default bmp;\n"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../src/output-format.ts","../src/index.ts"],"sourcesContent":["import { decode } from \"./decoder\";\nimport type { BmpBinaryInput, DecodeColorOptions, DecodedBmp, DecodedRgb } from \"./types\";\n\nfunction rgbaToRgb(rgba: Uint8Array): Uint8Array {\n if (rgba.length % 4 !== 0) {\n throw new Error(\"RGBA input length must be a multiple of 4.\");\n }\n\n const rgb = new Uint8Array((rgba.length / 4) * 3);\n\n for (let src = 0, dst = 0; src < rgba.length; src += 4, dst += 3) {\n const red = rgba[src] ?? 0;\n const green = rgba[src + 1] ?? 0;\n const blue = rgba[src + 2] ?? 0;\n\n rgb[dst] = red;\n rgb[dst + 1] = green;\n rgb[dst + 2] = blue;\n }\n\n return rgb;\n}\n\n/**\n * Decode BMP data directly to RGBA without changing the default `decode` behavior.\n */\nexport function decodeRgba(bmpData: BmpBinaryInput, options: DecodeColorOptions = {}): DecodedBmp {\n return decode(bmpData, { ...options, toRGBA: true });\n}\n\n/**\n * Decode BMP data to packed RGB bytes (`width * height * 3`).\n */\nexport function decodeRgb(bmpData: BmpBinaryInput, options: DecodeColorOptions = {}): DecodedRgb {\n const rgbaDecoded = decodeRgba(bmpData, options);\n\n return {\n data: rgbaToRgb(rgbaDecoded.data),\n width: rgbaDecoded.width,\n height: rgbaDecoded.height,\n channels: 3,\n format: \"rgb\",\n };\n}\n","import { decode } from \"./decoder\";\nimport { encode } from \"./encoder\";\nimport { decodeRgb, decodeRgba } from \"./output-format\";\n\nexport type {\n BmpBinaryInput,\n DecodeColorOptions,\n EncodeBitDepth,\n BmpImageData,\n BmpPaletteColor,\n DecodeOptions,\n DecodedBmp,\n DecodedRgb,\n EncodeOptions,\n EncodedBmp,\n} from \"./types\";\nexport { BmpDecoder } from \"./decoder\";\nexport { BmpEncoder } from \"./encoder\";\nexport { encode, decode, decodeRgba, decodeRgb };\n\nconst bmp = {\n encode,\n decode,\n decodeRgba,\n decodeRgb,\n};\n\nexport default bmp;\n"],"mappings":";;;;;;;;AAGA,SAAS,UAAU,MAA8B;AAC/C,MAAI,KAAK,SAAS,MAAM,GAAG;AACzB,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAEA,QAAM,MAAM,IAAI,WAAY,KAAK,SAAS,IAAK,CAAC;AAEhD,WAAS,MAAM,GAAG,MAAM,GAAG,MAAM,KAAK,QAAQ,OAAO,GAAG,OAAO,GAAG;AAChE,UAAM,MAAM,KAAK,GAAG,KAAK;AACzB,UAAM,QAAQ,KAAK,MAAM,CAAC,KAAK;AAC/B,UAAM,OAAO,KAAK,MAAM,CAAC,KAAK;AAE9B,QAAI,GAAG,IAAI;AACX,QAAI,MAAM,CAAC,IAAI;AACf,QAAI,MAAM,CAAC,IAAI;AAAA,EACjB;AAEA,SAAO;AACT;AAKO,SAAS,WAAW,SAAyB,UAA8B,CAAC,GAAe;AAChG,SAAO,OAAO,SAAS,EAAE,GAAG,SAAS,QAAQ,KAAK,CAAC;AACrD;AAKO,SAAS,UAAU,SAAyB,UAA8B,CAAC,GAAe;AAC/F,QAAM,cAAc,WAAW,SAAS,OAAO;AAE/C,SAAO;AAAA,IACL,MAAM,UAAU,YAAY,IAAI;AAAA,IAChC,OAAO,YAAY;AAAA,IACnB,QAAQ,YAAY;AAAA,IACpB,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AACF;;;ACvBA,IAAM,MAAM;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAO,gBAAQ;","names":[]}
|
package/dist/sharp/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as sharp from 'sharp';
|
|
2
|
-
import {
|
|
2
|
+
import { g as EncodeBitDepth, B as BmpPaletteColor } from '../types-BGopbNUS.cjs';
|
|
3
3
|
|
|
4
4
|
type PixelSource = Uint8Array | ArrayBufferLike | ArrayBufferView;
|
|
5
5
|
type SharpRawChannels = 3 | 4;
|
package/dist/sharp/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as sharp from 'sharp';
|
|
2
|
-
import {
|
|
2
|
+
import { g as EncodeBitDepth, B as BmpPaletteColor } from '../types-BGopbNUS.js';
|
|
3
3
|
|
|
4
4
|
type PixelSource = Uint8Array | ArrayBufferLike | ArrayBufferView;
|
|
5
5
|
type SharpRawChannels = 3 | 4;
|
|
@@ -20,6 +20,7 @@ interface DecodeOptions {
|
|
|
20
20
|
treat16BitAs15BitAlpha?: boolean;
|
|
21
21
|
toRGBA?: boolean;
|
|
22
22
|
}
|
|
23
|
+
type DecodeColorOptions = Omit<DecodeOptions, "toRGBA">;
|
|
23
24
|
interface EncodedBmp {
|
|
24
25
|
data: Uint8Array;
|
|
25
26
|
width: number;
|
|
@@ -44,5 +45,9 @@ interface DecodedBmp {
|
|
|
44
45
|
data: Uint8Array;
|
|
45
46
|
getData(): Uint8Array;
|
|
46
47
|
}
|
|
48
|
+
interface DecodedRgb extends BmpImageData {
|
|
49
|
+
channels: 3;
|
|
50
|
+
format: "rgb";
|
|
51
|
+
}
|
|
47
52
|
|
|
48
|
-
export type { BmpPaletteColor as B, DecodedBmp as D, EncodeOptions as E, BmpBinaryInput as a, DecodeOptions as b, BmpImageData as c, EncodedBmp as d,
|
|
53
|
+
export type { BmpPaletteColor as B, DecodedBmp as D, EncodeOptions as E, BmpBinaryInput as a, DecodeOptions as b, BmpImageData as c, EncodedBmp as d, DecodeColorOptions as e, DecodedRgb as f, EncodeBitDepth as g };
|
|
@@ -20,6 +20,7 @@ interface DecodeOptions {
|
|
|
20
20
|
treat16BitAs15BitAlpha?: boolean;
|
|
21
21
|
toRGBA?: boolean;
|
|
22
22
|
}
|
|
23
|
+
type DecodeColorOptions = Omit<DecodeOptions, "toRGBA">;
|
|
23
24
|
interface EncodedBmp {
|
|
24
25
|
data: Uint8Array;
|
|
25
26
|
width: number;
|
|
@@ -44,5 +45,9 @@ interface DecodedBmp {
|
|
|
44
45
|
data: Uint8Array;
|
|
45
46
|
getData(): Uint8Array;
|
|
46
47
|
}
|
|
48
|
+
interface DecodedRgb extends BmpImageData {
|
|
49
|
+
channels: 3;
|
|
50
|
+
format: "rgb";
|
|
51
|
+
}
|
|
47
52
|
|
|
48
|
-
export type { BmpPaletteColor as B, DecodedBmp as D, EncodeOptions as E, BmpBinaryInput as a, DecodeOptions as b, BmpImageData as c, EncodedBmp as d,
|
|
53
|
+
export type { BmpPaletteColor as B, DecodedBmp as D, EncodeOptions as E, BmpBinaryInput as a, DecodeOptions as b, BmpImageData as c, EncodedBmp as d, DecodeColorOptions as e, DecodedRgb as f, EncodeBitDepth as g };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@huh-david/bmp-js",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.1",
|
|
4
4
|
"description": "A pure TypeScript BMP encoder and decoder for Node.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bmp",
|
|
@@ -55,20 +55,23 @@
|
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
57
|
"@changesets/cli": "^2.30.0",
|
|
58
|
-
"@types/node": "^
|
|
58
|
+
"@types/node": "^25.5.0",
|
|
59
|
+
"@vitest/browser": "^4.1.2",
|
|
60
|
+
"@vitest/browser-playwright": "4.1.2",
|
|
59
61
|
"oxfmt": "^0.42.0",
|
|
60
62
|
"oxlint": "^1.57.0",
|
|
63
|
+
"playwright": "^1.58.2",
|
|
61
64
|
"rimraf": "^6.0.1",
|
|
62
|
-
"sharp": "^0.
|
|
65
|
+
"sharp": "^0.34.5",
|
|
63
66
|
"tsup": "^8.5.1",
|
|
64
67
|
"typedoc": "^0.28.14",
|
|
65
68
|
"typedoc-plugin-markdown": "^4.9.0",
|
|
66
|
-
"typescript": "^
|
|
69
|
+
"typescript": "^6.0.2",
|
|
67
70
|
"vitepress": "^1.6.3",
|
|
68
|
-
"vitest": "^
|
|
71
|
+
"vitest": "^4.1.2"
|
|
69
72
|
},
|
|
70
73
|
"peerDependencies": {
|
|
71
|
-
"sharp": "^0.33.5"
|
|
74
|
+
"sharp": "^0.33.5 || ^0.34.0"
|
|
72
75
|
},
|
|
73
76
|
"peerDependenciesMeta": {
|
|
74
77
|
"sharp": {
|
|
@@ -82,6 +85,7 @@
|
|
|
82
85
|
"clean": "rimraf dist coverage",
|
|
83
86
|
"build": "tsup --config tsup.config.ts",
|
|
84
87
|
"test": "pnpm build && vitest run",
|
|
88
|
+
"test:browser": "vitest --config vitest.browser.config.ts run",
|
|
85
89
|
"test:watch": "vitest",
|
|
86
90
|
"lint": "oxlint --import-plugin --vitest-plugin src test",
|
|
87
91
|
"format": "oxfmt --write .",
|
|
@@ -97,7 +101,7 @@
|
|
|
97
101
|
"pack:check": "npm pack --dry-run > /dev/null",
|
|
98
102
|
"check": "pnpm format:check && pnpm lint && pnpm fixtures:validate && pnpm typecheck && pnpm test && pnpm pack:check",
|
|
99
103
|
"changeset": "changeset",
|
|
100
|
-
"version-packages": "changeset version",
|
|
104
|
+
"version-packages": "changeset version && oxfmt --write CHANGELOG.md",
|
|
101
105
|
"release": "changeset publish"
|
|
102
106
|
}
|
|
103
107
|
}
|