From 72b738768b836cdaff9148f68c26da4954177c16 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 3 Mar 2022 08:58:39 +1100 Subject: [PATCH] Fixed reading 10-bit PGM --- Tests/images/10_bit_binary.pgm | Bin 0 -> 32822 bytes Tests/images/10_bit_binary_pgm.png | Bin 0 -> 17239 bytes Tests/test_file_ppm.py | 10 ++++++++++ src/PIL/PpmImagePlugin.py | 7 +++++-- src/libImaging/Unpack.c | 18 ++++++++++++++++++ 5 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 Tests/images/10_bit_binary.pgm create mode 100644 Tests/images/10_bit_binary_pgm.png diff --git a/Tests/images/10_bit_binary.pgm b/Tests/images/10_bit_binary.pgm new file mode 100644 index 0000000000000000000000000000000000000000..ab31266001e029d16e8e7a8ec3338b4ac8419c27 GIT binary patch literal 32822 zcmZvl2YeJ&_xEqHJfdR5f{GwjS_&l%2q6hcfRGR%l!V@U?;u4Gkd8{V#O|q z$YaIcup#!2Sh2s~-(1$<^Zs)`yE{8OJ3GJA&$(xA+BGg$Eobns{#7Q989Z)W{}EOC zOs>+R-^f1wtF#+5a@@$VgGP?JtxBV~gmQ@uQmXJMmzdC?VL8*wbTAD~e>2*QF?npy zV)Ws4EPHzMJl8BV6HQms-gGkE*_zJ&)@HnEZ}0Uh+#L6uTjJifZ}91Av%qAVC)^#j z5=XDGhkXOT!@uvJ_K*9${%(J0`jeRTa3f?WW z*G6Nmoo^RK`}%~(j#|dA-ff?> z2klGtHO4FU1$)5mV;qR^rU|$c8 zAM5_(9=F5YF7uIj-1auVus@IeZ@6`~x|v|I%mka}(tS1mgnz+58PP&}M3;5Y>joa%?Su9i@V~`)8wwoc-81%}>1j$#x)}ogfu;$ZodAwb zCf^J*qrg7}PS54h35n=zN;zsSk0OqrW#6!K%@1z9bx6cSXm+)^-L$n8-0kKFlpJQ} zK(7_%Ie(?U!#@W8nXU%sTxf1K*Yor zy|)?1{_CLIYwkgF40-9m_s4OzN$yAgrfY70cXycgkhWF)QZJigf3!#Jl~Ca!#=~Z- zZEmjt?L;J6581f(cNe7!6-!3T->L zit8T zWSf{hX0v(OPO%Tb(GA#zZOHhIVBK{B`4+pwZjJc9p3fx#8zLHryC;v;pgno4gqABf zlPGly60pbKZy$~{Khl2t44PgH*Tbnc203U0 zC%c&rHrMSj&!7`y&20GJ!OXCI+-|cL&Ub~16ZqD{zK1O|TiGf!{cU%@#ee0$_pMxA zf85>XX82G1PyV3WX>Kw1L4nD3Ct5!PJ=nul&j;g9Xt9mw9gIy#g6!Wqs3QtUCe|Sd z8+p~UbX{9|U2$SukA?&}S&uwzpA7zPCWWnWpzRJ##(}9j zK4DBG{{^Nc=sJRG9;n(xlqfa5ZELsAya6qGqv^|$nU=PV+i2EAXs_q2H<<_B$8Nc6 z&u3ljcm9aK+D-CX{mcG$|3&nC$hY)KeziZvJZZMNO8zuA1Pgr=GQOQ_-DU6Oc_-T% zTfiKo{Kg3X&Co+M2kG%NWuAB)y5vH@M-a}V&gfMNq}yxU^FhK7^O60F5&Gt}PYMj<;T z?3rf9+Ba8p><^N@T5Eszuh?yrcf=TeSc7vYy>T+cc5`4+w* z{y!A)|1oUc0KDK@uDHEv&KSy7big9sf*#1u_XdA&^g9bGWgx@DpwMvW(NfxBQ?T~W zgM2btF$X)))6R0UpxiuU;x2y%-v4jp{SSK^M~pP%T^0Acf6;GtY5rD!neXVUxjg^6 z@8^qbYi!0tW`+CM|A9{Yf>z|(KjHl&P~Zk^)ol9&)Q}9{f*!~oZsv9K3G_kw#eHdi zjQi_2Dj=7~kPOI%h9QdXvb#XF)YrBB(egAXkcEHhZR#W8YoWq$IC^bl4|;;U2|Vuy zMFv8%ZpcS}GuT#joA6=X(V5vCH_&vp^W1E(CfPK<$bSfmw~+MDZC5^U;EGfLch!x+fwrazcS&<9kS1Z;CA~c7GVcmy&udQBN~VT zo8aaxk+zrNmo*GDSj~~QM$#e=5a=Un8V{jAM!DJG!-j31^$)V*IXO( zIWqk`9DLi)c6YgZd^*R(^PP@nmA%^!@b%H~&p~+<>G%p7WxMOmCO*dp+k-^PKfwEg zNWrg>EQ}^<+lEivhb7yBG{~Oaz(bxu8ZJvOFAxw5XUrZ7{~ad~%Zn&}*uv0u41a$! z#+UQo@~f--*|r)y?g_R&W|4c-P6D~ScyA=W3#c#Q8Vj&~J)u#1_VzZvx*gUcIirYu z#`4|%_6|4HcLn(`{%JSaU4e)B63ys|HcjEI((kcu5JyNi{=hnX==Zp>eu&+IgiJ>U zKC#E#uh8fR?BIJ)=ta+a(97Fx2c>Wa8iXz37ZqaogB1*RP}^IO5NU*>N5zuDFH5=| z%G_h`Hw)ZFXzBs~kiX9@@MLMIww`7?=!j^N$;L_VN9 z_;0mmAqfLGZfJ!6T7SBK1XOG7S9XcHmzc7xNrH+^(5}g*r#suN^!5C5e=XYow*S(1 z@U6V{we3jI-_P0SapswJzT51FVI_WI{NfKdZ=VCh3S#(>1B7SkK+yJ>%!ha&NI=jD z$-9mUaik*2TO$050v@&xyW9O5&>tm7xyinSg`W=3o0(j*!MF3BY-gL{e(~uxBl45^ zWH@_WO{i1=qE2YSk8Uk-u<$S7G1~OC6Mc8ibte}8H4_KsI8&dfc0X}tf9&Tvdz@@= zi*N1bVfQ}s@4G*Ifxpu~WP6|iYtSPiUu^D8_||5wFQ0w{H8KNaJJV-&1fIyjb@OeAm3N}x1)XkCK*b4V|6JtH$p7XQF&JM$|kKBFcM>snjtV_&& zzN%jjm!9;iv1sEMg{B^M;WcdarSNC~GIEW1-mS6~k&R*4iXm`spzY}w;NPymYSuTo zaBB{+?|j#V@BeKR%nf#tJMK?+fBAej+)lSU+$Q&}Kh3Au#l(NVgTB72Z$^;=J-{!_ z;oWuqLH~fCXTJlnqJe-vX4CX8ruY9B{?!qcgg->UJGr6_oarC@aAiN4`Un11?6SoV z4u|?ZZ9U?X`^nq3_JXD-h7 z^+ViV^NO8iJ~j8drP$I*ZW>&C5Ib-?_U~Szn){JzQDHlekReIZCEvl@39sIX=Xdgr zJEL*;KU?>bYwSfX`Xhd4pSRn}NI3EJhl-W9K@W3z7O<{6#-(-aYOL*V(-9_W5P*Rkz>Ip%Svo zzvLacXd`0FSL|kg0a4QJ{!xFuuK}+&x(4oZU&H+by=o#8UCeFnC>54_%5uvwF5%Vv$DSoH@6>T08#XM{6 zWcP$0ORWC9-$T}ZE3v^0lS;%V{ysn^KgPX+t~`Y=eALac?ZI7w|DOT&95~;M(FR@5 zGBwec1U$occDs4m%yTdKi`{)L7wN8JezT3ulSIN7l0&DF6BPNr?o6AY>*Bl1?LzmL zyTeU!*O|Q_A4&Y(6dl@!B;SVTUJd_mgR}Bww?=qlxMkn9E$p&!;(ZLaFvqY*=)vC# zegD}vF@F=+j4}=Ieao=#%WX~g@-9;Fguj8SABCJeWGA@%w5gh_}IJ2 zfxopE5icBcN6nu|QVG9TmG8~PzqaHIb)anuHKHA0zA3VWyFe(pz9SkTLkgLap0ziI zzl`UB8bS~E!9N_ned+S?&XcfWEunKKey_Dz<YtV2|*}!HL_5QTp+FeUQ8nP(d}X{{Axewb?u-j-PIe(&?gwuggFc=sZN=*qAWP!fdz!1DXtKGKy=fdVlPI|}+;7Xi zX6Q`|&RUQ2iiQ*M8NjMdgO66RoR<}BsGQ~SMe)x=+hrj6;wI#tvq75_C{MF ztA7a3wmYJP@b5h_9^nXaJjVIw@TUwg%qDV~f-PUj+1qo)WBIKKX0@+sm+{%v)Giib zse8k_Y}44z^Sj;O!~|y%ttXnPF4Nw}w+i8PJUpty6*q)d^@t>Lz;HHFP!W_Z%&Blb z&0K(8Oask;D3@#l9a=`esVdB9Q!9!Ws)DpK=c;WSoKNC+8?pafsG(mu4l-qh57_&7 zJQnd)vK%a%c)XXr%5DQ4o*-}B&pzP~*mblh@f`WYtMEmc$tV!s1m9C5ja4pur(1+( zEM}i79{u_4cJM6A{^%#$re>vUVUNSF&aQ!d8BU2e4LGJgnqM9K37~Dsb{aHlWG)A7 zYjX;cT#fg&q3`89H%3+xIVO(1@ldHEnCr6D5)V?7*UQm|8X&)jZ(jv1v!H4+)zU{I zzCQ>)yg>v=ztU8FbRf{3cSLb~7c}?P5S zZu|NPPCoY!k5A^Zkc#iY2J9z`RLy%|BpcNJRR_fS2K)<%K6@fx#mJ`e`KiPvL(tY~ zWG}OzM^|uB0dQxUUy+1fylV-yh7#p}25(cjz7}|>Gp_`CpmR77^;IkFzK%3@zl)Hzhl9=!PUJnP=Jlc+Qm!jT$hX0LcOP{)BxKI=mjCf0gZ5BPt-#Cx$2@ zDwNSi6nQSxomd_wASg2pvPi)wSGcxX@`kI+#5hZ%#XBUDdAgM;=HP`_>8XJ}669eem6I>hJ^ zs1W(O=zFpN2Tly;K#Qeh0Pdzja-dEquD>r{~SVxClZNHAhy01?CH>W5OUB3jBVlm1hSgR95IZ~gg=|( zv*CUrQqm5O+#3#jh~zdv#})4+f;k>}uZ@N*x25DVgWL?a+TG~ZxsC2l_lVo;*19cj zyBp>@x?ZlG8|ntSQEs-|?Cxc3b1U6kH<8NG3OCjsx0A`lGw_G9kMYP`j>$&;Ut;d; zLw;F&|MbMr_J@o>1L2k?{QpDx@;b;h4%s6}`BZp17Acqq$J6<>{%CU>WWSU;$9Tph z@DIltHiZJ&*avyY{>Wt}@3P$~(cE_u$Q#4;+UTrie#Y4=-Dx1X(XDqg-BdD}PpN#L z=FcE@ddL0kFL&R%58co16Zf_Ii09+}Z1N57z9Bz)!aeM6;(J^9eu4efUc_%VhW3eE zLB1&l;p<>H1hxfBpYRPd7ZPo2MufC=LRGD zLz%xB2>NVne<|GUjOV`&&7BSfM&kcVkirxw(;mvG3fKz@G%{V7&-e?ej0b!0{F`j5 z{g2H@nrDLJ1$Vc5)IH^1bcftAf2yxQj(ZW+k8cShci;J|80S$1N%t*$WnY=^ z970wOxD7}{PuJakYe$%)XhL0VV<6if6TL9MUf9c{sGdUN3act z*$Name1aMu@%^vt5B3-LBU(NatUat@4zd93%2MS220)kbP(WiW8X;el$LDj|-xUkd z0tv{oZ({!w!Jm(ZJC9@OuR_!3A>o6;IhEIu=*M8t$MENZ zd=mTn@!A#|==<+2;ealfAKQIDvZT%48-{h~g%Y7|>qn&}4C)-PiXFG$i zH~b$O$-%%#1B%hXWGvkP-VG;T=#KsCM}_ZucQKZ)sW~0pS#N%__3&UHyZTtZ0dA37 z?0UNnV7kP4Y=0wH0tJ5Xr&B@r6;4;g8tinhx&3a4D<+cu&Yf;wbLT*bNgOxPb>Z6s zT#>uforfe}gbhwGd%Ly7NCpgxYZJkGWrF=}Y*=aa?>%n|lqY&57c?WOj# z(0xJul{sqL$oDk|@yflhI9u=ueWArTEJHphW&ehPzCZX&!P|*?*o&?Kda3BX6Pa>( zyxL9RsOWO(4O$BRMPR58rgM?wA}rxTIR1&-#*wFYHy=aEQ{nxm@cuXO{|sJ@ZEHM>LKzuk*M4 zo$*WHcl3G;>G{e2>8v}Iy8kk&yp!xSto$NV+g|PGx*_17K&7@HamXOBsuM>3UwqES zGPH&ovPEr~?|R$*!gfCK&RAP9s>D5PKZn!f;AwkT>bkp2xO&Yv>>_K~hg@%j-@EaF zuOkINVf!Bje=^rTm5!huHr{+fE$UnIiuv9gwUyAOk&JoN3)_&Pjk7h~h1AL5yF1^V z2AUYxV|W7<{%|DE#2SAecQ!;MaSG9jPLywc))Uax;$dq z@_5aauC;xG3%=52^P20|*d6@xz2-)907+xCRmPOu#bM zA>)4n>#S~<_Qdt7$mU^%4xu@%iFB`bXHk>Nr*=8g9H1-W34HYdto*I67C!4!bh%FGfECcZi(PGGV69t)e$?fApWv@vw42OMTOV)xIF|SZ^QA4s zmt0`uY-n?>npKB*Y%Y=aW_y;cWxEok&bEyhCH5P4mEGu0b!)&}8!7Ov9@k&tq;W3N ze+lDqhF&Z1KG5R)h%TbSX*^;S;xi)YhtYB6Ki#ou$>vtHa+Pn47SurV8YAgbk$^7f z;m<_R;!HJaB%R6s((r-J?Srl+M;yY=UqDUfCVP%e2mkNP7L=gTQ_Vfd^Q#<>HKWgQ zk@?jo+pg|1`?Z^o7yJq@mx51dfQ3JVe2=#IaQ!@6-R2F57ixj_EF6*T=a-_C0sIBhx_!4nvD_#4Pfc zd%$<8{fnp}$6Xishx?G&cr^75JohQ=FNY_*{2#P2)YV-WRrpN!HG)J08fm){qaxov z&z%kS60lD~%CE+|#hZ=H#iwBNWUt>uvIi68jwI$O1xJ5uQb(H!FPnnDfcU=|S99ES zvVD;K`gs4ln3r1Rnz>@?Gq)k_r=a_P+nFvAT_5Rc;TPkG>%Vb}>{z#kOdydigGEHj zdt587XEV{!e)k<2;CLigu~HY}zy8dz{9*TFGY7d!NY86%&0py4c~Btj1lkzt>R1E~ zy$=+K=|hY@qDIAt0-{1CBKKa%_B1rT6kKWMUZ=|S81UypnGCou8uZ1-7h?ma5#8R7 zH1~i~?eGp6aP(ZV<)hH-FXZ!PwEkA?^VRs|Ux-`MZMMAy4(ulL-%muC%#}Zk&r8C; zec)@630ERZI@7&Ho-mXv-pDNJ9d0^yvOIC)N}`ClL{e9~W=P2(@`Mg_=~!2lPtW1# zN?3rJAPt!HT<@gqK!MB9kQjDJfap>21O={iS0dl}*tbHe9HXgSq>>9Bfg;nP#}Mp7 zDX6Do8#>|%n&9P|aP)YNAHr5Lbjq`LyZ=C)hneU96pNfpWY!HY+>BrK@M)jD8oB-j zJ~oCP2i*DIG8?|mK1Y7|XO#IGU)|MltKFl%DxY+6ZLsc@@Em_~hD~^hY}dxMb&ZL7 zo^WH`6gvPkxYi3Q>6pk zRrhNtRzoT zxc>srJ$n+}-Q>SlBK?cu{`2I&Y2?9)KG`V(JVsVn-Z%Bf z9t6s6V2eYl)!izYFJ`+KUQdAA{n=LaJ(&zyvy#oBNFFvIKg$1Wng^-L%^+io=kA6< zWFNl~`xdyi)cW2e`&r=L@#oS9od@2teJVU1NBr|E_XcG7CcYvR7=~5&#a~WDd=6RR zH`s&ySb-&Eze8Pn`ym;j;f{e@$%vbSEd_MSsH&rBLVYs+h7scU2)`&%hF=m8>}9}@ z^dtY>;C6S=sAF09i@~S)SoOnpV5={m^yi2IFz1j1WfAwKApHZ##@k@|?&TcP&F_%d z60UWCeaY3qlAl4Gn&-~uUWP;Nd7sU_AkBRjpUM2WB?5kp-q0F!*kppgGTjc(*)QA< z>S2H2eJi-9LB5gdM=v~M0Uo~+l%)^Dz60Vcq`n3g;4+YC5qhp&XyxU`@Tv-55qo-J@kg_-PbB|iK(8M8#$ZoC|LYMGv;=!Jr(yG` z)#cOK@E@|>N749WZWh+>EwuGK52%7RD_0RV~Uk!{oW6u4azR8^rv9r!6p7e*o0i1A;q zv3HV?U>)oILx&nrkpYjpqUT}8M-{GII9-ay4~N65fc1wKrBFrlx@lOzM$mz}558{* z)R+&Smm|H;`|{ww5eXPYwd*Fbv;U&?4*i^fH9V6eUZn2XnL5q_Jl`lZ`!F@HMr0ec zk@{2prEVWl@K!S9DP(_txp_##ZYsy+iBxKWb0V2SJlzPLL0uJ%O6FBHma9&}FG^^L z8p;32L2ZtVjX30`=7~{Agm5p!dASlH%E~3`|AFlfqj!+%w zO0?h-YQaCbFNy1?+54c=%~*>^+>=zk`XT?-k$?(Nb*)>02P|=|L4P@CO+XUrJ9W+^ zM-&jJH3I(lfAH7+2fOGc{3mcnue`_J_e8!+k#==#B!RvdxmT5EXk_=gAq(pKZ;SM| zCi2UI_f2@;l-RdD-CA!_rAfqgok^{u6LLEhOLn_!f*(AL<|gv1v)lx#IJrD`q9!{S z>F$HQU&>Kmy7$1k7RqHJ`w8UyFH#qIh6?azswer3V(?!^G_aO448$+A;x&=#N&Q4N0ODega;fq?s`#dtcX=FF25yvDV!*NLI za5R3t%d(T~<=BAtm_vTs{6Ie4iP6+nBd$Kr<{>j9&1&MM^Y}(}zS#obKZi#*SB?Dm zTe9|9#8C-Rl#{@D>#!|P*ofywkxXbS1G-2)LL^un^uf{v^wNT$2Mw@IX)X;tFCw2^ z2!}hu*|U*?Ug&or`p^ztXvL#_ROwgLqk8}od33hd!sF}U>4Wfp2e^MEcI$xr-w5A2 zp}}{#mei(dVz0(<1v80dvx(s^B<@)bihg+YPR!y~WX|=7y%U~ia?Pdo8}22zm+a{; zWV;c397ddw&$mCr$J`GMcM}ULnyCqDAruGWIPzrtO`~^Zac~WJc}9&$4#Kl!0Nz7^ zBvAII=5hr4cWHz*9*Zy<{*T8FD8kQ2E;PSi#CAFqiZfIAh5sU*dl+{!OLYq~dEdCV zxz46;G?r^Car#&89z0hiB!3nXnMXeKDKi6Op~rZ%|61mCu0ty7Qx$SpwIpbk&he$p zM{gsSxSCq&&uG)F=&2qBU2JpKR7QH^1P$H7hD|)oS=C?xbsq=xq4Yi3>a}D>eJqFkJxErY4-VEC1 zNaZoS^+Ix?^7y$w-63C|Eaq}#aRm8&dw6z{9bi5|@_NJ3*?5Vo(ehiUjE%?M4aB|` z%R2Hdlj_nsbYd~I%R+w&qU`rGj@ru6+30?4xUaZ3^`+G6B+bFBDQeVrSypXZijQtvICDXueTqqdBvB*1AG;oWeC!< zoJWa^qyBpam4ffN;&x{YDke{V{C!1=a$mlKLF15#_~0x@==$1SYN6kwZK~vNquLwgnt9NIux0_7mOR- zdUXCpXtCV&^&Sf_(q4mI-+{eaVc()sKY(jpPToHXo449tM&;>TeBX7@ZUwQ>ZSH_S zoh(2ebRXKihq~4r*TWT3QLcmq$l!a^u`KySL{B0I6^SGUA{AATfh(bn@|&wb5KxQn zVN1`kJW$&;i5N75xLTAE#VDZIpuYQpJDB%HKEE#VeT>|tH@-iCxUUd>*PT$U@PN8A zy2RW^RC_L3xQki*EsWzx<#ue|P~`s)=Ib|7otPDM6&+@tx+RDQ;Kw()(ahJZ!#~u7 zzfGt?e?lDiF_JVDzur#SF21uCRnd4fKAx;;Ir2RlFSv+L&$3l)Rl6STUx2-q?~^vy z1*7mMfFVe|Q2$#N!n+uL(cpja6CwL^+)nF}_6B(R`cxdBKn@i9q!Ja?19>V|uqPc2 z*;IKKP@6k~l4mHp zBTa!1 zpaC(CI=VYD)WtZRKJeA{DXjUU*#GCi{|Yh9jZr-JE_Is=s8Oa-@B4zet1qbJuCo7y z+r!}Tf8Ac@=?>d*+!_C!Z3oIl)Jku)?Wt)~aYjapz(MW9RmE#2WAk1>$F{P6AagYh z?ReyV1wJqiTcG%@F0@D_)@j6R<0$G0(XXDf_)SGbAsQBS!U%D|m7FQ~LY+q*un-O1 zZhl7FyPDJO0`A>zLF`kAG!(#d#rC{@o6?Q;|ci|O#!hh=B{AwbR%|!Hn2^zhFvrM4Qbvxc<2>Wx8 zmkJ<#h|dQwPgcTAe;O6EcF?zhxbrVo&f&!(5e=8tR6bQ2ks5PAB@8v)Pu`yh!`j1JMPAo&gL$k5pdyR z>T)?`1=oUquCiV1eF=5((P+uL@O=TCP62D$N%Af1O?aG4fspmeI;!?_GX5X|@`ESE zfXI1AI6fF&li}L~t{nVR1gKHU5{Sb05AGiFsCtw ztamsXUkQ5jz<1W5W_XlYgeBO@I>_~@oT)i}p(!JU^C$*LVNa8P(IDi&!Y>V1oES#P z140}i{E~nCC-{WD8;=xbHoDonm}T$A-hu3Cgcm4)8dyeT`da2+XJP~6i0K|f26m$b z>ygpxuuG4*HRQXWkiT7m2B)}mfwN5NzbX z@yBAJ5EUr@&&2v?Q`gHT)@f-rVE;2TLlmLr*k|{G6$H^e}OByfH}@Dkn@pnO(|(WabBnRAc<$w3p&8|+`u zin_>Sh>pd7VVC}E$R83(BLAv+s=wzda~j$0B~YO={=YRe(5z1`9xw<0AdS8`nw`Db zCK1zK>oy<*OR???;s1l~8Y-agBh_CqBdpG%gSJ08Z3_OIE)Cq39sE*H*PNGQKo?#qHRIs&M%#Y(N6E$^m^I&)Fas@0A4y z3WV1z-U)kb1b^6wD-ixzCZH%l^jX%!4y3~8bZC*zKHcq}i9}Q<`dvUT zz|H9Ya(YB|;MuF7sW+12EF_-Y0>^eREBhHpU#B1BSE3trpd2uN7^L4GLblJ1BAZso zKq7js8I9M77=HJsQ~P znM4ZNV9I1<@Vl+ihJTNs1!d1Md)XKosu~p=C+Z-`cRRE^;8!&y13 z!0RHu)q=grXhIh6oAX^!NiSnR(#Jv(6e zTGIo1J+a(f^e?Oe`>aU*AEVDv`PgFgprzNW*GH@^a~sv~H{joI#JZia+C5EQszaNZ zG5x?6F+19iu?0D33MN%>&%m;MW`84&$wD?SW={MF)!{nCV*8m({Kn0v9@32Z$R|;x zlMdgzBMCyUs+lN}jvf48{JEShW)DS+42E;Ob&kKD zD;P{pJDhHqC1$_1b~1M%e86KBGpYS}r@J+mk~vOe<|yA*qep&`d7L@k3^x({S7D2n zVgpm5P#Rj@5!}-I*3mCZ3;xahEGUv2;g=ndCHPFZe^mc#gZwMf)!k`Luy*R| z%Omn@#MXG$WZ4PUT|95c{x34RPhu0gu$69xcesu?sv*CSvwlnm`y9>rBIWyC_2{0M zEA7kvJnUC{X!4_NL;SpusQ5#B9(P&46s-cahdAkH^Iy6>meDKqE?lob_uK3C5jfV4 zS(Hbj`IZ!VZ$={h1<<+*mM@pr)||B?$LQU^hwv*0h>d{1Db^=Q!2jYeK+cP>0=hdX z1^l`PLv{Xius%j+yn(R|&%YV|FNXi~xKC&Y&pYh|r2Kt1&X;$yxifi{o#@UWs`(CG zSV9h2*IbEjc*u4_PsqXWj%Uyr^(Eb7uaIB1=Qr{r$&;38*5xL8oN^c!+Z(ammtkGT zb9Y`gokq>EMy;&Swe)@vRb@V^vLbbYc82){Hyv65(@XAQ-V4E$YD#Q(-% z);(M;`L!-o{)fTmhp2=s2mcPbdUoRd=7WDeJlswf%$>Fzb)D^Qfj^hIxh2f?cSrMk z6Z<|&2GJ645|3|t&U}Y$%f&K$!dhp2k@!6NIPc@EL&-QYI5L6S!xXa}^w&Vcp&aof zy=I(Y%UJEI^YB@HQQxMGm;q{)hXySVWC7DG2y8IAa+9i(lDo z0ap@-u1V(G5D&j=&qZIi(2ceO$=m??``Nm|TtgHzgLg}ij1{a^lFW?kVk#eZ(DgTz z`sQckx3V3ziKNrbg>*S*nCGJ!?uG6Y?n3KCf6!vIy&`usPok>O6)KmKS8q3;LYEt$ zVkup8mGS&(*wrTXD{OKiwA7t789YYX%47lYcu(cZZIJ(t|KQJKOOK97hejdWvV$=j z*bKX=p=dzkgakm}ZgAoXxL%K6Xkfa3kBMaM@&B%#tWDA}%v7OoY59Q9vo|8p`NZX6hz;^Jhx>-lG`8d&OIok>z z@8;UBMpn0h_AcZ=_rs3E65PtZdGw#&Ub?WOek zHHIfu&Ba`udSa8J(U7yXG<8_}VJX}i!|!)<77wwMuBc69ymf68TOKd)HMNZvwk8qJ z3@ZNf(4hm&2vmlrzxaFna$5lR>p%fvkBeTVp;fU4qtVkeL+?LG6$_|eM4ckdBhF_d z3-S$Zk-T(Jx8aO!d7sVaxlp88Wcw5&%lf3l`<9?@Xr>XB?jft6O`UCpeVjENpN%wN zI~3T4e9vcIq%U%CKm6A{zRe;|Hw1HC*2d7ii;~cWTxmmIucW(aJJ)zAb&U4RF&w8t z^a45mJn$CM;dj2RV8=s^o>nSP)uaf0bNJ|vEqYV_Dcd19!zY|A8BdAwJ2MvgWaeGNE5ce|rdH{4Sy=@4bGqt}N@Xs)_VI*gv8`u3zzg6V6{YxG~TpB`z1D4Bs*X?{fzIc&o5-jp1t&xUxAy_o8RRd&zqqS5k;PWI#dPzup8r)m`lx+^5f{ z?d%{r$v65Z=`mLKbuDH=4w4sc#{+gn?t8MH(?j&hZlx0b0$X!f+2LB|4mWW}#w~uU zEyr0KpFm%aU#*Gk#c?f#M6Bw?&>B>kaHkmg&BGSxzIDyj3}LGm@p&$uq$lWAGsuSq znM6Q|Xh#Neuj+X`_-k`6W%(%}tYa2ZkNtr48b4P()0HFs*PXmVlonAz@j+v*AO#Af zMAs&|rLv_@8blPx;TuU%ps8UdkGqSs*4+eV|27c0s2}nZ^k5DaV1O-$^e@924#V@m z&en8$g)8RXgM)sXzsb*r!^u#z9%ogzd9Z(ygvR_Pci!-MDWfZPOLw9dBM0hT)7p%> zdrS3;L1vS^8Ea60AQAiDhLOX_WR7P5{NGDHe=R)^xls5tY)lfr zr*02b24so!UU_m#gtH;nrn~>*xmHm@a(WdM&5Y#Yh}SBQ53`C)F5EssRpU4On?=$) z+Noqa%`N?`cAy=FU0g||@CJInm-Vg=`E^d~4PMFb)r%xP;FoSS<=pB|&}x*$Jao6I z)*tE`jZ$oMS9sco=&~c9_u_S--GqN^0dnPQ0lg$ZS#SbpQ{v9Duw-+n5`WkH7)=30L>YkNJwI&V+- zL3Rc6fmgV*hy-`x_okcQz&-^UT#8+IoCs*1UxM8~%H20F`Q_$2&{yMp4fsVxK=S`u zNkW>ZEKPZf?#|Gfq}>^vqapn5u?D(pv6Sl23-6hJIV?Qv^g!ktfN4?2+z-P2{L}PzK3wzI0)SpG%8b`I~Qu6-?>_FxLrxWp}lNC@av^jpJ-_L4*Kd=(neZCUc zU6WtX9SPDm{i^Oh(;5^R@IN2)T8~!G#nI>xZK-27Xhks;(z--LdCg^CNAnc5_?Fmy zWk8{Srmm~QcNIycbM@Fcs?WQ49cRvm`l^Cy4GT$}{Fznr(5jf&S2(Sc32HQm8IZ6@=E@7pYY9Y?(HkFz4) zpZ+D*)=KB9Ld>5QQ9#`Z84O8)&`bK&mDP^zK!M_jBE^v&bY_1((xLvniCD$fpzKJ; zRv}t1{OX&jiI=E{cb9E1;;NHOrt4<42Gm7h*BTzpIDZD%<=LbIx*|om0jaD~Jl_lP zspyaba>=OlL>0As)6;!{1$>hA75_xCkGNcBhljITF({?`l7p`7?ZOc{rZaomf?WMt z6WK3K$g-b-U9)Blm~n{k+Z%{&WCJ8;neGxIzATVd<>)-Vtvpto(8>m~a9W2&*^P$c z0BOD~f_$`IQ^B1Bey#tLOl+BDKZLV;LH}K}n&&}y@9;{hWuHOS^n1KQE5DeP9^Z}D zy8N8yPuwzs1;0VEfA_~&5B4A{3tmr*H=e$T$wXMC<~!~; z{4T=&9dghGPL=Q|;LPnop+5UCl=%cZFYf0@LzsnJ+?UR@;-R6KD37bxRcM_lMR~-l z_HR(vBNozpQZ*>?7E%6%csp72Tp}LfSN4(_$$c`j_HDvR=*g?ex8|ey{oY+ z(pvco$%Cx8JlJ;f!aVZ(G$cT|(1T>VJ6Q)`{jJ6S!Y^MJ@Rvz|vM)vaWl|t*5dIkV zm8A#niw;zjZ5}be*TDnYn~}vP%&iaQng_$vG-B1p#2@w1&%NA<{<*6L`c6Fb|2D+^ zGW>;+y!Rre>xE@iY%MmB&5!%Lg;XinD>wy zPlY=l4bFgONJ+$hd0$oDggy-6RNg6lD5F3Of2h!eDn+1x@E4dRtQmMet4aQD7eSd! zB)$W7BNKcr@I8`kaSXcH0>6g3YbUs`6-IJ+)HBCoR4cV2lGgtnW6S$TSyiJo+nQIY!!P9%-O9!# zag{~La0}$W8kqZlJ)MfU{wF~fP!~klPsZQn1O+7jg-DH12b-t!NRop5$8_S46zgc6gJ9nS_XF33K2RXoKT#pZ z`5*T@3aP-)=^YlS5(p}X)U$dX#iGmO9kr`E-AR{C~{<1qsmAD|Qc&Ycf}m%`5`zGT;UCsRca4EdB=9m(|Y4 zqLo@@D3NPZj3>>{il|VAx{L}j{6Pj{`1LJW{~!gTfW|1!l!4yXVOt2>N3XiqY&{B2>i|H;9W%zLSI(#=#2z6itvkOG5$*yWbO1^hCaM6lYZfkd4Qn(k_SZq zsx0*5YP1$&Rj@Z;UlLKsHtu^W<(|Mcz8ZbRuua#5f%auVYcZs7f>kI6EGipJtuzwq+@@>WH0i!st7)LVDnr|!j3!ftoJee0ln%r32;+=di9zFxeJ>Aq&cWYq%x;F}~LW#~hkA}c0blI*aCoN~6Q(L8}xGu=xc^E@}m zj)yv;k)%I{Uo{7zKN-Jdv`p{IK8f)^c>S0MR9vV#=2{cysmHpNImnFpL{J}#;{D@L z;t{`={|%+6X9&M8+ZXs=hCk%{^8Z?SRK8#61FjhV#UbI3@jmchF^ptW$Yj@r{VKkh zNryq06?_=)zYzRdVNV&YaOgY2A-cuT$GpGj8;gI-J*#?O)d;n-KEApaB7YOdE8B z=H^tl6@GDFvq_3rlI^op#PgUXyq8W!@H5vZPp>+M;`W#qlP6TQPnKUJncoxTV_G1q z9%Mjt3;4tL^&2#$gNfKPA_;kR`MvR2pB+Ixy{ z_1{7y>jN07^!MT+t0&FZe5EMfj90~cx+Yl|$(ekGX5$p`N{)3Ms-LP-D|@cYj@qnU zfbB~s{#!--v(SyFTemLXQn!ipwTzQmt2du@n|tv|Eo37mq2A1lY$X1l4gNJzM5^_hRqIeyS3ZsW6>FKmb=6}`V@uN2oV~Ro>C-CJS8&E8 z_LQ1)uyCrEsrD1(U-DD{U2?!N$NtSK0Mh;ANWf1#AM_>M8?%=lh)}B(TFu=^>N`c& zLieI-wrdnu(2a-gQdX~80y%UtpX5N(0-PgSm4lu|7_hQ9%PPNp}VJ8hzw%Tdf+SLPm(TR@e=ku~9g z?vYF7xFX^wSxiw-_(LXC556heYiB0e2CVtfm;VQ(|NZh4m7bP#Q0-@pwPH|~5dU`J zSzR$&d078(QoUJiz^n+j4ewMDQfFc-zM%@GEK#+{2Wl<860W*2GNYAemB(uRU3q-n zvl}XP0l%`LX67lXkX@N6-GTR?=(=;o_1LRfJo!CYfe_P-Wgfo*Ra{;1E5uB#=w6-0 zoj-@@THZ_#>_yz6vXuX2kjh&3y(5~(@CONK#8vAqYeltFU3czv-wF3W_51ulX4qHR z_FQ>Cq`xWZ8z%2#DW7Ete!s1tPIwL9+y*qU_Ceasye-=i~M^PdNg(NTB@)KRx` zKD5v*j?m^3`PBoBI@uDUJ;J1!Ed3t`^(|b-oKO)Gu%52l8Lk#bg&J<~`(^lR(iM@6 z+kNddE3n)Bl-lW0$&@ z_@7TNL4$V099!+jbQsE~$?7!&r7|JqbKSwOIW4VDu9X+sAmiyKi$1zKtP*@N>j@>( zMN@+w%6NARpQ%2kdYM+@YX#?}rB&gi*5(xdwRWQ-0r_*y_SQ2!sQ$IW2CM|jb*yzI zOChVza|NjRZ{bgP^;o4pAB2Y9;A*SiL4Zs~1^S{1WzQPD}qmLMs%v z02j2OPLW9WOnpW&_nI|g_NcSlfHvwsmsJ6IP3bH6^#97PhqN)P0yobVbInbn=un<7#LANYB!2ZX{zp(-pUQPl#9!3mzO1A423+PVv!>}q z{sQ{gzd;s`Gk22BuWOxZ)!AeP70GH2PV=jUAnnZzTLsoT=>z>Pa)Z5tX3GCdk>D_I z(H_jb$q~Bos_d=^kC+eo{&tibj<)dM5kUPkJrn$QRpyPWGNVzQzM-F)KQ6ZC(oysu z<`nPbKCEB3_WD>0NulO%6g}&@^1xpT724X_=>I_QFQ?P^3_eLkS9H~?8irg!_|t5C z=U5GKmhbP{aVL&eHXTN{_986jHe~-PdL?eBhIl(wgkIEeG(R0AAmDETwUe-6s;v$; zy=-NF79H~g=!&c926J6S@JBVl=I~5bt~NcU7WyaMHrAH96wkeb zJFR}B|8%CEo6Wv)EQOzeK-hQ_%k* z+`TZvEu*(n9a~{eCuBh(14x4QuW;YquDk!jz=S}?HB4TL% zuNU2sVNLg70~IIhmlYEzQ_-_YbY(F|5B^`uH#BBWc8^GdOs@LZB%zATCG;EJ{)0J zM3lvr=D>6v?Lk{aXKEq%H{kyUp<(K03YBd6Fh#!NV>%ku7%tVv4$vP*rFt!0u^(f9 z+R?f5kbM*1&=i~432)NR)#E&}zZ$ZCilc>HL$ud_SLsaWd}Dh)=g@Dq!Zt+fC~;k~ zVZ{;Zj!1##e=@Lt57Hqwjeen2?k-Hg`|ij7R%hn)Te_~-v-(^m)*Q=^dg^lQh4_TO zSxK@nE4R%fLZ}V$&@Z4_q)d39!7u7w-W=%qAbn{gux9h9ITsM+H0OGnLW6Mq>a_|s zQx;Ji3U)y{l*(tdp@*D69v*13_`goyb1y+% zu16!5^=Z~e(S0YVpnQ3mdDXs;mfelrJB9yza=tU%Idja`ByW4sFJezOKJ9=8q;Qw; z1@?4%3M)w%>RX;_mR2cj2cj?oq$|;HX&y*(3oXq!I`fBcKhkxqV5$GX(VWakGzixp z?uJoRAkP@0|3CwII9Ukwe5m(DHZK!uR|0zseTaSZ+gY45c!MyXt&RfyKg7e>=MKn6 z8lOupRQXX44>p4Rs^v{HFWW1)W9eD^PaC=mNgh*uZ_0L}?1@i=Kg@Y5w-fT-@K^uIL=jZkki5wAN*^>@@L3MM#C^f2JI|z% zs_#fv)X~@lEz|sK7b?L^&F!Ghv!|MGs0r&ok#A+~kU#PF^y1p{knxqwAFjY#C^Jw7 zEgzc1ndWl!)%k^vpcnp(NcJRWnnhODKpzQOTS_c95Wl6`hyMGDBJ1G&0}g4hu3mKo zRT-5DDza8JPSw}u=uz>(HKydkXP!HVkD{=_(g&4Y^9Q~$#Ut6 zb&gQ~S67nOE!G{4s>|fszpz?MT}OKsG;4|^tM;WFQGG4yX;Y?@4`r&+hhK|NLslH) zWavt)Y0B}dnQ%b=^+3K(yjS&8BlL@@Ye{oY>fK4>NLhg-uB`)HQeQBV>c1%1}CZhCqirwg++#f_hrInrqOI7VOo`$7qgMH(-Cxrq$_`3&}dk|ELNo z3WVR!i?=o!f6*E&Es zRlY*EX0QQ@2m}652hx0iX5y7?>E2?^;1|Nv&OEErA&oQXo$`Qg$V2x?0!q2wiC|WL zgW{rV;k#%gs*K=$B1d&)PX<&78eW<0W*i~SQYNjLFwN_?;Tna%z%;aRZu0*FCR`wg literal 0 HcmV?d00001 diff --git a/Tests/images/10_bit_binary_pgm.png b/Tests/images/10_bit_binary_pgm.png new file mode 100644 index 0000000000000000000000000000000000000000..8d95da30d910d7116d62e7a2d021668190c22e40 GIT binary patch literal 17239 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 255: - if not mode == "L": + if mode != "L": raise ValueError(f"Too many colors for band: {token}") - if maxval < 2**16: + if maxval == 1023: + self.mode = "I" + rawmode = "I;10B" + elif maxval < 2**16: self.mode = "I" rawmode = "I;16B" else: diff --git a/src/libImaging/Unpack.c b/src/libImaging/Unpack.c index 4f9838fa8..694acb07b 100644 --- a/src/libImaging/Unpack.c +++ b/src/libImaging/Unpack.c @@ -1182,6 +1182,23 @@ unpackI12_I16(UINT8 *out, const UINT8 *in, int pixels) { } } +static void +unpackI10B(UINT8 *out, const UINT8 *in, int pixels) { + int i, pixel; + for (i = 0; i < pixels; i++) { + pixel = ((in[0] << 8) + in[1]) << 6; +#ifdef WORDS_BIGENDIAN + out[2] = pixel >> 8; + out[3] = pixel; +#else + out[0] = pixel; + out[1] = pixel >> 8; +#endif + in += 2; + out += 4; + } +} + static void copy1(UINT8 *out, const UINT8 *in, int pixels) { /* L, P */ @@ -1684,6 +1701,7 @@ static struct { {"I", "I", 32, copy4}, {"I", "I;8", 8, unpackI8}, {"I", "I;8S", 8, unpackI8S}, + {"I", "I;10B", 16, unpackI10B}, {"I", "I;16", 16, unpackI16}, {"I", "I;16S", 16, unpackI16S}, {"I", "I;16B", 16, unpackI16B},