@huh-david/bmp-js 0.4.1 → 0.5.0
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 +4 -2
- package/dist/index.cjs +231 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -2
- package/dist/index.d.ts +24 -2
- package/dist/index.js +231 -22
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ This fork is actively maintained and tracks unresolved upstream `shaozilee/bmp-j
|
|
|
14
14
|
- Decoding for BMP bit depths: 1, 4, 8, 15, 16, 24, 32
|
|
15
15
|
- Decoding support for RLE-4 and RLE-8 compressed BMPs
|
|
16
16
|
- Robust DIB handling for CORE/INFO/V4/V5 headers
|
|
17
|
-
- Encoding output
|
|
17
|
+
- Encoding output bit depths: 1, 4, 8, 16, 24, 32
|
|
18
18
|
- Dual package output: ESM + CommonJS
|
|
19
19
|
- First-class TypeScript types
|
|
20
20
|
|
|
@@ -57,7 +57,9 @@ const encoded = encode(
|
|
|
57
57
|
},
|
|
58
58
|
{
|
|
59
59
|
orientation: "bottom-up", // default: "top-down"
|
|
60
|
-
bitPP:
|
|
60
|
+
bitPP: 32, // supported: 1, 4, 8, 16, 24, 32
|
|
61
|
+
// palette is required for 4/8-bit and optional for 1-bit
|
|
62
|
+
// palette: [{ red: 0, green: 0, blue: 0, quad: 0 }, ...],
|
|
61
63
|
},
|
|
62
64
|
);
|
|
63
65
|
```
|
package/dist/index.cjs
CHANGED
|
@@ -553,22 +553,23 @@ function decode(bmpData, options) {
|
|
|
553
553
|
// src/encoder.ts
|
|
554
554
|
var FILE_HEADER_SIZE2 = 14;
|
|
555
555
|
var INFO_HEADER_SIZE = 40;
|
|
556
|
-
var RGB_TRIPLE_SIZE = 3;
|
|
557
556
|
var BYTES_PER_PIXEL_ABGR = 4;
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
return
|
|
557
|
+
var SUPPORTED_BIT_DEPTHS = [1, 4, 8, 16, 24, 32];
|
|
558
|
+
function isSupportedBitDepth(value) {
|
|
559
|
+
return SUPPORTED_BIT_DEPTHS.includes(value);
|
|
561
560
|
}
|
|
562
561
|
function normalizeEncodeOptions(qualityOrOptions) {
|
|
563
562
|
if (typeof qualityOrOptions === "number" || typeof qualityOrOptions === "undefined") {
|
|
564
563
|
return {
|
|
565
564
|
orientation: "top-down",
|
|
566
|
-
bitPP: 24
|
|
565
|
+
bitPP: 24,
|
|
566
|
+
palette: []
|
|
567
567
|
};
|
|
568
568
|
}
|
|
569
569
|
return {
|
|
570
570
|
orientation: qualityOrOptions.orientation ?? "top-down",
|
|
571
|
-
bitPP: qualityOrOptions.bitPP ?? 24
|
|
571
|
+
bitPP: qualityOrOptions.bitPP ?? 24,
|
|
572
|
+
palette: qualityOrOptions.palette ?? []
|
|
572
573
|
};
|
|
573
574
|
}
|
|
574
575
|
var BmpEncoder = class {
|
|
@@ -576,16 +577,19 @@ var BmpEncoder = class {
|
|
|
576
577
|
width;
|
|
577
578
|
height;
|
|
578
579
|
options;
|
|
580
|
+
palette;
|
|
581
|
+
exactPaletteIndex = /* @__PURE__ */ new Map();
|
|
579
582
|
constructor(imgData, options) {
|
|
580
583
|
this.pixelData = imgData.data;
|
|
581
584
|
this.width = imgData.width;
|
|
582
585
|
this.height = imgData.height;
|
|
583
586
|
this.options = options;
|
|
587
|
+
this.palette = this.normalizePalette(options);
|
|
584
588
|
assertInteger("width", this.width);
|
|
585
589
|
assertInteger("height", this.height);
|
|
586
|
-
if (this.options.bitPP
|
|
590
|
+
if (!isSupportedBitDepth(this.options.bitPP)) {
|
|
587
591
|
throw new Error(
|
|
588
|
-
`Unsupported encode bit depth: ${this.options.bitPP}.
|
|
592
|
+
`Unsupported encode bit depth: ${this.options.bitPP}. Supported: 1, 4, 8, 16, 24, 32.`
|
|
589
593
|
);
|
|
590
594
|
}
|
|
591
595
|
const minLength = this.width * this.height * BYTES_PER_PIXEL_ABGR;
|
|
@@ -594,11 +598,204 @@ var BmpEncoder = class {
|
|
|
594
598
|
`Image data is too short: expected at least ${minLength} bytes for ${this.width}x${this.height} ABGR data.`
|
|
595
599
|
);
|
|
596
600
|
}
|
|
601
|
+
for (let i = 0; i < this.palette.length; i += 1) {
|
|
602
|
+
const color = this.palette[i];
|
|
603
|
+
const key = this.paletteKey(color.quad, color.blue, color.green, color.red);
|
|
604
|
+
if (!this.exactPaletteIndex.has(key)) {
|
|
605
|
+
this.exactPaletteIndex.set(key, i);
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
normalizePalette(options) {
|
|
610
|
+
if (options.bitPP === 1) {
|
|
611
|
+
const palette = options.palette.length ? options.palette : [
|
|
612
|
+
{ red: 255, green: 255, blue: 255, quad: 0 },
|
|
613
|
+
{ red: 0, green: 0, blue: 0, quad: 0 }
|
|
614
|
+
];
|
|
615
|
+
this.validatePalette(options.bitPP, palette);
|
|
616
|
+
return palette;
|
|
617
|
+
}
|
|
618
|
+
if (options.bitPP === 4 || options.bitPP === 8) {
|
|
619
|
+
if (options.palette.length === 0) {
|
|
620
|
+
throw new Error(`Encoding ${options.bitPP}-bit BMP requires a non-empty palette.`);
|
|
621
|
+
}
|
|
622
|
+
this.validatePalette(options.bitPP, options.palette);
|
|
623
|
+
return options.palette;
|
|
624
|
+
}
|
|
625
|
+
return [];
|
|
626
|
+
}
|
|
627
|
+
validatePalette(bitPP, palette) {
|
|
628
|
+
const maxSize = 1 << bitPP;
|
|
629
|
+
if (palette.length === 0 || palette.length > maxSize) {
|
|
630
|
+
throw new Error(
|
|
631
|
+
`Palette size ${palette.length} is invalid for ${bitPP}-bit BMP. Expected 1..${maxSize}.`
|
|
632
|
+
);
|
|
633
|
+
}
|
|
634
|
+
for (const color of palette) {
|
|
635
|
+
this.validateChannel("palette.red", color.red);
|
|
636
|
+
this.validateChannel("palette.green", color.green);
|
|
637
|
+
this.validateChannel("palette.blue", color.blue);
|
|
638
|
+
this.validateChannel("palette.quad", color.quad);
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
validateChannel(name, value) {
|
|
642
|
+
if (!Number.isInteger(value) || value < 0 || value > 255) {
|
|
643
|
+
throw new Error(`${name} must be an integer between 0 and 255.`);
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
rowStride() {
|
|
647
|
+
return Math.floor((this.options.bitPP * this.width + 31) / 32) * 4;
|
|
648
|
+
}
|
|
649
|
+
sourceY(fileRow) {
|
|
650
|
+
return this.options.orientation === "top-down" ? fileRow : this.height - 1 - fileRow;
|
|
651
|
+
}
|
|
652
|
+
sourceOffset(x, y) {
|
|
653
|
+
return (y * this.width + x) * BYTES_PER_PIXEL_ABGR;
|
|
654
|
+
}
|
|
655
|
+
paletteKey(alpha, blue, green, red) {
|
|
656
|
+
return ((alpha & 255) << 24 | (blue & 255) << 16 | (green & 255) << 8 | red & 255) >>> 0;
|
|
657
|
+
}
|
|
658
|
+
findPaletteIndex(a, b, g, r) {
|
|
659
|
+
const exact = this.exactPaletteIndex.get(this.paletteKey(a, b, g, r));
|
|
660
|
+
if (exact !== void 0) {
|
|
661
|
+
return exact;
|
|
662
|
+
}
|
|
663
|
+
let bestIndex = 0;
|
|
664
|
+
let bestDistance = Number.POSITIVE_INFINITY;
|
|
665
|
+
for (let i = 0; i < this.palette.length; i += 1) {
|
|
666
|
+
const color = this.palette[i];
|
|
667
|
+
const dr = color.red - r;
|
|
668
|
+
const dg = color.green - g;
|
|
669
|
+
const db = color.blue - b;
|
|
670
|
+
const da = color.quad - a;
|
|
671
|
+
const distance = dr * dr + dg * dg + db * db + da * da;
|
|
672
|
+
if (distance < bestDistance) {
|
|
673
|
+
bestDistance = distance;
|
|
674
|
+
bestIndex = i;
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
return bestIndex;
|
|
678
|
+
}
|
|
679
|
+
writePalette(output, paletteOffset) {
|
|
680
|
+
for (let i = 0; i < this.palette.length; i += 1) {
|
|
681
|
+
const color = this.palette[i];
|
|
682
|
+
const base = paletteOffset + i * 4;
|
|
683
|
+
output[base] = color.blue;
|
|
684
|
+
output[base + 1] = color.green;
|
|
685
|
+
output[base + 2] = color.red;
|
|
686
|
+
output[base + 3] = color.quad;
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
encode1Bit(output, pixelOffset, stride) {
|
|
690
|
+
for (let fileRow = 0; fileRow < this.height; fileRow += 1) {
|
|
691
|
+
const srcY = this.sourceY(fileRow);
|
|
692
|
+
const rowStart = pixelOffset + fileRow * stride;
|
|
693
|
+
for (let x = 0; x < this.width; x += 8) {
|
|
694
|
+
let packed = 0;
|
|
695
|
+
for (let bit = 0; bit < 8; bit += 1) {
|
|
696
|
+
const px = x + bit;
|
|
697
|
+
if (px >= this.width) {
|
|
698
|
+
break;
|
|
699
|
+
}
|
|
700
|
+
const source = this.sourceOffset(px, srcY);
|
|
701
|
+
const a = this.pixelData[source] ?? 255;
|
|
702
|
+
const b = this.pixelData[source + 1] ?? 0;
|
|
703
|
+
const g = this.pixelData[source + 2] ?? 0;
|
|
704
|
+
const r = this.pixelData[source + 3] ?? 0;
|
|
705
|
+
const idx = this.findPaletteIndex(a, b, g, r) & 1;
|
|
706
|
+
packed |= idx << 7 - bit;
|
|
707
|
+
}
|
|
708
|
+
output[rowStart + Math.floor(x / 8)] = packed;
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
encode4Bit(output, pixelOffset, stride) {
|
|
713
|
+
for (let fileRow = 0; fileRow < this.height; fileRow += 1) {
|
|
714
|
+
const srcY = this.sourceY(fileRow);
|
|
715
|
+
const rowStart = pixelOffset + fileRow * stride;
|
|
716
|
+
for (let x = 0; x < this.width; x += 2) {
|
|
717
|
+
const sourceA = this.sourceOffset(x, srcY);
|
|
718
|
+
const idxA = this.findPaletteIndex(
|
|
719
|
+
this.pixelData[sourceA] ?? 255,
|
|
720
|
+
this.pixelData[sourceA + 1] ?? 0,
|
|
721
|
+
this.pixelData[sourceA + 2] ?? 0,
|
|
722
|
+
this.pixelData[sourceA + 3] ?? 0
|
|
723
|
+
);
|
|
724
|
+
let idxB = 0;
|
|
725
|
+
if (x + 1 < this.width) {
|
|
726
|
+
const sourceB = this.sourceOffset(x + 1, srcY);
|
|
727
|
+
idxB = this.findPaletteIndex(
|
|
728
|
+
this.pixelData[sourceB] ?? 255,
|
|
729
|
+
this.pixelData[sourceB + 1] ?? 0,
|
|
730
|
+
this.pixelData[sourceB + 2] ?? 0,
|
|
731
|
+
this.pixelData[sourceB + 3] ?? 0
|
|
732
|
+
);
|
|
733
|
+
}
|
|
734
|
+
output[rowStart + Math.floor(x / 2)] = (idxA & 15) << 4 | idxB & 15;
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
encode8Bit(output, pixelOffset, stride) {
|
|
739
|
+
for (let fileRow = 0; fileRow < this.height; fileRow += 1) {
|
|
740
|
+
const srcY = this.sourceY(fileRow);
|
|
741
|
+
const rowStart = pixelOffset + fileRow * stride;
|
|
742
|
+
for (let x = 0; x < this.width; x += 1) {
|
|
743
|
+
const source = this.sourceOffset(x, srcY);
|
|
744
|
+
output[rowStart + x] = this.findPaletteIndex(
|
|
745
|
+
this.pixelData[source] ?? 255,
|
|
746
|
+
this.pixelData[source + 1] ?? 0,
|
|
747
|
+
this.pixelData[source + 2] ?? 0,
|
|
748
|
+
this.pixelData[source + 3] ?? 0
|
|
749
|
+
);
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
encode16Bit(output, view, pixelOffset, stride) {
|
|
754
|
+
for (let fileRow = 0; fileRow < this.height; fileRow += 1) {
|
|
755
|
+
const srcY = this.sourceY(fileRow);
|
|
756
|
+
const rowStart = pixelOffset + fileRow * stride;
|
|
757
|
+
for (let x = 0; x < this.width; x += 1) {
|
|
758
|
+
const source = this.sourceOffset(x, srcY);
|
|
759
|
+
const b = this.pixelData[source + 1] ?? 0;
|
|
760
|
+
const g = this.pixelData[source + 2] ?? 0;
|
|
761
|
+
const r = this.pixelData[source + 3] ?? 0;
|
|
762
|
+
const value = (r >> 3 & 31) << 10 | (g >> 3 & 31) << 5 | b >> 3 & 31;
|
|
763
|
+
view.setUint16(rowStart + x * 2, value, true);
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
encode24Bit(output, pixelOffset, stride) {
|
|
768
|
+
for (let fileRow = 0; fileRow < this.height; fileRow += 1) {
|
|
769
|
+
const srcY = this.sourceY(fileRow);
|
|
770
|
+
const rowStart = pixelOffset + fileRow * stride;
|
|
771
|
+
for (let x = 0; x < this.width; x += 1) {
|
|
772
|
+
const source = this.sourceOffset(x, srcY);
|
|
773
|
+
const target = rowStart + x * 3;
|
|
774
|
+
output[target] = this.pixelData[source + 1] ?? 0;
|
|
775
|
+
output[target + 1] = this.pixelData[source + 2] ?? 0;
|
|
776
|
+
output[target + 2] = this.pixelData[source + 3] ?? 0;
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
encode32Bit(output, pixelOffset, stride) {
|
|
781
|
+
for (let fileRow = 0; fileRow < this.height; fileRow += 1) {
|
|
782
|
+
const srcY = this.sourceY(fileRow);
|
|
783
|
+
const rowStart = pixelOffset + fileRow * stride;
|
|
784
|
+
for (let x = 0; x < this.width; x += 1) {
|
|
785
|
+
const source = this.sourceOffset(x, srcY);
|
|
786
|
+
const target = rowStart + x * 4;
|
|
787
|
+
output[target] = this.pixelData[source + 1] ?? 0;
|
|
788
|
+
output[target + 1] = this.pixelData[source + 2] ?? 0;
|
|
789
|
+
output[target + 2] = this.pixelData[source + 3] ?? 0;
|
|
790
|
+
output[target + 3] = this.pixelData[source] ?? 255;
|
|
791
|
+
}
|
|
792
|
+
}
|
|
597
793
|
}
|
|
598
794
|
encode() {
|
|
599
|
-
const stride =
|
|
795
|
+
const stride = this.rowStride();
|
|
600
796
|
const imageSize = stride * this.height;
|
|
601
|
-
const
|
|
797
|
+
const paletteSize = this.palette.length * 4;
|
|
798
|
+
const offset = FILE_HEADER_SIZE2 + INFO_HEADER_SIZE + paletteSize;
|
|
602
799
|
const totalSize = offset + imageSize;
|
|
603
800
|
const output = new Uint8Array(totalSize);
|
|
604
801
|
const view = new DataView(output.buffer, output.byteOffset, output.byteLength);
|
|
@@ -612,23 +809,35 @@ var BmpEncoder = class {
|
|
|
612
809
|
const signedHeight = this.options.orientation === "top-down" ? -this.height : this.height;
|
|
613
810
|
view.setInt32(22, signedHeight, true);
|
|
614
811
|
view.setUint16(26, 1, true);
|
|
615
|
-
view.setUint16(28,
|
|
812
|
+
view.setUint16(28, this.options.bitPP, true);
|
|
616
813
|
view.setUint32(30, 0, true);
|
|
617
814
|
view.setUint32(34, imageSize, true);
|
|
618
815
|
view.setUint32(38, 0, true);
|
|
619
816
|
view.setUint32(42, 0, true);
|
|
620
|
-
view.setUint32(46,
|
|
817
|
+
view.setUint32(46, this.palette.length, true);
|
|
621
818
|
view.setUint32(50, 0, true);
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
819
|
+
if (this.palette.length > 0) {
|
|
820
|
+
this.writePalette(output, FILE_HEADER_SIZE2 + INFO_HEADER_SIZE);
|
|
821
|
+
}
|
|
822
|
+
switch (this.options.bitPP) {
|
|
823
|
+
case 1:
|
|
824
|
+
this.encode1Bit(output, offset, stride);
|
|
825
|
+
break;
|
|
826
|
+
case 4:
|
|
827
|
+
this.encode4Bit(output, offset, stride);
|
|
828
|
+
break;
|
|
829
|
+
case 8:
|
|
830
|
+
this.encode8Bit(output, offset, stride);
|
|
831
|
+
break;
|
|
832
|
+
case 16:
|
|
833
|
+
this.encode16Bit(output, view, offset, stride);
|
|
834
|
+
break;
|
|
835
|
+
case 24:
|
|
836
|
+
this.encode24Bit(output, offset, stride);
|
|
837
|
+
break;
|
|
838
|
+
case 32:
|
|
839
|
+
this.encode32Bit(output, offset, stride);
|
|
840
|
+
break;
|
|
632
841
|
}
|
|
633
842
|
return output;
|
|
634
843
|
}
|
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 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 { BmpImageData, EncodeOptions, EncodedBmp } from \"./types\";\n\nconst FILE_HEADER_SIZE = 14;\nconst INFO_HEADER_SIZE = 40;\nconst RGB_TRIPLE_SIZE = 3;\nconst BYTES_PER_PIXEL_ABGR = 4;\n\nfunction rowStride24(width: number): number {\n const raw = width * RGB_TRIPLE_SIZE;\n return (raw + 3) & ~3;\n}\n\nfunction normalizeEncodeOptions(\n qualityOrOptions?: number | EncodeOptions,\n): Required<EncodeOptions> {\n if (typeof qualityOrOptions === \"number\" || typeof qualityOrOptions === \"undefined\") {\n return {\n orientation: \"top-down\",\n bitPP: 24,\n };\n }\n\n return {\n orientation: qualityOrOptions.orientation ?? \"top-down\",\n bitPP: qualityOrOptions.bitPP ?? 24,\n };\n}\n\nclass BmpEncoder {\n private readonly pixelData: Uint8Array;\n private readonly width: number;\n private readonly height: number;\n private readonly options: Required<EncodeOptions>;\n\n constructor(imgData: BmpImageData, options: Required<EncodeOptions>) {\n this.pixelData = imgData.data;\n this.width = imgData.width;\n this.height = imgData.height;\n this.options = options;\n\n assertInteger(\"width\", this.width);\n assertInteger(\"height\", this.height);\n\n if (this.options.bitPP !== 24) {\n throw new Error(\n `Unsupported encode bit depth: ${this.options.bitPP}. Only 24-bit output is supported.`,\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\n encode(): Uint8Array {\n const stride = rowStride24(this.width);\n const imageSize = stride * this.height;\n const offset = FILE_HEADER_SIZE + INFO_HEADER_SIZE;\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, 24, 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, 0, true);\n view.setUint32(50, 0, true);\n\n for (let fileRow = 0; fileRow < this.height; fileRow += 1) {\n const srcY = this.options.orientation === \"top-down\" ? fileRow : this.height - 1 - fileRow;\n const rowStart = offset + fileRow * stride;\n\n for (let x = 0; x < this.width; x += 1) {\n const source = (srcY * this.width + x) * BYTES_PER_PIXEL_ABGR;\n const target = rowStart + x * RGB_TRIPLE_SIZE;\n\n output[target] = this.pixelData[source + 1] ?? 0; // B\n output[target + 1] = this.pixelData[source + 2] ?? 0; // G\n output[target + 2] = this.pixelData[source + 3] ?? 0; // R\n }\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"],"sourcesContent":["import { decode } from \"./decoder\";\nimport { encode } from \"./encoder\";\n\nexport type {\n BmpBinaryInput,\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"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -5,6 +5,7 @@ interface BmpPaletteColor {
|
|
|
5
5
|
quad: number;
|
|
6
6
|
}
|
|
7
7
|
type BmpBinaryInput = ArrayBuffer | ArrayBufferView;
|
|
8
|
+
type EncodeBitDepth = 1 | 4 | 8 | 16 | 24 | 32;
|
|
8
9
|
interface BmpImageData {
|
|
9
10
|
data: Uint8Array;
|
|
10
11
|
width: number;
|
|
@@ -12,7 +13,8 @@ interface BmpImageData {
|
|
|
12
13
|
}
|
|
13
14
|
interface EncodeOptions {
|
|
14
15
|
orientation?: "top-down" | "bottom-up";
|
|
15
|
-
bitPP?:
|
|
16
|
+
bitPP?: EncodeBitDepth;
|
|
17
|
+
palette?: BmpPaletteColor[];
|
|
16
18
|
}
|
|
17
19
|
interface DecodeOptions {
|
|
18
20
|
treat16BitAs15BitAlpha?: boolean;
|
|
@@ -104,12 +106,32 @@ declare class BmpDecoder implements DecodedBmp {
|
|
|
104
106
|
}
|
|
105
107
|
declare function decode(bmpData: BmpBinaryInput, options?: DecodeOptions): DecodedBmp;
|
|
106
108
|
|
|
109
|
+
type ResolvedEncodeOptions = Required<Pick<EncodeOptions, "orientation" | "bitPP">> & {
|
|
110
|
+
palette: BmpPaletteColor[];
|
|
111
|
+
};
|
|
107
112
|
declare class BmpEncoder {
|
|
108
113
|
private readonly pixelData;
|
|
109
114
|
private readonly width;
|
|
110
115
|
private readonly height;
|
|
111
116
|
private readonly options;
|
|
112
|
-
|
|
117
|
+
private readonly palette;
|
|
118
|
+
private readonly exactPaletteIndex;
|
|
119
|
+
constructor(imgData: BmpImageData, options: ResolvedEncodeOptions);
|
|
120
|
+
private normalizePalette;
|
|
121
|
+
private validatePalette;
|
|
122
|
+
private validateChannel;
|
|
123
|
+
private rowStride;
|
|
124
|
+
private sourceY;
|
|
125
|
+
private sourceOffset;
|
|
126
|
+
private paletteKey;
|
|
127
|
+
private findPaletteIndex;
|
|
128
|
+
private writePalette;
|
|
129
|
+
private encode1Bit;
|
|
130
|
+
private encode4Bit;
|
|
131
|
+
private encode8Bit;
|
|
132
|
+
private encode16Bit;
|
|
133
|
+
private encode24Bit;
|
|
134
|
+
private encode32Bit;
|
|
113
135
|
encode(): Uint8Array;
|
|
114
136
|
}
|
|
115
137
|
declare function encode(imgData: BmpImageData, qualityOrOptions?: number | EncodeOptions): EncodedBmp;
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ interface BmpPaletteColor {
|
|
|
5
5
|
quad: number;
|
|
6
6
|
}
|
|
7
7
|
type BmpBinaryInput = ArrayBuffer | ArrayBufferView;
|
|
8
|
+
type EncodeBitDepth = 1 | 4 | 8 | 16 | 24 | 32;
|
|
8
9
|
interface BmpImageData {
|
|
9
10
|
data: Uint8Array;
|
|
10
11
|
width: number;
|
|
@@ -12,7 +13,8 @@ interface BmpImageData {
|
|
|
12
13
|
}
|
|
13
14
|
interface EncodeOptions {
|
|
14
15
|
orientation?: "top-down" | "bottom-up";
|
|
15
|
-
bitPP?:
|
|
16
|
+
bitPP?: EncodeBitDepth;
|
|
17
|
+
palette?: BmpPaletteColor[];
|
|
16
18
|
}
|
|
17
19
|
interface DecodeOptions {
|
|
18
20
|
treat16BitAs15BitAlpha?: boolean;
|
|
@@ -104,12 +106,32 @@ declare class BmpDecoder implements DecodedBmp {
|
|
|
104
106
|
}
|
|
105
107
|
declare function decode(bmpData: BmpBinaryInput, options?: DecodeOptions): DecodedBmp;
|
|
106
108
|
|
|
109
|
+
type ResolvedEncodeOptions = Required<Pick<EncodeOptions, "orientation" | "bitPP">> & {
|
|
110
|
+
palette: BmpPaletteColor[];
|
|
111
|
+
};
|
|
107
112
|
declare class BmpEncoder {
|
|
108
113
|
private readonly pixelData;
|
|
109
114
|
private readonly width;
|
|
110
115
|
private readonly height;
|
|
111
116
|
private readonly options;
|
|
112
|
-
|
|
117
|
+
private readonly palette;
|
|
118
|
+
private readonly exactPaletteIndex;
|
|
119
|
+
constructor(imgData: BmpImageData, options: ResolvedEncodeOptions);
|
|
120
|
+
private normalizePalette;
|
|
121
|
+
private validatePalette;
|
|
122
|
+
private validateChannel;
|
|
123
|
+
private rowStride;
|
|
124
|
+
private sourceY;
|
|
125
|
+
private sourceOffset;
|
|
126
|
+
private paletteKey;
|
|
127
|
+
private findPaletteIndex;
|
|
128
|
+
private writePalette;
|
|
129
|
+
private encode1Bit;
|
|
130
|
+
private encode4Bit;
|
|
131
|
+
private encode8Bit;
|
|
132
|
+
private encode16Bit;
|
|
133
|
+
private encode24Bit;
|
|
134
|
+
private encode32Bit;
|
|
113
135
|
encode(): Uint8Array;
|
|
114
136
|
}
|
|
115
137
|
declare function encode(imgData: BmpImageData, qualityOrOptions?: number | EncodeOptions): EncodedBmp;
|
package/dist/index.js
CHANGED
|
@@ -523,22 +523,23 @@ function decode(bmpData, options) {
|
|
|
523
523
|
// src/encoder.ts
|
|
524
524
|
var FILE_HEADER_SIZE2 = 14;
|
|
525
525
|
var INFO_HEADER_SIZE = 40;
|
|
526
|
-
var RGB_TRIPLE_SIZE = 3;
|
|
527
526
|
var BYTES_PER_PIXEL_ABGR = 4;
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
return
|
|
527
|
+
var SUPPORTED_BIT_DEPTHS = [1, 4, 8, 16, 24, 32];
|
|
528
|
+
function isSupportedBitDepth(value) {
|
|
529
|
+
return SUPPORTED_BIT_DEPTHS.includes(value);
|
|
531
530
|
}
|
|
532
531
|
function normalizeEncodeOptions(qualityOrOptions) {
|
|
533
532
|
if (typeof qualityOrOptions === "number" || typeof qualityOrOptions === "undefined") {
|
|
534
533
|
return {
|
|
535
534
|
orientation: "top-down",
|
|
536
|
-
bitPP: 24
|
|
535
|
+
bitPP: 24,
|
|
536
|
+
palette: []
|
|
537
537
|
};
|
|
538
538
|
}
|
|
539
539
|
return {
|
|
540
540
|
orientation: qualityOrOptions.orientation ?? "top-down",
|
|
541
|
-
bitPP: qualityOrOptions.bitPP ?? 24
|
|
541
|
+
bitPP: qualityOrOptions.bitPP ?? 24,
|
|
542
|
+
palette: qualityOrOptions.palette ?? []
|
|
542
543
|
};
|
|
543
544
|
}
|
|
544
545
|
var BmpEncoder = class {
|
|
@@ -546,16 +547,19 @@ var BmpEncoder = class {
|
|
|
546
547
|
width;
|
|
547
548
|
height;
|
|
548
549
|
options;
|
|
550
|
+
palette;
|
|
551
|
+
exactPaletteIndex = /* @__PURE__ */ new Map();
|
|
549
552
|
constructor(imgData, options) {
|
|
550
553
|
this.pixelData = imgData.data;
|
|
551
554
|
this.width = imgData.width;
|
|
552
555
|
this.height = imgData.height;
|
|
553
556
|
this.options = options;
|
|
557
|
+
this.palette = this.normalizePalette(options);
|
|
554
558
|
assertInteger("width", this.width);
|
|
555
559
|
assertInteger("height", this.height);
|
|
556
|
-
if (this.options.bitPP
|
|
560
|
+
if (!isSupportedBitDepth(this.options.bitPP)) {
|
|
557
561
|
throw new Error(
|
|
558
|
-
`Unsupported encode bit depth: ${this.options.bitPP}.
|
|
562
|
+
`Unsupported encode bit depth: ${this.options.bitPP}. Supported: 1, 4, 8, 16, 24, 32.`
|
|
559
563
|
);
|
|
560
564
|
}
|
|
561
565
|
const minLength = this.width * this.height * BYTES_PER_PIXEL_ABGR;
|
|
@@ -564,11 +568,204 @@ var BmpEncoder = class {
|
|
|
564
568
|
`Image data is too short: expected at least ${minLength} bytes for ${this.width}x${this.height} ABGR data.`
|
|
565
569
|
);
|
|
566
570
|
}
|
|
571
|
+
for (let i = 0; i < this.palette.length; i += 1) {
|
|
572
|
+
const color = this.palette[i];
|
|
573
|
+
const key = this.paletteKey(color.quad, color.blue, color.green, color.red);
|
|
574
|
+
if (!this.exactPaletteIndex.has(key)) {
|
|
575
|
+
this.exactPaletteIndex.set(key, i);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
normalizePalette(options) {
|
|
580
|
+
if (options.bitPP === 1) {
|
|
581
|
+
const palette = options.palette.length ? options.palette : [
|
|
582
|
+
{ red: 255, green: 255, blue: 255, quad: 0 },
|
|
583
|
+
{ red: 0, green: 0, blue: 0, quad: 0 }
|
|
584
|
+
];
|
|
585
|
+
this.validatePalette(options.bitPP, palette);
|
|
586
|
+
return palette;
|
|
587
|
+
}
|
|
588
|
+
if (options.bitPP === 4 || options.bitPP === 8) {
|
|
589
|
+
if (options.palette.length === 0) {
|
|
590
|
+
throw new Error(`Encoding ${options.bitPP}-bit BMP requires a non-empty palette.`);
|
|
591
|
+
}
|
|
592
|
+
this.validatePalette(options.bitPP, options.palette);
|
|
593
|
+
return options.palette;
|
|
594
|
+
}
|
|
595
|
+
return [];
|
|
596
|
+
}
|
|
597
|
+
validatePalette(bitPP, palette) {
|
|
598
|
+
const maxSize = 1 << bitPP;
|
|
599
|
+
if (palette.length === 0 || palette.length > maxSize) {
|
|
600
|
+
throw new Error(
|
|
601
|
+
`Palette size ${palette.length} is invalid for ${bitPP}-bit BMP. Expected 1..${maxSize}.`
|
|
602
|
+
);
|
|
603
|
+
}
|
|
604
|
+
for (const color of palette) {
|
|
605
|
+
this.validateChannel("palette.red", color.red);
|
|
606
|
+
this.validateChannel("palette.green", color.green);
|
|
607
|
+
this.validateChannel("palette.blue", color.blue);
|
|
608
|
+
this.validateChannel("palette.quad", color.quad);
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
validateChannel(name, value) {
|
|
612
|
+
if (!Number.isInteger(value) || value < 0 || value > 255) {
|
|
613
|
+
throw new Error(`${name} must be an integer between 0 and 255.`);
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
rowStride() {
|
|
617
|
+
return Math.floor((this.options.bitPP * this.width + 31) / 32) * 4;
|
|
618
|
+
}
|
|
619
|
+
sourceY(fileRow) {
|
|
620
|
+
return this.options.orientation === "top-down" ? fileRow : this.height - 1 - fileRow;
|
|
621
|
+
}
|
|
622
|
+
sourceOffset(x, y) {
|
|
623
|
+
return (y * this.width + x) * BYTES_PER_PIXEL_ABGR;
|
|
624
|
+
}
|
|
625
|
+
paletteKey(alpha, blue, green, red) {
|
|
626
|
+
return ((alpha & 255) << 24 | (blue & 255) << 16 | (green & 255) << 8 | red & 255) >>> 0;
|
|
627
|
+
}
|
|
628
|
+
findPaletteIndex(a, b, g, r) {
|
|
629
|
+
const exact = this.exactPaletteIndex.get(this.paletteKey(a, b, g, r));
|
|
630
|
+
if (exact !== void 0) {
|
|
631
|
+
return exact;
|
|
632
|
+
}
|
|
633
|
+
let bestIndex = 0;
|
|
634
|
+
let bestDistance = Number.POSITIVE_INFINITY;
|
|
635
|
+
for (let i = 0; i < this.palette.length; i += 1) {
|
|
636
|
+
const color = this.palette[i];
|
|
637
|
+
const dr = color.red - r;
|
|
638
|
+
const dg = color.green - g;
|
|
639
|
+
const db = color.blue - b;
|
|
640
|
+
const da = color.quad - a;
|
|
641
|
+
const distance = dr * dr + dg * dg + db * db + da * da;
|
|
642
|
+
if (distance < bestDistance) {
|
|
643
|
+
bestDistance = distance;
|
|
644
|
+
bestIndex = i;
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
return bestIndex;
|
|
648
|
+
}
|
|
649
|
+
writePalette(output, paletteOffset) {
|
|
650
|
+
for (let i = 0; i < this.palette.length; i += 1) {
|
|
651
|
+
const color = this.palette[i];
|
|
652
|
+
const base = paletteOffset + i * 4;
|
|
653
|
+
output[base] = color.blue;
|
|
654
|
+
output[base + 1] = color.green;
|
|
655
|
+
output[base + 2] = color.red;
|
|
656
|
+
output[base + 3] = color.quad;
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
encode1Bit(output, pixelOffset, stride) {
|
|
660
|
+
for (let fileRow = 0; fileRow < this.height; fileRow += 1) {
|
|
661
|
+
const srcY = this.sourceY(fileRow);
|
|
662
|
+
const rowStart = pixelOffset + fileRow * stride;
|
|
663
|
+
for (let x = 0; x < this.width; x += 8) {
|
|
664
|
+
let packed = 0;
|
|
665
|
+
for (let bit = 0; bit < 8; bit += 1) {
|
|
666
|
+
const px = x + bit;
|
|
667
|
+
if (px >= this.width) {
|
|
668
|
+
break;
|
|
669
|
+
}
|
|
670
|
+
const source = this.sourceOffset(px, srcY);
|
|
671
|
+
const a = this.pixelData[source] ?? 255;
|
|
672
|
+
const b = this.pixelData[source + 1] ?? 0;
|
|
673
|
+
const g = this.pixelData[source + 2] ?? 0;
|
|
674
|
+
const r = this.pixelData[source + 3] ?? 0;
|
|
675
|
+
const idx = this.findPaletteIndex(a, b, g, r) & 1;
|
|
676
|
+
packed |= idx << 7 - bit;
|
|
677
|
+
}
|
|
678
|
+
output[rowStart + Math.floor(x / 8)] = packed;
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
encode4Bit(output, pixelOffset, stride) {
|
|
683
|
+
for (let fileRow = 0; fileRow < this.height; fileRow += 1) {
|
|
684
|
+
const srcY = this.sourceY(fileRow);
|
|
685
|
+
const rowStart = pixelOffset + fileRow * stride;
|
|
686
|
+
for (let x = 0; x < this.width; x += 2) {
|
|
687
|
+
const sourceA = this.sourceOffset(x, srcY);
|
|
688
|
+
const idxA = this.findPaletteIndex(
|
|
689
|
+
this.pixelData[sourceA] ?? 255,
|
|
690
|
+
this.pixelData[sourceA + 1] ?? 0,
|
|
691
|
+
this.pixelData[sourceA + 2] ?? 0,
|
|
692
|
+
this.pixelData[sourceA + 3] ?? 0
|
|
693
|
+
);
|
|
694
|
+
let idxB = 0;
|
|
695
|
+
if (x + 1 < this.width) {
|
|
696
|
+
const sourceB = this.sourceOffset(x + 1, srcY);
|
|
697
|
+
idxB = this.findPaletteIndex(
|
|
698
|
+
this.pixelData[sourceB] ?? 255,
|
|
699
|
+
this.pixelData[sourceB + 1] ?? 0,
|
|
700
|
+
this.pixelData[sourceB + 2] ?? 0,
|
|
701
|
+
this.pixelData[sourceB + 3] ?? 0
|
|
702
|
+
);
|
|
703
|
+
}
|
|
704
|
+
output[rowStart + Math.floor(x / 2)] = (idxA & 15) << 4 | idxB & 15;
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
encode8Bit(output, pixelOffset, stride) {
|
|
709
|
+
for (let fileRow = 0; fileRow < this.height; fileRow += 1) {
|
|
710
|
+
const srcY = this.sourceY(fileRow);
|
|
711
|
+
const rowStart = pixelOffset + fileRow * stride;
|
|
712
|
+
for (let x = 0; x < this.width; x += 1) {
|
|
713
|
+
const source = this.sourceOffset(x, srcY);
|
|
714
|
+
output[rowStart + x] = this.findPaletteIndex(
|
|
715
|
+
this.pixelData[source] ?? 255,
|
|
716
|
+
this.pixelData[source + 1] ?? 0,
|
|
717
|
+
this.pixelData[source + 2] ?? 0,
|
|
718
|
+
this.pixelData[source + 3] ?? 0
|
|
719
|
+
);
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
encode16Bit(output, view, pixelOffset, stride) {
|
|
724
|
+
for (let fileRow = 0; fileRow < this.height; fileRow += 1) {
|
|
725
|
+
const srcY = this.sourceY(fileRow);
|
|
726
|
+
const rowStart = pixelOffset + fileRow * stride;
|
|
727
|
+
for (let x = 0; x < this.width; x += 1) {
|
|
728
|
+
const source = this.sourceOffset(x, srcY);
|
|
729
|
+
const b = this.pixelData[source + 1] ?? 0;
|
|
730
|
+
const g = this.pixelData[source + 2] ?? 0;
|
|
731
|
+
const r = this.pixelData[source + 3] ?? 0;
|
|
732
|
+
const value = (r >> 3 & 31) << 10 | (g >> 3 & 31) << 5 | b >> 3 & 31;
|
|
733
|
+
view.setUint16(rowStart + x * 2, value, true);
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
encode24Bit(output, pixelOffset, stride) {
|
|
738
|
+
for (let fileRow = 0; fileRow < this.height; fileRow += 1) {
|
|
739
|
+
const srcY = this.sourceY(fileRow);
|
|
740
|
+
const rowStart = pixelOffset + fileRow * stride;
|
|
741
|
+
for (let x = 0; x < this.width; x += 1) {
|
|
742
|
+
const source = this.sourceOffset(x, srcY);
|
|
743
|
+
const target = rowStart + x * 3;
|
|
744
|
+
output[target] = this.pixelData[source + 1] ?? 0;
|
|
745
|
+
output[target + 1] = this.pixelData[source + 2] ?? 0;
|
|
746
|
+
output[target + 2] = this.pixelData[source + 3] ?? 0;
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
encode32Bit(output, pixelOffset, stride) {
|
|
751
|
+
for (let fileRow = 0; fileRow < this.height; fileRow += 1) {
|
|
752
|
+
const srcY = this.sourceY(fileRow);
|
|
753
|
+
const rowStart = pixelOffset + fileRow * stride;
|
|
754
|
+
for (let x = 0; x < this.width; x += 1) {
|
|
755
|
+
const source = this.sourceOffset(x, srcY);
|
|
756
|
+
const target = rowStart + x * 4;
|
|
757
|
+
output[target] = this.pixelData[source + 1] ?? 0;
|
|
758
|
+
output[target + 1] = this.pixelData[source + 2] ?? 0;
|
|
759
|
+
output[target + 2] = this.pixelData[source + 3] ?? 0;
|
|
760
|
+
output[target + 3] = this.pixelData[source] ?? 255;
|
|
761
|
+
}
|
|
762
|
+
}
|
|
567
763
|
}
|
|
568
764
|
encode() {
|
|
569
|
-
const stride =
|
|
765
|
+
const stride = this.rowStride();
|
|
570
766
|
const imageSize = stride * this.height;
|
|
571
|
-
const
|
|
767
|
+
const paletteSize = this.palette.length * 4;
|
|
768
|
+
const offset = FILE_HEADER_SIZE2 + INFO_HEADER_SIZE + paletteSize;
|
|
572
769
|
const totalSize = offset + imageSize;
|
|
573
770
|
const output = new Uint8Array(totalSize);
|
|
574
771
|
const view = new DataView(output.buffer, output.byteOffset, output.byteLength);
|
|
@@ -582,23 +779,35 @@ var BmpEncoder = class {
|
|
|
582
779
|
const signedHeight = this.options.orientation === "top-down" ? -this.height : this.height;
|
|
583
780
|
view.setInt32(22, signedHeight, true);
|
|
584
781
|
view.setUint16(26, 1, true);
|
|
585
|
-
view.setUint16(28,
|
|
782
|
+
view.setUint16(28, this.options.bitPP, true);
|
|
586
783
|
view.setUint32(30, 0, true);
|
|
587
784
|
view.setUint32(34, imageSize, true);
|
|
588
785
|
view.setUint32(38, 0, true);
|
|
589
786
|
view.setUint32(42, 0, true);
|
|
590
|
-
view.setUint32(46,
|
|
787
|
+
view.setUint32(46, this.palette.length, true);
|
|
591
788
|
view.setUint32(50, 0, true);
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
789
|
+
if (this.palette.length > 0) {
|
|
790
|
+
this.writePalette(output, FILE_HEADER_SIZE2 + INFO_HEADER_SIZE);
|
|
791
|
+
}
|
|
792
|
+
switch (this.options.bitPP) {
|
|
793
|
+
case 1:
|
|
794
|
+
this.encode1Bit(output, offset, stride);
|
|
795
|
+
break;
|
|
796
|
+
case 4:
|
|
797
|
+
this.encode4Bit(output, offset, stride);
|
|
798
|
+
break;
|
|
799
|
+
case 8:
|
|
800
|
+
this.encode8Bit(output, offset, stride);
|
|
801
|
+
break;
|
|
802
|
+
case 16:
|
|
803
|
+
this.encode16Bit(output, view, offset, stride);
|
|
804
|
+
break;
|
|
805
|
+
case 24:
|
|
806
|
+
this.encode24Bit(output, offset, stride);
|
|
807
|
+
break;
|
|
808
|
+
case 32:
|
|
809
|
+
this.encode32Bit(output, offset, stride);
|
|
810
|
+
break;
|
|
602
811
|
}
|
|
603
812
|
return output;
|
|
604
813
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/binary.ts","../src/decoder.ts","../src/encoder.ts","../src/index.ts"],"sourcesContent":["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 { BmpImageData, EncodeOptions, EncodedBmp } from \"./types\";\n\nconst FILE_HEADER_SIZE = 14;\nconst INFO_HEADER_SIZE = 40;\nconst RGB_TRIPLE_SIZE = 3;\nconst BYTES_PER_PIXEL_ABGR = 4;\n\nfunction rowStride24(width: number): number {\n const raw = width * RGB_TRIPLE_SIZE;\n return (raw + 3) & ~3;\n}\n\nfunction normalizeEncodeOptions(\n qualityOrOptions?: number | EncodeOptions,\n): Required<EncodeOptions> {\n if (typeof qualityOrOptions === \"number\" || typeof qualityOrOptions === \"undefined\") {\n return {\n orientation: \"top-down\",\n bitPP: 24,\n };\n }\n\n return {\n orientation: qualityOrOptions.orientation ?? \"top-down\",\n bitPP: qualityOrOptions.bitPP ?? 24,\n };\n}\n\nclass BmpEncoder {\n private readonly pixelData: Uint8Array;\n private readonly width: number;\n private readonly height: number;\n private readonly options: Required<EncodeOptions>;\n\n constructor(imgData: BmpImageData, options: Required<EncodeOptions>) {\n this.pixelData = imgData.data;\n this.width = imgData.width;\n this.height = imgData.height;\n this.options = options;\n\n assertInteger(\"width\", this.width);\n assertInteger(\"height\", this.height);\n\n if (this.options.bitPP !== 24) {\n throw new Error(\n `Unsupported encode bit depth: ${this.options.bitPP}. Only 24-bit output is supported.`,\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\n encode(): Uint8Array {\n const stride = rowStride24(this.width);\n const imageSize = stride * this.height;\n const offset = FILE_HEADER_SIZE + INFO_HEADER_SIZE;\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, 24, 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, 0, true);\n view.setUint32(50, 0, true);\n\n for (let fileRow = 0; fileRow < this.height; fileRow += 1) {\n const srcY = this.options.orientation === \"top-down\" ? fileRow : this.height - 1 - fileRow;\n const rowStart = offset + fileRow * stride;\n\n for (let x = 0; x < this.width; x += 1) {\n const source = (srcY * this.width + x) * BYTES_PER_PIXEL_ABGR;\n const target = rowStart + x * RGB_TRIPLE_SIZE;\n\n output[target] = this.pixelData[source + 1] ?? 0; // B\n output[target + 1] = this.pixelData[source + 2] ?? 0; // G\n output[target + 2] = this.pixelData[source + 3] ?? 0; // R\n }\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 { encode } from \"./encoder\";\n\nexport type {\n BmpBinaryInput,\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":"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","names":["rgb","FILE_HEADER_SIZE"]}
|
|
1
|
+
{"version":3,"sources":["../src/binary.ts","../src/decoder.ts","../src/encoder.ts","../src/index.ts"],"sourcesContent":["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 { encode } from \"./encoder\";\n\nexport type {\n BmpBinaryInput,\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":"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","names":["rgb","FILE_HEADER_SIZE"]}
|