From 8da9ff24e4e720b1e80a027f09c419ac9503f896 Mon Sep 17 00:00:00 2001 From: Lucas CHOLLET Date: Sun, 7 May 2023 16:35:54 -0400 Subject: [PATCH] Tests: Add tests for 12 bits JPEGs In this commit, two tests are added, one with a `SOF1` image, the other with a `SOF2`. --- Tests/LibGfx/TestImageDecoder.cpp | 22 ++++++++++++++++++ .../LibGfx/test-inputs/12-bit-progressive.jpg | Bin 0 -> 12439 bytes Tests/LibGfx/test-inputs/12-bit.jpg | Bin 0 -> 12968 bytes 3 files changed, 22 insertions(+) create mode 100644 Tests/LibGfx/test-inputs/12-bit-progressive.jpg create mode 100644 Tests/LibGfx/test-inputs/12-bit.jpg diff --git a/Tests/LibGfx/TestImageDecoder.cpp b/Tests/LibGfx/TestImageDecoder.cpp index 9faaecaa2f..b3b711885b 100644 --- a/Tests/LibGfx/TestImageDecoder.cpp +++ b/Tests/LibGfx/TestImageDecoder.cpp @@ -156,6 +156,28 @@ TEST_CASE(test_jpeg_sof2_successive_aproximation) EXPECT_EQ(frame.image->size(), Gfx::IntSize(600, 800)); } +TEST_CASE(test_jpeg_sof1_12bits) +{ + auto file = MUST(Core::MappedFile::map(TEST_INPUT("12-bit.jpg"sv))); + EXPECT(Gfx::JPEGImageDecoderPlugin::sniff(file->bytes())); + auto plugin_decoder = MUST(Gfx::JPEGImageDecoderPlugin::create(file->bytes())); + EXPECT(plugin_decoder->initialize()); + + auto frame = MUST(plugin_decoder->frame(0)); + EXPECT_EQ(frame.image->size(), Gfx::IntSize(320, 240)); +} + +TEST_CASE(test_jpeg_sof2_12bits) +{ + auto file = MUST(Core::MappedFile::map(TEST_INPUT("12-bit-progressive.jpg"sv))); + EXPECT(Gfx::JPEGImageDecoderPlugin::sniff(file->bytes())); + auto plugin_decoder = MUST(Gfx::JPEGImageDecoderPlugin::create(file->bytes())); + EXPECT(plugin_decoder->initialize()); + + auto frame = MUST(plugin_decoder->frame(0)); + EXPECT_EQ(frame.image->size(), Gfx::IntSize(320, 240)); +} + TEST_CASE(test_pbm) { auto file = MUST(Core::MappedFile::map(TEST_INPUT("buggie-raw.pbm"sv))); diff --git a/Tests/LibGfx/test-inputs/12-bit-progressive.jpg b/Tests/LibGfx/test-inputs/12-bit-progressive.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a463f7b32c9b3c60c3432efa35f647a56e027166 GIT binary patch literal 12439 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 OJqQy0TYu#K|C<1o@6Ue# literal 0 HcmV?d00001 diff --git a/Tests/LibGfx/test-inputs/12-bit.jpg b/Tests/LibGfx/test-inputs/12-bit.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d7173d08e1ee9d5d5ab1e956ce4fb396bccf6a6c GIT binary patch literal 12968 zcmex=oIr{vTuz>0|Bo=pGcqzTvM@0-f-M0Poa`K2+$?NN%&Z`% zcnC5uGBYzVv$8UCa4>T+z$_AEW9Lvb

rYOym+)Dr^*)xKLEt$k?fP<0f;9px~sU z%?DMTOU2dAl1nCCeE9MIEe0NDMg}H9WwikSf}-Av z7+PhmIc3OX4$Cy`S-N`HCT2q*LqxVe zbljp`e`dv+?H(Im>z<$EekE&{b^i9(dE1&E#-5qJV4v2s>=euRnPJ^!s_U|AR@b^_ zbE_79OWyvcy}s+!uJnp6Zp&8u)?M{jW>RH3%b!iF|NSV-{ph)ITm9)<{~6pvF9jv5 z`Ip69>o+eia`D?Iul^%vt1)=)YRob)58=DXf_G?6;oi?z>4DB~wCz zL$)rzv$6F+z3UGTX4T5$(n~6mt0wpFb-(^dxHvMr;O@!neKR(B3;mRsm1fme7I>xP zWN5?#$4rHPtNs2nIC!-d2kqK?t~V-e>U{&_dYQW$S#LcJR5@nVHGP*xbKhUxOzYei z+eDtPy?RgOO1u1>lZVTt_k1n8qZuDAKkX&=tSnhYKKmIA{VSvPuTXjvT>Ng<<>+hf zCd=P^u-VviUh(eJi@7atJRgKR6`VcvZqDlM0h>SVJvVo%sVVE?dlsjx50r15V0fPS zyevcf1#b_93GM~%n@)V^vNN)p{;+sujb{I*_wx7IBp2^+RXud^+wo~XYZG=}{Qkzh zc>Av7Oj^7-yTYPg&5U$aOzE*?k&*L?{CckW@~m%%gO{7SN^7lnB^B}GNk*|p!NJ!T zehQw^R<&9Br{u$T$#;?x;X+~Y2|FHV%dVRH*+-SH*4HvadiVaKOYRr`Ognf=L7%fa z^2WU7_8-;ezt-FA>+N)F#lmIPC)sAcEjz&f+q>=le+H5LtEwt0u1}SEod06o*L0)D zJ03raKA9E%w*R5o#Y4x%cg@e&;e8iSe$<8cLr!t(0e*kMr*kTll(gK#Tk3>%o}DAvp1uBPNulNY&6mU74l*~`F0E8gvd+6;r!c{(Sm_0>AzePK?zGjz6dJ{WCe5TPa z?>TR`M@L8eXVBX?*QIh(PQ9@I=2|oBxhLOd*?4?Z_TO6aX2F7lX}ba^@VoUJZDM{C z_$F|7;m5L-S9fh&`o$`)_2K$z_v6-oA`U;jQl#)iE`hIT*(>&=F_+vp&%8P<$G<(% zGxy8o88Hd`D{d!me^eg$Zd3iC@*{o^AFh8BoqfpS*yH3)*TXz+@WyW1VR~`L1oM*o z!u!`Rh^=70{$hij&C!{e-75^!IFFc1v;MoUFm2kt`<7i1cR1`8U&&*8@Q!~+m~!Uh z`ofoaOpDf@nWXbMyv`kfmuqhG#{N9Jm={$q9;L3B z6I1lwI6tDE#WUJiaqVyCGm|$LnfLB~bMfUy`;#TMA0D~;=SI8g9KIjABgKv1@!5OT zGTUjfUDijBAGs8tdx<-3UhCcKS5I7S-%*<5{H^2j^Ye#~`YpCMH0L>C82{q)R{8ec z@R?7)cCx$uXE7(eRVU%~gEfi;{f zPN8c1tY7*0SH!H%h5qfges5m&r|iqWZp%LcmPfxnK5QRw!)v)@+T70q2`jP_bH4hm zte7>oq5sIoedqFz^ltm1opWhU-R01jXx4Z4-#simUb)=jt5&Z0@0-H=BDUmQ_g#1O zKSS=0LxnVq*Su`@U~sA2(fiCVxg-_ElR

KXy^b`Y+ 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 K^ryT3-vj_rJ2BA! literal 0 HcmV?d00001