From b359f92251bf99da91bdd3be0f2c89e6b7d0fd6e Mon Sep 17 00:00:00 2001 From: Jeff Schiller Date: Tue, 16 Jan 2024 08:00:35 -0800 Subject: [PATCH] PngParser: Add unit test for PLTE chunk --- image/parsers/png.js | 8 +++++--- tests/image-parsers-png.spec.js | 15 ++++++++++++++- tests/image-testfiles/tbbn3p08.png | Bin 0 -> 1499 bytes 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 tests/image-testfiles/tbbn3p08.png diff --git a/image/parsers/png.js b/image/parsers/png.js index 615cc49..36883b7 100644 --- a/image/parsers/png.js +++ b/image/parsers/png.js @@ -14,6 +14,7 @@ import { ByteStream } from '../../io/bytestream.js'; // https://en.wikipedia.org/wiki/PNG#File_format // https://www.w3.org/TR/2003/REC-PNG-20031110 +let DEBUG = false; const SIG = new Uint8Array([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]); /** @enum {string} */ @@ -220,8 +221,9 @@ export class PngParser extends EventTarget { }); } + /** @type {PngPalette} */ const palette = { - paletteEntries, + entries: paletteEntries, }; this.dispatchEvent(new PngPaletteEvent(palette)); @@ -240,7 +242,7 @@ export class PngParser extends EventTarget { break; default: - console.log(`Found an unhandled chunk: ${chunk.chunkType}`); + if (DEBUG) console.log(`Found an unhandled chunk: ${chunk.chunkType}`); break; } } while (chunk.chunkType !== 'IEND'); @@ -295,4 +297,4 @@ async function main() { } } -main(); \ No newline at end of file +// main(); \ No newline at end of file diff --git a/tests/image-parsers-png.spec.js b/tests/image-parsers-png.spec.js index b4ae474..68714c4 100644 --- a/tests/image-parsers-png.spec.js +++ b/tests/image-parsers-png.spec.js @@ -2,10 +2,10 @@ import * as fs from 'node:fs'; import 'mocha'; import { expect } from 'chai'; import { PngColorType, PngInterlaceMethod, PngParser } from '../image/parsers/png.js'; -import { fail } from 'node:assert'; /** @typedef {import('../image/parsers/png.js').PngImageHeader} PngImageHeader */ /** @typedef {import('../image/parsers/png.js').PngImageData} PngImageData */ +/** @typedef {import('../image/parsers/png.js').PngPalette} PngPalette */ function getPngParser(fileName) { const nodeBuf = fs.readFileSync(fileName); @@ -47,6 +47,19 @@ describe('bitjs.image.parsers.PngParser', () => { }); }); + it('extracts PLTE', async () => { + /** @type {PngPalette} */ + let palette; + await getPngParser('tests/image-testfiles/tbbn3p08.png') + .onPalette(evt => palette = evt.palette) + .start(); + expect(palette.entries.length).equals(246); + const entry = palette.entries[1]; + expect(entry.red).equals(128); + expect(entry.green).equals(86); + expect(entry.blue).equals(86); + }); + it('extracts IDAT', async () => { /** @type {PngImageData} */ let data; diff --git a/tests/image-testfiles/tbbn3p08.png b/tests/image-testfiles/tbbn3p08.png new file mode 100644 index 0000000000000000000000000000000000000000..0ede3574db0fd51fa9266fb1cb91df3888dc8dbf GIT binary patch literal 1499 zcmWlXdpOg39LGN{C5sa2Bt0E^MASS96&*cI%O#g#Op9f6Tda`V#zwgtX^qWXhM`=# zI1#55hvk;s&XW|W)v?OmN^($fe!kE1{l1^if1mH`{bIW~+p3~=p#VVD-VW=Aq|W-? zq=3BGn;D%*C{i&_7?4X9nM~yR0LYKIIJ%!+TU)zIAT%^Qs*waT#qxC!3? zz50+^bb0-!+_LIFVlkOn3uCR$oXN=hfy)oYZM=LTO5_V)JX0F)aUb#`{Px3~8K z45Cm8G#cZ?2?d2q03|3C!N$f8gK>%=kzAFOs;a7HXJsOhsJOUTC=>!T78DfJ0p#W7 zO#|fS<`x6+csvb_-PzgMH*VaxejVY*&B(||Pfw37i%v;TNli^nPEKZQ-I|z~7@ruA z92Sce8ykD3^-OehbYx^?czAeNSXdrFNJvO(?(>_pT_EMw{BQ#m>$Sn!qg3OkVyw9#4k*05u5X^#Wxw8I%DBhvS=>0kTjoKsJnz zkHa;PN~LfWvNvv&lMD4H5CQz1ooNFD1Ml8_0AO}^ckkGN(bYw&Ct|UTmX?<3ckj?> zcNB^Yu-39J8}w6t>_9>;(#;tUCqEAdt`EKrw%G5dUucga(q-6VG498*{K%rij4wv2 zoEfW%jzHYO{1#TLQQ`9W=k@mzoI;b9QinWz_A0mp3_C3m`>c%tC$KR#Xus#^maPqG>$Ip&r<7PP}+lo3xrqrK0bX_;b9>)$CG zYiDOPWRFqn6UcGDpA~Oj9{Dz;6-NwxejzAm$n^KEA< zw~yjS7UP676`?(gNA_%Ti&?JTRiQ)ukN>niNvk-4K4Y-(eYokz+n%p00U^e=@{X9+ z)rI4_;#GQ*EM)A{+^B9WciOLZ)vuJAK75`z`)0L0X_*pJxWq7Myp(uq&jr<7|o zLnIyhWR@l$6GSYpXJsSmv@J23K`FjDRPrN<`4!1UJg1FhP}`#*W-iAZNy`g6qae